2009-06-16 2 views
6

MS SQL Server 데이터베이스에서 하나의 열에있는 다양한 다른 코드를 기반으로 트랜잭션 데이터를 가져옵니다.SQL CASE 대 JOIN 효율성

그것이 더 효율적으로 될 것이다 :

  • 전체 테이블에 여러 case 문을 WHERE A의 각 코드를 반복해서 같은 테이블에 가입

    (아래 그림 참조)
  • 은 전체 테이블에 여러 개의 case 문을하지만 WHERE SubsidCde IN ('AA','BA','BB', etc) 절하여 제한

초당 실행되는 쿼리가 너무 많아서 3 가지 방법을 모두 사용해도 결과가 확실하지 않습니다.

SELECT 
    SUM(CASE WHEN Subsid_Cde = 'AA' THEN Trans_Amt END),0) [AA], 
    SUM(CASE WHEN Subsid_Cde = 'BA' THEN Trans_Amt END),0) [BA], 
    SUM(CASE WHEN Subsid_Cde = 'BB' THEN Trans_Amt END),0) [BB] 
FROM 
    Transactions 

-- There are 8 more rows like this, using a different code for each line 
+0

참조 http://sqlblog.com/blogs/linchi_shea/archive/2011/04/04/performance-impact-the-cost-of-doing-small-lookups-in-a-large-batch.aspx –

답변

3

당신이 Subsid_Cde 필드의 가능한 모든 (또는 대부분의) 값을 합산하는 경우, 다음 CASE는 집계로 테이블을 여러 번 스캔하지 않으므로 빠르다 그 합계. 가능한 Subsid_Cde 필드의 작은 하위 집합 만 찾고 있다면 Selects/Joins (Subsid_Cde의 인덱스와 함께)가 더 빠르게 작동합니다.

실행 계획을 읽는 법을 배워야합니다. 그런 다음 스스로 계획을 세울 수 있습니다.

는 또한, 다른 방법으로, 당신은 PIVOT 절에 랩 Subsid_Cde에 GROUP BY를 할 수

1

사용이 :

SELECT (
     SELECT SUM(Trans_Amt) 
     FROM Transactions 
     WHERE Subsid_Cde = 'AA' 
     ) AS sum_aa, 
     (
     SELECT SUM(Trans_Amt) 
     FROM Transactions 
     WHERE Subsid_Cde = 'BB' 
     ) AS sum_bb 

, 외부 FROM 또는 WHERE 절없이. SQL Server 2005+에서

, 이것을 사용 :

SELECT [AA], [BB] 
FROM (
     SELECT trans_amt, subsid_cde 
     FROM transactions 
     ) q 
PIVOT (
     SUM(trans_amt) 
     FOR subsid_cde IN (['AA'], ['BB']) 
     ) 
2

3이 가장 좋은 건입니다 (PIVOT MS SQL 서버 2005 구글). 읽기 쉽고 나중에 수정하기 쉽습니다. 정의한 색인을 사용하고 있어야합니다 (여전히 확인하십시오).

--1 때때로 동일한 테이블에 가입해야합니다. 그러나 이것은 그들 중 하나가 아니며, 새로운 Subsid_Cde를 포함 할 필요가있을 때마다 합류하여 실제로 아무것도 얻지 않고도 읽기 어려운 SQL을 만듭니다.

- 2 트랜잭션 테이블은 매우 커지는 경향이 있으므로 전체 테이블을 스캔하려고하지 마십시오. 쿼리에서 사용하는 코드가 어쨌든 모든 행을 되돌려주지 않는 한, # 2는 분명히 나와 있습니다.