[SQL] SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 확인합니까?
SQLSQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 확인합니까?
당신이 열 또는 MS SQL 서버 (I 버전 2005을 사용하고 있습니다)의 열 수에 인덱스를 만들 때 각 컬럼에 인덱스 중 하나를 오름차순 또는 내림차순을 할 수 있도록 지정할 수 있습니다. 나는 힘든 시간이 선택도 여기 왜 인식하지 못했습니다. 하는만큼 빨리 조회 어느 쪽이든 진 정렬 기법을하지 않을 사용하십니까? 그것은 내가 선택한 어떤 순서로 어떤 차이가 있습니까?
해결법
-
==============================
1.복합 인덱스를 사용하는 경우에 주로 문제 :
복합 인덱스를 사용하는 경우에 주로 문제 :
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
중 하나를 사용할 수 있습니다 :
SELECT * FROM mytable ORDER BY col1, col2 DESC
또는:
SELECT * FROM mytable ORDER BY col1 DESC, col2
하지만하지 않는 :
SELECT * FROM mytable ORDER BY col1, col2
하나의 컬럼에 인덱스를 효율적으로 두 가지 방법으로 정렬 할 수 있습니다.
자세한 내용은 내 블로그에있는 문서를 참조하십시오 :
최신 정보:
그렇게 명확하지 비록 사실이, 심지어 단일 컬럼 인덱스에 문제가 있습니다.
클러스터 테이블의 컬럼에 인덱스를 상상해 :
CREATE TABLE mytable ( pk INT NOT NULL PRIMARY KEY, col1 INT NOT NULL ) CREATE INDEX ix_mytable_col1 ON mytable (col1)
COL1에 대한 인덱스는 행에 대한 참조와 함께 COL1의 값을 정렬 유지합니다.
테이블이 클러스터되어 있기 때문에, 행에 대한 참조 실제로 PK의 값입니다. 그들은 또한 COL1의 각 값 내에서 정렬됩니다.
인덱스의 잎이 실제로 (COL1, PK),이 쿼리에 정렬하는 것이이 방법 :
SELECT col1, pk FROM mytable ORDER BY col1, pk
더 정렬 필요가 없다.
우리는 다음과 같은 인덱스를 작성하는 경우 :
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
다음 COL1의 값을 내림차순으로 정렬 될 것이지만, COL1의 각 값 내 PK의 값이 오름차순으로 정렬 될 것이다.
다음 쿼리가이 수단 :
SELECT col1, pk FROM mytable ORDER BY col1, pk DESC
ix_mytable_col1에 의해 ix_mytable_col1_desc가 아니라 제공 할 수 있습니다.
즉, 모든 테이블에 클러스터 된 인덱스를 구성하는 열은 항상 테이블에 다른 인덱스의 후행 열입니다.
-
==============================
2.진정한 단일 컬럼 인덱스의 경우는 뷰의 쿼리 최적화의 관점에서 약간의 차이가 있습니다.
진정한 단일 컬럼 인덱스의 경우는 뷰의 쿼리 최적화의 관점에서 약간의 차이가 있습니다.
테이블 정의에 대한
CREATE TABLE T1( [ID] [int] IDENTITY NOT NULL, [Filler] [char](8000) NULL, PRIMARY KEY CLUSTERED ([ID] ASC))
쿼리
SELECT TOP 10 * FROM T1 ORDER BY ID DESC
용도는 BACKWARD로 실행 계획에서 볼 수있는 스캔 방향과 스캔 명령했다. 현재는 FORWARD 스캔 parallelised 할 수 있다는 점에서 그러나 약간의 차이가 있습니다.
그러나 논리적 조각의 측면에서 큰 차이를 만들 수 있습니다. 인덱스 키를 내림차순으로 만들어 지지만 새 행이 키 값을 오름차순으로 추가됩니다 경우에 당신은 논리적 순서에서 모든 페이지에 끝낼 수 있습니다. 이 심각하게 테이블을 스캔 할 때 IO의 크기가 읽기에 영향을 미칠 수 있으며 캐시에 없습니다.
분열의 결과보기
avg_fragmentation avg_fragment name page_count _in_percent fragment_count _size_in_pages ------ ------------ ------------------- ---------------- --------------- T1 1000 0.4 5 200 T2 1000 99.9 1000 1
아래의 스크립트
/*Uses T1 definition from above*/ SET NOCOUNT ON; CREATE TABLE T2( [ID] [int] IDENTITY NOT NULL, [Filler] [char](8000) NULL, PRIMARY KEY CLUSTERED ([ID] DESC)) BEGIN TRAN GO INSERT INTO T1 DEFAULT VALUES GO 1000 INSERT INTO T2 DEFAULT VALUES GO 1000 COMMIT SELECT object_name(object_id) AS name, page_count, avg_fragmentation_in_percent, fragment_count, avg_fragment_size_in_pages FROM sys.dm_db_index_physical_stats(db_id(), object_id('T1'), 1, NULL, 'DETAILED') WHERE index_level = 0 UNION ALL SELECT object_name(object_id) AS name, page_count, avg_fragmentation_in_percent, fragment_count, avg_fragment_size_in_pages FROM sys.dm_db_index_physical_stats(db_id(), object_id('T2'), 1, NULL, 'DETAILED') WHERE index_level = 0
그것은 나중에 페이지는 두 경우 모두 키 값을 상승 때문에이 있다는 추측을 확인하기 위해 공간 결과 탭을 사용하는 것이 가능하다.
SELECT page_id, [ID], geometry::Point(page_id, [ID], 0).STBuffer(4) FROM T1 CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% ) UNION ALL SELECT page_id, [ID], geometry::Point(page_id, [ID], 0).STBuffer(4) FROM T2 CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
-
==============================
3.당신이 정렬 된 데이터가 아닌 개별 레코드를 많이 검색 할 때 정렬 순서는 중요하다.
당신이 정렬 된 데이터가 아닌 개별 레코드를 많이 검색 할 때 정렬 순서는 중요하다.
정렬 순서는 일반적으로 훨씬 덜 중요한 당신이 색인 무엇 열보다 (당신이 당신의 질문과 제안대로) (순서가 원하는 것을 반대 인 경우 시스템이 역으로 인덱스를 읽을 수 있습니다) 있습니다. 나는 인덱스에 포함 열을 고뇌 반면에 나는 거의 인덱스 정렬 순서 어떤 생각을하지 않습니다.
@Quassnoi는 상관 않는 경우의 좋은 예를 제공합니다.
from https://stackoverflow.com/questions/743858/sql-server-indexes-ascending-or-descending-what-difference-does-it-make by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 열 필드에 두 행의 차이를 얻으려면? (0) | 2020.03.27 |
---|---|
[SQL] SELECT 문에서 "이전 행"값에 액세스 할 수있는 방법이 있나요? (0) | 2020.03.27 |
[SQL] 어떻게 Laravel 쿼리 빌더를 사용하여 하위 쿼리에서 선택? (0) | 2020.03.27 |
[SQL] 최대 절전 모드 연합 대안 (0) | 2020.03.27 |
[SQL] 어떻게 테이블에서 가장 큰 ID가 전체 행을 선택합니까? (0) | 2020.03.26 |