복붙노트

[SQL] 자동 증가 필드 : TOP 1 ID ORDER BY ID DESC 대 MAX (ID)

SQL

자동 증가 필드 : TOP 1 ID ORDER BY ID DESC 대 MAX (ID)

나는 필드에서 가장 높은 AutoIncremented 값을 찾고 싶어요. (그 내가 SCOPE_IDENTITY 등 @@ 사용할 수있는 삽입 후 인출되지 않는) 이 두 쿼리의 어느 빠르게 실행 또는 더 나은 성능을 제공한다. 이드 표에 대한 기본 키 및 자동 증가 필드입니다. 그리고이는 SQL Server 2005를위한 것입니다.

SELECT MAX(Id) FROM Table1

SELECT TOP 1 Id FROM Table1 ORDER BY Id DESC

[편집하다] 예,이 경우에는 ID가 나는 클러스터 된 인덱스를 정의되는 필드입니다. 인덱스는 어떤 ID DESC 경우 .. 그리고 네 성능이 경우 영향을받는 방법을 알고 좋은 것 1. ID는 클러스터 된 인덱스 + 기본 키입니다. 2. ID는 클러스터 된 인덱스가 아닌 기본 키입니다. 3. ID는 비 클러스터 인덱스 ASC + 기본 키입니다. 4. ID는 비 클러스터 인덱스 ASC가 아니라 기본 키입니다. 5. ID는 비 클러스터 인덱스 DESC + 기본 키입니다. 6. ID는 비 클러스터 인덱스 DESC가 아니라 기본 키입니다. 7. 아이디는 자동 증가입니다

그되지 키가 큰 순서는 희망!

해결법

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

    1.이론적으로, 그들은 같은 계획을 사용하고 거의 동시에 실행됩니다.

    이론적으로, 그들은 같은 계획을 사용하고 거의 동시에 실행됩니다.

    실제로,

    SELECT TOP 1 Id FROM Table1 ORDER BY Id DESC
    

    더 아마 PRIMARY KEY 인덱스를 사용합니다.

    당신이 ID와 함께 몇 가지 다른 열을 선택하기로 결정합니다 경우이 하나 더 확장이다.

    MAX ()에 실제 계획은 말한다 :

    SELECT <- AGGREGATE <- TOP <- CLUSTERED INDEX SCAN
    

    , TOP 1에 대한 계획은 말한다 동안 :

    SELECT <- TOP <- CLUSTERED INDEX SCAN
    

    , 난. 이자형. 골재는 생략한다.

    한 행이 있지만이 같은 집계 실제로, 여기에 아무것도하지 않습니다.

    P. S.으로 @Mehrdad Afshari와 @ 존 Sansom는 MAX가 약간 빠른 (의는 물론 최적화로하지 20 배 말한다) 인 비 인덱스 필드에 주목 :

    -- 18,874,368 rows
    
    SET LANGUAGE ENGLISH
    SET STATISTICS TIME ON
    SET STATISTICS IO ON
    PRINT 'MAX'
    SELECT MAX(id) FROM master
    PRINT 'TOP 1'
    SELECT TOP 1 id FROM master ORDER BY id DESC
    PRINT 'MAX'
    SELECT MAX(id) FROM master
    PRINT 'TOP 1'
    SELECT TOP 1 id FROM master ORDER BY id DESC
    PRINT 'MAX'
    SELECT MAX(id) FROM master
    PRINT 'TOP 1'
    SELECT TOP 1 id FROM master ORDER BY id DESC
    PRINT 'MAX'
    SELECT MAX(id) FROM master
    PRINT 'TOP 1'
    SELECT TOP 1 id FROM master ORDER BY id DESC
    PRINT 'MAX'
    SELECT MAX(id) FROM master
    PRINT 'TOP 1'
    SELECT TOP 1 id FROM master ORDER BY id DESC
    
    Changed language setting to us_english.
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    MAX
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 20 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 447, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 5452 ms,  elapsed time = 2766 ms.
    TOP 1
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 2, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 6813 ms,  elapsed time = 3449 ms.
    MAX
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 44, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 5359 ms,  elapsed time = 2714 ms.
    TOP 1
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 6766 ms,  elapsed time = 3379 ms.
    MAX
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 5406 ms,  elapsed time = 2726 ms.
    TOP 1
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 6780 ms,  elapsed time = 3415 ms.
    MAX
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 85, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 5392 ms,  elapsed time = 2709 ms.
    TOP 1
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 10, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 6766 ms,  elapsed time = 3387 ms.
    MAX
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 5374 ms,  elapsed time = 2708 ms.
    TOP 1
    
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 1 ms.
    
    (строк обработано: 1)
    Table 'master'. Scan count 3, logical reads 32655, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    SQL Server Execution Times:
       CPU time = 6797 ms,  elapsed time = 3494 ms.
    
  2. ==============================

    2.클러스터 된 인덱스가있는 경우 두 개의 쿼리 사이의 성능 차이는 거의 없다.

    클러스터 된 인덱스가있는 경우 두 개의 쿼리 사이의 성능 차이는 거의 없다.

    모두 쿼리 비용의 100 %를 부담합니다 클러스터 된 인덱스 스캔을 수행하기 때문입니다.

    3 개 사업자의 인덱스 결과가없는 컬럼에있는 두 개의 쿼리를 수행하는 두 실행 계획에 사용된다.

    상위 절은 정렬 연산자를 사용하고 최대 함수는 스트림 집계 연산자를 사용합니다.

    인덱스가없는 경우, MAX () 함수는 더 나은 성능을 제공합니다.

    개념의 증거는 발견 할 수 있고, 테스트 시나리오의 전체 연습은 여기에서 찾을 수 있습니다

    실적 비교 MAX 대 최고 1 () 함수

  3. ==============================

    3.모든 떨어져 타격을 - - 아무도 IDENT_CURRENT ( '표 1')를 언급하지 물론 그것은 단지 ID 열에서 작동하지만, 질문이였습니다의 ...

    모든 떨어져 타격을 - - 아무도 IDENT_CURRENT ( '표 1')를 언급하지 물론 그것은 단지 ID 열에서 작동하지만, 질문이였습니다의 ...

  4. ==============================

    4.그냥 실행 계획을 비교하고 (쿼리를 편집 할 때 Management Studio에서 Ctrl 키 + M) 당신은 볼 수 있습니다. 내 추측은이 쿼리가 동일하게 확대됨에 ID 열에서 (클러스터) 인덱스가 제공된다는 것입니다.

    그냥 실행 계획을 비교하고 (쿼리를 편집 할 때 Management Studio에서 Ctrl 키 + M) 당신은 볼 수 있습니다. 내 추측은이 쿼리가 동일하게 확대됨에 ID 열에서 (클러스터) 인덱스가 제공된다는 것입니다.

    그러나, 이것은 전체적으로 아주 나쁜 생각이다.

  5. ==============================

    5.난 그냥 당신이 일반적인 데이터 세트에 제공되는 두 개의 SQL 문을 테스트했습니다 :

    난 그냥 당신이 일반적인 데이터 세트에 제공되는 두 개의 SQL 문을 테스트했습니다 :

    SELECT MAX(Id) FROM Table1
    
    SELECT TOP 1 Id FROM Table1 ORDER BY Id DESC
    

    이 실행 계획의 마지막 단계를 가지고 있기 때문에 SELECT TOP 1 아이디 표 ORDER FROM BY 아이디 DESC 빨리 변두리에있다. 다음은 각 쿼리가 수행하는 실행 계획은 다음과 같습니다 :

    표 FROM SELECT MAX (ID)

    클러스터 된 인덱스 스캔 >> 톱 페이지 >> 스트림 집계 >> 선택

    표 ORDER BY 아이디 DESC FROM SELECT TOP 1 아이디

    클러스터 된 인덱스 스캔 >> 톱 페이지 >> 선택

  6. ==============================

    6.MAX는 일반적으로 빠르다.

    MAX는 일반적으로 빠르다.

    존재하는 경우 두 쿼리는 컬럼에 인덱스를 사용합니다.

    인덱스 컬럼에 존재하지 않는 경우, TOP 1 쿼리 대신 느리게 만드는 스트림 집계의 테이블을 정렬하는 상위 N 정렬 연산자를 사용합니다.

    MAX는 가독성을 제공합니다.

    사이드 참고 : MAX가 인덱스 경우 실행 계획에 스트림 집계 연산자를 사용하면서 단 하나의 행 (실제 행 = 1)을 처리하는 것, 그것은 어떤 특정 비용이 없습니다. 당신은 하나의 일괄를 실행하여 쿼리를 비교하고 상대적 비용을 볼 수 있습니다. 인덱스의 경우, 두 쿼리는 50 %의 비용을 것입니다. 나는 7000에 대한 행이 테이블에 비 인덱스 케이스를 테스트 TOP 35 %를 소비 MAX에 비해 65 % 비용을 것입니다.

  7. ==============================

    7.사례 1과 2의 경우 모두 클러스터 된 인덱스 스캔 반환하는 하나의 기록을 수행합니다. 두 쿼리 사이에 IO 차이가 없습니다.

    사례 1과 2의 경우 모두 클러스터 된 인덱스 스캔 반환하는 하나의 기록을 수행합니다. 두 쿼리 사이에 IO 차이가 없습니다.

    케이스 3, 4, 5, 6의 경우, 모두는 반환 단일 레코드 검색 인덱스를 수행합니다. 두 쿼리 사이에 IO 차이가 없습니다.

    사례 7의 경우 모두 테이블 스캔을 수행합니다. 입출력 비용에는 차이가 없습니다.

    요약 : 케이스 1-6 승리 만들어진! 당신이 케이스 (7)에 있다면, 당신은 이미 IO 관점에서 잃었습니다.

    당신은 SQL의 쿼리 분석기를 사용하여 IO를 측정 할 수 있습니다. 쿼리하기 전에이 작업을 실행합니다.

    SET STATISTICS IO ON
    
  8. from https://stackoverflow.com/questions/590079/for-autoincrement-fields-maxid-vs-top-1-id-order-by-id-desc by cc-by-sa and MIT license