SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 있습니까?
MS SQL Server(버전 2005 사용 중)에서 열 또는 열 수에 인덱스를 생성할 때 각 열의 인덱스를 오름차순 또는 내림차순으로 지정할 수 있습니다.이 선택이 왜 여기 있는지 이해가 안 가바이너리 정렬 기술을 사용하면 어느 쪽이든 룩업이 빠르지 않을까요?어떤 순서를 선택하든 무슨 차이가 있습니까?
이는 복합 인덱스와 함께 사용할 때 주로 문제가 됩니다.
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
에서는 순서값인 서 keeps 、 keeps keeps of of of of of of keeps of keeps of keeps 。col1
★★★★★★★★★★★★★★★★★★★★★★★★★★★
행의 입니다.pk
또한 각 값 범위 내에서 주문됩니다.col1
.
이것은 인덱스의 잎이 실제로 다음 날짜에 주문된다는 것을 의미합니다.(col1, pk)
및 쿼리 query: query: query:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
정렬할 필요가 없습니다.
인덱스를 다음과 같이 작성하는 경우:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
의 " " " " " "col1
만, 「」의은 「」입니다.pk
의 각 값 col1
오름차순으로 정렬됩니다.
즉, 다음 조회가 이루어집니다.
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
수 있다ix_mytable_col1_desc
에에에 by는 ix_mytable_col1
.
시시, 음음 a a a를 .CLUSTERED INDEX
테이블에는 항상 해당 테이블의 다른 인덱스의 후행 열이 있습니다.
진정한 단일 열 인덱스의 경우 쿼리 최적화 도구의 관점과 거의 차이가 없습니다.
테이블 정의의 경우
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
스캔을 병렬화할 수 있습니다.
그러나 논리적 단편화 측면에서 큰 차이를 보일 수 있습니다.인덱스가 내림차순 키로 작성되었지만 새 행에 오름차순 키 값이 추가된 경우 모든 페이지가 논리적인 순서가 어긋날 수 있습니다.이로 인해 테이블을 스캔할 때 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 %% )
정렬 순서는 개별 레코드가 아니라 정렬된 많은 데이터를 가져올 때 중요합니다.
(질문에서 제안했듯이) 일반적으로 정렬 순서는 인덱싱하는 열보다 훨씬 덜 중요합니다(순서가 원하는 것과 반대일 경우 시스템은 인덱스를 반대로 읽을 수 있습니다).나는 인덱스 정렬에 대해 거의 생각하지 않는 반면 인덱스에 포함된 컬럼에 대해 고민한다.
@Quassnoi는 그것이 언제 중요한지를 보여주는 좋은 예시를 제공한다.
언급URL : https://stackoverflow.com/questions/743858/sql-server-indexes-ascending-or-descending-what-difference-does-it-make
'programing' 카테고리의 다른 글
표에서 특정 열의 첫 번째 문자를 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
---|---|
두 날짜 사이의 날짜를 선택하는 SQL 쿼리 (0) | 2023.04.07 |
TEX란TIMAGE_ON [Primary]? (0) | 2023.04.07 |
String을 사용하는 이유포맷? (0) | 2023.04.07 |
변수를 할당할 때 SET vs SELECT? (0) | 2023.04.07 |