복붙노트

[SQL] SQL의 성능은 사용 변종을 "EXISTS"

SQL

SQL의 성능은 사용 변종을 "EXISTS"

다음과 같은 세 가지 SQL 구문의 성능에 어떤 차이가 있나요?

SELECT * FROM tableA WHERE EXISTS (SELECT * FROM tableB WHERE tableA.x = tableB.y)

SELECT * FROM tableA WHERE EXISTS (SELECT y FROM tableB WHERE tableA.x = tableB.y)

SELECT * FROM tableA WHERE EXISTS (SELECT 1 FROM tableB WHERE tableA.x = tableB.y)

그들은 모두 일을하고 같은 결과 집합을 반환해야합니다. 그러나 내부 SELECT 선택하면 TableB의 모든 필드가 하나 개의 필드, 또는 단지 일정한 상관이야?

모든 문은 동일한 행동을 어떤 가장 좋은 방법은 있습니까?

해결법

  1. ==============================

    1.[정보] 진실이 절은이 EXISTS 절에 SELECT 절 평가되지 않는 것입니다 EXISTS - 당신은 시도 할 수 있습니다 :

    [정보] 진실이 절은이 EXISTS 절에 SELECT 절 평가되지 않는 것입니다 EXISTS - 당신은 시도 할 수 있습니다 :

    SELECT * 
      FROM tableA 
     WHERE EXISTS (SELECT 1/0 
                     FROM tableB 
                    WHERE tableA.x = tableB.y)
    

    ... 그리고 영으로 나누기 오류를 기대한다, 그러나 당신은 그것을 평가 아니에요하지 않기 때문. 내 습관이는 SELECT이 무시 될 수 있다는 것을 증명하기 위해 존재에 NULL을 지정하는 이유입니다 :

    SELECT * 
      FROM tableA 
     WHERE EXISTS (SELECT NULL
                     FROM tableB 
                    WHERE tableA.x = tableB.y)
    

    , GROUP BY, HAVING 등 -이 절은 FROM 및 조항 넘어입니다 EXISTS에 모든 문제

    이 질문은 마음에 데이터베이스가 표시되지 않은, 그리고 공급 업체 사물을 다르게 처리하기 때문에해야한다 - 시험 있도록하고, 확인에 대한 설명 / 실행 계획을 확인합니다. 행동이 버전 간의 변경 가능성이 있습니다 ...

  2. ==============================

    2.확실히 # 1. 그것은 무서운 "외모"하지만, 최적화를 실현은 옳은 일을하고 의도의 표현입니다 것입니다. 또한 THER 하나의 실수 EXISTS 생각하지만 IN을 입력해야 약간의 오타 보너스입니다. 2 허용하지만 표현이 아니다. 세 번째 옵션은 내 너무 겸손하지 의견 냄새. 그것은 너무 가까이 편안함을 위해 ''값이 '존재하지 않는 경우 "말을합니다.

    확실히 # 1. 그것은 무서운 "외모"하지만, 최적화를 실현은 옳은 일을하고 의도의 표현입니다 것입니다. 또한 THER 하나의 실수 EXISTS 생각하지만 IN을 입력해야 약간의 오타 보너스입니다. 2 허용하지만 표현이 아니다. 세 번째 옵션은 내 너무 겸손하지 의견 냄새. 그것은 너무 가까이 편안함을 위해 ''값이 '존재하지 않는 경우 "말을합니다.

    일반적으로 그것은 다른 혜택을 제공하고 실제로 성능에 영향을주지 않는 경우 mearly 비효율적 보이는 것을 쓰기 코드를 무서워하지하는 것이 중요합니다.

    즉, 최적화 프로그램은 거의 항상 복잡 가입 / 선택 / 간단한을 저장하는 마법을 그룹화하는 EXISTS / 하위 쿼리 같은 방법으로 실행합니다.

    교묘하게 그 불쾌한 또는에서 재 작성을 위해 자신에게 영예를 부여 한 후 결국 여전히 어쨌든 내장 OR로 훨씬 더 쉽게 이해하는 쿼리를 해결하기 위해 같은 엉터리 실행 계획을 사용 최적화를 실현합니다 가입 할 수 있습니다.

    이야기의 교훈은 당신의 플랫폼 최적화를 알고있다. 다른 일을 시도하고 만연 무릎 바보 가정에 대한 때문에 실제로 수행되고 있는지 볼 '장식'쿼리 최적화 거의 항상 내 경험에서 잘못된 무관하다.

  3. ==============================

    3.나는 이것이 이전 게시물입니다 실현,하지만 난 그게 중요한 다른 통해 하나의 형식을 선택할 수 있습니다 이유에 대해 선명도를 추가 할 생각.

    나는 이것이 이전 게시물입니다 실현,하지만 난 그게 중요한 다른 통해 하나의 형식을 선택할 수 있습니다 이유에 대해 선명도를 추가 할 생각.

    다른 사람들이 지적한 첫째, 데이터베이스 엔진은 선택 조항을 무시하기로한다. SQL 서버의 모든 버전이 /가 MySQL은 않는 등, 오라클은하지, 않습니다. 마이크로 소프트 액세스 : 데이터베이스 개발의 많은, 많은 달, 나는 오직 제대로 선택 조항을 무시하지 않은 하나의 DBMS가 발생했습니다. 특히, MS 액세스의 이전 버전 (I 현재 버전으로 말할 수 없다).

    이 "기능"내 발견하기 전에, 내가 1/0를 선택 (SELECT * ... 그러나, 나는 MS 액세스가 하위 쿼리에서 모든 열을 통해 스트리밍 할 것이라는 점을 발견 (존재 사용하는 데 사용하고 그들을 폐기도 작동하지 않을 것입니다 ). 나 심지어 하나의 DBMS가 바보 경우 1. 선택 스위치를 확신 즉, 다른 존재 할 수있다.

    쓰기는 (같은 풍부 그것은) '값이'존재하지 않는 경우 "이 말에 너무 가까이" "편안하게."주장 바보 솔직히이며 뭔가를하고 DBMS의 가능성을한다 (의도 전달에 분명하다 ... (1)을 선택 존재 선택 문 바보가 거의 불가능합니다. 선택 널은 동일한 목적을 제공하지만, 단순히 쓰기에 더 자입니다 것입니다.

    나는 많은 달 전, 그러나. 존재 (반드시 확인 DBMS 바보가되지 않을 수 있도록 선택 1로 전환하고, 오늘은 대부분의 개발자는 (선택 * 정확히 동일하게 작동합니다 존재하는보고 기대 기대.

    그게 내가 당신의 DBMS가 제대로 평가하는 경우에도 * (존재 피하는 선택을 하나의 좋은 이유를 제공 할 수있다. 당신이 그 사용의 모든 인스턴스를 건너가없는 경우 찾아 선택 *의 모든 사용을 격파하는 것이 훨씬 더 쉽다 절을 존재.

  4. ==============================

    4.적어도 SQL 서버에서,

    적어도 SQL 서버에서,

    디스크에서 읽을 수있는 데이터의 가장 작은 양의 디스크 공간이 하나의 "페이지"입니다. 곧 프로세서로는 중지 할 수 있습니다 만족 하위 쿼리 술어 것을 하나 개의 레코드를 읽습니다. 서브 쿼리는 자신의 IT가에 서 있었다 것처럼 실행 한 다음 외부 쿼리에 포함되지 않습니다, 그것은 모든 일의 전체 쿼리 계획의 일환으로 실행됩니다. 서브 쿼리로 사용할 때, 정말 선택 절에 무엇인지, 아무 것도 하나의 레코드가 발견 여부 있었는지의 여부를 나타내는 부울 제외하고, 어쨌든 외부 쿼리에 "반환되지 않습니다 중요하지 않습니다 ...

    세 명 모두 동일한 실행 계획을 사용

    나는 그것이 내가 서브 쿼리에서 반환 특히 뭔가를하고자하는 의미하지 않음으로써, 더 나은 읽고 생각하는 나는 항상 [에서 ... * 선택]를 사용하세요.

    편집 : 코스타 댓글이 ... 오라클은 모든 세 가지 옵션에 대해 동일한 실행 계획을 사용 데이브에서

  5. ==============================

    5.이 성전의 어떤 종류의 시작에 가깝다이 그 질문 중 하나입니다.

    이 성전의 어떤 종류의 시작에 가깝다이 그 질문 중 하나입니다.

    여기에 대해 상당히 좋은 토론이있다.

    나는 대답은 세 번째 옵션을 사용하는 아마 생각하지만, 그래서 그것을 미소하는 속도 증가가 정말 걱정 가치가 없어. 그것은 쉽게 모든 옵션은 동일 찾을 수 있도록 SQL 서버, 어쨌든 내부적으로 최적화 할 수있는 쿼리의 종류입니다.

  6. ==============================

    6.는 반환 가장 좋은 방법은 # 3를 사용하는 것입니다 말했다 부울 실제적인 데이터가 존재한다.

    는 반환 가장 좋은 방법은 # 3를 사용하는 것입니다 말했다 부울 실제적인 데이터가 존재한다.

  7. ==============================

    7.실행 계획. 그것을 알아보기, 사용, 그것을 사랑

    실행 계획. 그것을 알아보기, 사용, 그것을 사랑

    추측 할 수 방법은 정말 없다.

  8. ==============================

    8.다른 사람이 말한뿐만 아니라, SELECT (1) 사용의 관행이 된 마이크로 소프트 SQL 서버 (이전 2005)에 유래 - 자사의 쿼리 최적화 프로그램은 * SELECT의 테이블에서 물리적으로 가져 오는 필드를 피하기 위해 영리한 충분하지 않았다. 다른 DBMS, 내 지식이 결핍이 없습니다.

    다른 사람이 말한뿐만 아니라, SELECT (1) 사용의 관행이 된 마이크로 소프트 SQL 서버 (이전 2005)에 유래 - 자사의 쿼리 최적화 프로그램은 * SELECT의 테이블에서 물리적으로 가져 오는 필드를 피하기 위해 영리한 충분하지 않았다. 다른 DBMS, 내 지식이 결핍이 없습니다.

    그것이 정말없이 SELECT 목록에 무엇을하지 않습니다, 일부 최적화 특질과 비슷한 위보다 너무 다른, 그들 아니에요 무엇을 행의 존재 여부를 테스트 존재한다.

    선택 * 가장 일반적인 것 같다, 그러나 다른 사람이 아니라 허용됩니다.

  9. ==============================

    9.어쨌든 반환 된 데이터를 필요로하지는으로 # 3, 가장 좋은 것이어야한다. 필드를 가져 오는 것은 단지 여분의 오버 헤드를 추가합니다

    어쨌든 반환 된 데이터를 필요로하지는으로 # 3, 가장 좋은 것이어야한다. 필드를 가져 오는 것은 단지 여분의 오버 헤드를 추가합니다

  10. from https://stackoverflow.com/questions/424212/performance-of-sql-exists-usage-variants by cc-by-sa and MIT license

'SQL' 카테고리의 다른 글

[SQL] SQL 벌크 기록 업데이트  (0) 2020.06.27
[SQL] SQL LIKE %의 내부 어레이  (0) 2020.06.27
[SQL] DB2 데이터베이스에 여러 행을 삽입  (0) 2020.06.27
[SQL] SQL에 pyodbc 삽입  (0) 2020.06.27
[SQL] SQL 서버 수는 느린  (0) 2020.06.27