2016-11-04 6 views
0

약 80 개의 열이있는 테이블 "BigTable"이 있지만 업데이트 도중에 사용하게 될 "순위"열을 생성해야합니다. 지금 내 쿼리는 다음과 같습니다.조인 테이블의 열 개수가 중요하거나 성능에 영향을 줍니까?

UPDATE bt 
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField) 
          THEN bt.UpdateColumn + 0.01 
          ELSE bt.UpdateColumn 
         END 
FROM (SELECT bt.*,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt 
    INNER JOIN AnotherTable atbl 
     ON bt.Col1 = atbl.Col2 

내 코드를 이와 같이 변경하면 좋을까요? 파생 테이블의 열 개수가 조인 중에 중요합니까?

UPDATE bt 
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField) 
          THEN bt.UpdateColumn + 0.01 
          ELSE bt.UpdateColumn 
         END 
FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt 
    INNER JOIN AnotherTable atbl 
     ON bt.Col1 = atbl.Col2 
+0

성능 문제가 걱정되면 인덱스 추가가 도움이되는지 테스트하십시오. 인덱싱 된 필드에 가입하면 성능이 크게 향상됩니다. 당신이 참여하는 테이블의 수를 늘리면 필연적으로 검색 결과가 느려지 게됩니다. 이것이 바로 i.m.o입니다. 조인과 테이블 인덱스를 항상 최적화해야합니다. –

답변

0

하위 쿼리를 사용하면 전혀 차이가 없습니다.

SQL Server에는 좋은 최적화 도구가 있습니다. 최적화 프로그램이 수행하는 작업 중 하나는 페이지 데이터를 작업 메모리로로드하기 시작하자 마자 데이터 페이지에서 필요한 열을 선택하는 것입니다. 실제로 SQL Server는 을이 단계로 밀어 넣기도합니다.

이처럼 하위 쿼리를 넣지 않아도되는 이유는 없습니다.

+0

죄송합니다. 내 쿼리는 하위 쿼리가 아니라 파생 테이블입니다 (차이가 있습니까?). 또한 내 업데이트에서 순위 필드를 사용해야합니다. 그럴 경우 더 좋은 방법이 있을까요? – Prakazz

+0

@Prakazz. . . 그것들은 같은 것이다. 예, 정확히 같습니다. 옵티마이 저는 꽤 똑똑합니다. –

0

귀하의 요구 사항에 따라 귀하의 DB 디자인을 확인하십시오. 희망 사항을 올바르게 처리하기 바랍니다. 이 두 가지는 가장 기본적인 것입니다. 이 쿼리는 충분한 다음 "somecondition는"정확한 쿼리를 작성하는 것이 필요하다 알고 BTW 인덱스 등 를 만드는 생각할 수있는 빠른 경우

이보십시오.

UPDATE bt 
    SET bt.UpdateColumn = bt.UpdateColumn + 0.01      
    FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt 
     INNER JOIN AnotherTable atbl 
      ON bt.Col1 = atbl.Col2 
    where bt.RankField<=SomeCondition