2012-06-26 4 views
2

최근에 SELECT 쿼리에서 데이터를 정렬하는 패턴 (확실하지 않은 패턴이 될 수 있음)이 나타났습니다. 이 패턴은 데이터를 순서화하는 데있어 길고 비 선언적인 방법입니다. 패턴은 실제 테이블의 관련 데이터를 임시 테이블에 덤프 한 다음 임시 테이블의 필드에 orderby를 적용하는 것입니다. 내 생각에, 누군가가 그렇게하는 유일한 이유는 퍼포먼스 (나는 의심 스럽다)를 개선하는 것 뿐이며 다른 이점은 없다.SQL Server에서 데이터 정렬을 위해 임시 테이블 사용

예 : 사용자 테이블이 있다고 가정 해 봅시다. 표에는 수백만 개의 행이 포함될 수 있습니다. 우리는 첫 번째 이름이 'G'로 시작하고 이름순으로 정렬 된 모든 사용자를 검색하려고합니다. 이 시나리오에 대한 SQL 쿼리를 구현하는 자연과 더 선언적 방법은 다음과 같습니다

더 자연스럽고 선언 방법

SELECT * FROM Users 
WHERE NAME LIKE 'G%' 
ORDER BY Name 

자세한 정보 표시 방법

SELECT * INTO TempTable 
FROM Users 
WHERE NAME LIKE 'G%' 

SELECT * FROM TempTable 
ORDER BY Name 

그 맥락으로, 나는 몇 가지 질문이 있습니다.

  1. 첫 번째 이름 필드에 인덱스이없는 경우 두 가지 방법간에 성능 차이가 발생합니다. 그렇다면 어떤 것이 더 좋을까요.

  2. 색인이 첫 번째 필드에 있으면 두 가지 방법간에 성능 차이가 있습니까? 그렇다면 어떤 것이 더 좋을까요.

  3. SQL Server 최적화 프로그램이 두 가지 방법 모두에 대해 동일한 실행 계획을 생성해야합니까?

  4. 잠금/차단과 같은 다른 persective에서 장황한 방법으로 글을 쓸 때 어떤 이점이 있습니까?

미리 감사드립니다.

+0

부모 테이블에서 색인이 생성되지 않은 열을 정렬하려는 경우에만 표시됩니다. – Dimitri

+0

패턴을 본 문맥에서 두 가지 방법으로 테스트 했습니까? 다른 선택 항목에 사용되는 임시 테이블입니까? – Paparazzi

+0

@Blam : 나는 당신의 질문을 가지고 있지 않았다. 성능 비교를 수행하지 않았습니다. 방금 위의 SQL 문 (장황한 방법)을 보았고 질문이 나에게 다가왔다. 나는 성능 개선에 도움이 될 수 있다는 자신을 확신시킬 수 없었다. –

답변

1

Reguzlarly : 사람들이 어떻게 행동하는지 알지 못하는 사람들의 패턴.

가끔 : SQL Server에는 다른 방법으로는 해결할 수없는 문제가 있기 때문에 - 그렇다고 볼 수는 없습니다.

tmpddb 테이블이 완전히 채워지기 때문에 작업 속도가 느려지므로 그렇지 않은 경우 쿼리를보다 효율적으로 수행 할 수 있습니다.

마지막으로 나는 3 년 전과 같은 것을 보았습니다. 우리는 똑똑하고 tempdb의 테이블을 사용하지 않음으로써 빠른 속도로 그에게 3 번을 가지고)

답변 :

1 : 아니, 그것은 여전히 ​​분명, 테이블 스캔이 필요합니다.

2 : 가능한 경우 - 데이터 양에 따라 다르지만 인덱스에 의한 찾기는 이미 데이터가 순서대로 포함됩니다 (색인은 내용에 따라 정렬 됨).

3 : 아니오. 명백하게. 조회 계획 최적화는 명령.에 의한 명령입니다. 실행을 2로 줄이면 쿼리 최적화 프로그램은 조인을 첫 번째 문에 병합 할 수 없습니다.

4 : 쿼리 최적화 프로그램 문제 또는 참여할 수있는 테이블 수의 제한 - 퇴행성 사례가 아닌 경우 (기술적 의미에서 퇴보 됨 - 매우 단순함). BUY 많은 매스터 테이블에 가입해야한다면 중간 단계로 나아가는 것이 더 나을 것입니다.

+0

+1. 요약하면, 임시 테이블을 사용하여 단순한 시나리오 (예제에서 언급 한 시나리오)에서 데이터를 정렬해도 성능은 향상되지 않지만 반대로 성능이 저하 될 수 있습니다. 권리? –

+0

Noot 수도 있습니다. 순서에 관계없이 임시 테이블에 데이터를 구체화 한 다음 순서 - 쿼리 최적화 프로그램에서 어떤 식 으로든 선택 항목에 있음을 알 수 없으므로 데이터를 반환 할 수 없음을 의미합니다. 완료 될 수 있습니다. 아주 나쁜. – TomTom

0

제가 생각할 수있는 두 번째 접근 방식의 이점은 없습니다.

데이터가 미리 정렬되어 있으면 SQL Server는이 기능을 사용할 수 없으며 불필요한 차단 연산자와 추가 정렬을 계획에 추가합니다.

데이터를 미리 정렬하지 않은 경우 SQL Server는 메모리 또는 tempdb의 작업 테이블에서 정렬하고 명시적인 #temp 테이블을 추가하면 불필요한 추가 단계가 추가됩니다.

편집

나는 두 번째 방법은 ORDER BY 인해 SQL 서버의 존재가 하위 최적으로 밝혀졌다 다른 계획을 선택하는 경우 수 있습니다 명백한 혜택을 줄 수있는 하나의 경우를 가정합니다. 어떤 경우에는 통계를 개선하거나 원하지 않는 계획을 피하기 위해 힌트/쿼리 재 작성을 사용하여 다른 방법으로이를 해결할 것입니다.

0

on으로 주문하려는 필드가 인덱싱되지 않으면 모든 것을 임시 테이블에 넣고 인덱싱 한 다음 순서를 지정하면 더 빠를 수 있습니다. 확실하게 테스트해야합니다.

+1

인덱스를 만들려면 데이터를 정렬해야합니까? 어떤 경우에는 왜 귀찮게합니까? 그냥 정상적인 정렬 위에 추가 오버 헤드를 추가하는 것 같다. –