복붙노트

[SQL] SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 확인합니까?

SQL

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

당신이 열 또는 MS SQL 서버 (I 버전 2005을 사용하고 있습니다)의 열 수에 인덱스를 만들 때 각 컬럼에 인덱스 중 하나를 오름차순 또는 내림차순을 할 수 있도록 지정할 수 있습니다. 나는 힘든 시간이 선택도 여기 왜 인식하지 못했습니다. 하는만큼 빨리 조회 어느 쪽이든 진 정렬 기법을하지 않을 사용하십니까? 그것은 내가 선택한 어떤 순서로 어떤 차이가 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.당신이 정렬 된 데이터가 아닌 개별 레코드를 많이 검색 할 때 정렬 순서는 중요하다.

    당신이 정렬 된 데이터가 아닌 개별 레코드를 많이 검색 할 때 정렬 순서는 중요하다.

    정렬 순서는 일반적으로 훨씬 덜 중요한 당신이 색인 무엇 열보다 (당신이 당신의 질문과 제안대로) (순서가 원하는 것을 반대 인 경우 시스템이 역으로 인덱스를 읽을 수 있습니다) 있습니다. 나는 인덱스에 포함 열을 고뇌 반면에 나는 거의 인덱스 정렬 순서 어떤 생각을하지 않습니다.

    @Quassnoi는 상관 않는 경우의 좋은 예를 제공합니다.

  4. from https://stackoverflow.com/questions/743858/sql-server-indexes-ascending-or-descending-what-difference-does-it-make by cc-by-sa and MIT license