복붙노트

[SQL] SQL은 대 SQL 하위 쿼리 (성능)에 합류?

SQL

SQL은 대 SQL 하위 쿼리 (성능)에 합류?

나는 내가이 같은 쿼리 뭔가 가입이있는 경우 알고 싶은 -

Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id

이 같은 하위 쿼리 뭔가 -

Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept)

나는 성능을 고려하면 두 쿼리 중 어느 것이 더 빠른 이유는 것입니까?

내가 다른 이상을 선호해야 할 때 또한 시간이있다?

죄송이 너무 사소하고 전에 물어하지만 난 그것에 대해 혼란 스러워요합니다. 너희들이 나에게 내가 두 쿼리의 성능을 측정하는 데 사용해야하는 도구를 제안 할 수있는 경우 또한, 그것은 좋은 것입니다. 고마워요!

해결법

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

    1.난 당신이 동등성을 가지고 명시 적 가입 주로하기 때문에, 첫 번째 쿼리가 빠를 것으로 예상한다. SQL은 정상적으로는 절 "OR"(여기서, X = Y = Z (X) OR ... OR)에 의해 분리 WHERE 일련으로 평가 때문에 내 경험 IN은 매우 느린 연산자이다.

    난 당신이 동등성을 가지고 명시 적 가입 주로하기 때문에, 첫 번째 쿼리가 빠를 것으로 예상한다. SQL은 정상적으로는 절 "OR"(여기서, X = Y = Z (X) OR ... OR)에 의해 분리 WHERE 일련으로 평가 때문에 내 경험 IN은 매우 느린 연산자이다.

    모든 것을 SQL 불구과 마찬가지로, 귀하의 마일리지가 다를 수 있습니다. 속도는 다른 것들 사이 인덱스에 많은 (둘 다 ID 컬럼에 인덱스를해야합니까? 그 ... 많은 도움이 될 것입니다) 따라 달라집니다.

    유일한 방법은 빠른 성능 추적을 설정하는 것입니다 100 % 확신을 가지고 말씀 (IO 통계에 특히 유용합니다) 그들 모두를 실행합니다. 실행 사이에 캐시를 삭제해야합니다!

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

    2.글쎄, 난 그것이 "올드하지만 금"질문입니다 생각합니다. 대답은 "상황에 따라 다르다!". 공연은 너무 많은 바보라고하는 것 같은 섬세한 될 수 있습니다 : "항상 조인, 서브 쿼리를 사용하지 마십시오." 다음 링크에서, 당신은 내가 매우 도움이 될 발견 한 몇 가지 기본적인 모범 사례를 찾을 수 있습니다 :

    글쎄, 난 그것이 "올드하지만 금"질문입니다 생각합니다. 대답은 "상황에 따라 다르다!". 공연은 너무 많은 바보라고하는 것 같은 섬세한 될 수 있습니다 : "항상 조인, 서브 쿼리를 사용하지 마십시오." 다음 링크에서, 당신은 내가 매우 도움이 될 발견 한 몇 가지 기본적인 모범 사례를 찾을 수 있습니다 :

    나는 50000 개 요소와 테이블이, 내가 찾던 그 결과는 739 개 요소였다.

    내 쿼리는 처음이 있었다 :

    SELECT  p.id,
        p.fixedId,
        p.azienda_id,
        p.categoria_id,
        p.linea,
        p.tipo,
        p.nome
    FROM prodotto p
    WHERE p.azienda_id = 2699 AND p.anno = (
        SELECT MAX(p2.anno) 
        FROM prodotto p2 
        WHERE p2.fixedId = p.fixedId 
    )
    

    그리고 실행 7.9s했다.

    마지막에 내 질문이 있습니다 :

    SELECT  p.id,
        p.fixedId,
        p.azienda_id,
        p.categoria_id,
        p.linea,
        p.tipo,
        p.nome
    FROM prodotto p
    WHERE p.azienda_id = 2699 AND (p.fixedId, p.anno) IN
    (
        SELECT p2.fixedId, MAX(p2.anno)
        FROM prodotto p2
        WHERE p.azienda_id = p2.azienda_id
        GROUP BY p2.fixedId
    )
    

    그것은 0.0256s했다

    좋은 SQL, 좋아.

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

    3.는 SQL 서버를 해석하는 방법의 차이를 볼 수있는 실행 계획을보고 시작합니다. 또한 실제로 쿼리를 여러 번 실행하는 프로파일 러를 사용하고 differnce를 얻을 수 있습니다.

    는 SQL 서버를 해석하는 방법의 차이를 볼 수있는 실행 계획을보고 시작합니다. 또한 실제로 쿼리를 여러 번 실행하는 프로파일 러를 사용하고 differnce를 얻을 수 있습니다.

    당신이 상관 하위 쿼리를 사용할 때 나는이 대신 하위 쿼리의 조인 사용에 진짜 큰 성능 향상을 얻을 얻을 수있는, 그렇게 끔찍하게 다를 수 있습니다 기대하지 않을 것이다.

    종종 더 나은이 두 가지 중 하나보다하고 다음 NOT EXISTS가 아닌 왼쪽에있는 모든 레코드를 원하는 테이블을 조인 위치를 이야기하고 왼쪽은 종종 훨씬 더 나은 선택을 조인 존재한다.

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

    4.성능은 당신이에서 실행되는 데이터의 양을 기반으로 ...

    성능은 당신이에서 실행되는 데이터의 양을 기반으로 ...

    그것은 20K의 주위에 적은 데이터 인 경우. 더 나은 작품 가입하세요.

    데이터 IN 다음 같이 더 많은 100,000 + 인 경우 더 잘 작동합니다.

    당신은 다른 테이블에서 데이터를 필요로하지 않는 경우, IN은 좋은,하지만 존재에 대한 이동하는 것이 좋습니다.

    모든 I 시험이 CRITERIAS와 테이블은 적절한 인덱스를 가지고있다.

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

    5.성능은 동일해야합니다; 그것은 (그 주제에 좋은 자원이 존재) 올바른 인덱스를 가지고 당신의 테이블에 적용 클러스터링 훨씬 더 중요합니다.

    성능은 동일해야합니다; 그것은 (그 주제에 좋은 자원이 존재) 올바른 인덱스를 가지고 당신의 테이블에 적용 클러스터링 훨씬 더 중요합니다.

    (편집 업데이트 된 질문을 반영하기 위해)

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

    6.두 쿼리는 동일한 의미를하지 않을 수 있습니다. 직원이 한 개 이상의 부서에서 작동하는 경우 (에 대한 기업 I 작업에서 가능한, 일반적으로 인정 하듯이,이 테이블을 의미하는 것입니다 완전히 정상화되지 않음) 다음 첫 번째 쿼리는 두 번째 쿼리 반면 않을 것 중복 행을 반환합니다. 이 경우 쿼리가 해당하려면 DISTINCT 키워드는 성능에 영향을 미칠 수있는 SELECT 절에 추가되어야 할 것이다.

    두 쿼리는 동일한 의미를하지 않을 수 있습니다. 직원이 한 개 이상의 부서에서 작동하는 경우 (에 대한 기업 I 작업에서 가능한, 일반적으로 인정 하듯이,이 테이블을 의미하는 것입니다 완전히 정상화되지 않음) 다음 첫 번째 쿼리는 두 번째 쿼리 반면 않을 것 중복 행을 반환합니다. 이 경우 쿼리가 해당하려면 DISTINCT 키워드는 성능에 영향을 미칠 수있는 SELECT 절에 추가되어야 할 것이다.

    참고 테이블 엔티티 / 클래스 또는 개체 / 클래스 있지만 둘 사이의 관계를 모델링한다 상태 엄지 손가락의 디자인 룰이있다. 따라서, 당신이, OrgChart를 말, 세 번째 테이블을 만들고 직원과 부서 간의 관계를 모델링하는 것이 좋습니다.

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

    7.나는 이것이 이전 게시물입니다 알지만, 우리는 테라 바이트의 데이터를 약 10M + 기록과 이야기가있는 곳, 특히 요즘 매우 중요한 주제라고 생각합니다.

    나는 이것이 이전 게시물입니다 알지만, 우리는 테라 바이트의 데이터를 약 10M + 기록과 이야기가있는 곳, 특히 요즘 매우 중요한 주제라고 생각합니다.

    또한 다음과 같은 관측에 무게됩니다. 내 테이블 ([데이터]) 내 [고양이], 그리고 300에 대한 기록 테이블에 45M의 레코드에 대한 있습니다. 내가 얘기에 대해 나는 모든 쿼리에 대한 광범위한 색인이있다.

    예 1 고려 :

    UPDATE d set category = c.categoryname
    FROM [data] d
    JOIN [cats] c on c.id = d.catid
    

    비교 예 2 :

    UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
    FROM [data] d
    

    예 1 실행 23 분 걸렸다. 예 2는 약 5 분했다.

    그래서이 경우 그 하위 쿼리가 훨씬 빠릅니다 결론을 내릴 것입니다. 내 인덱스가 너무 정말 빨리 그래서 물론, (그게 전부가 아니 비트 바이트) I / O를 1기가바이트 @ / 초 내가 할 수있는 M.2 SSD 드라이브를 사용하고 있음을 유의하십시오. 이 당신의 상황에 너무 속도에 영향을 미칠 수 있도록

    자사의 일회성 데이터 정리하면, 아마 최고의 그냥 실행하고 마무리두고 있습니다. 나는 TOP (10000)를 사용하고 내가 큰 쿼리를 공격하기 전에 레코드의 수에 의해 곱 소요 시간을 참조하십시오.

    프로덕션 데이터베이스를 최적화하는 경우, 난 강력하게, 비동기 업데이트 기록에 사전 데이터 처리, 즉 사용 트리거 또는 작업 브로커을 제안 그래서 실시간 액세스를 검색 정적 데이터를하는 것입니다.

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

    8.당신은 사용 한는 목적 답을 얻기 위해 계획을 설명 할 수 있습니다.

    당신은 사용 한는 목적 답을 얻기 위해 계획을 설명 할 수 있습니다.

    문제를 들어, 아마 가장 빠르게 수행 할 필터 존재한다.

  9. from https://stackoverflow.com/questions/3856164/sql-joins-vs-sql-subqueries-performance by cc-by-sa and MIT license