programing

SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 있습니까?

bestprogram 2023. 4. 7. 22:01

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