[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.이론적으로, 그들은 같은 계획을 사용하고 거의 동시에 실행됩니다.
이론적으로, 그들은 같은 계획을 사용하고 거의 동시에 실행됩니다.
실제로,
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.클러스터 된 인덱스가있는 경우 두 개의 쿼리 사이의 성능 차이는 거의 없다.
클러스터 된 인덱스가있는 경우 두 개의 쿼리 사이의 성능 차이는 거의 없다.
모두 쿼리 비용의 100 %를 부담합니다 클러스터 된 인덱스 스캔을 수행하기 때문입니다.
3 개 사업자의 인덱스 결과가없는 컬럼에있는 두 개의 쿼리를 수행하는 두 실행 계획에 사용된다.
상위 절은 정렬 연산자를 사용하고 최대 함수는 스트림 집계 연산자를 사용합니다.
인덱스가없는 경우, MAX () 함수는 더 나은 성능을 제공합니다.
개념의 증거는 발견 할 수 있고, 테스트 시나리오의 전체 연습은 여기에서 찾을 수 있습니다
실적 비교 MAX 대 최고 1 () 함수
-
==============================
3.모든 떨어져 타격을 - - 아무도 IDENT_CURRENT ( '표 1')를 언급하지 물론 그것은 단지 ID 열에서 작동하지만, 질문이였습니다의 ...
모든 떨어져 타격을 - - 아무도 IDENT_CURRENT ( '표 1')를 언급하지 물론 그것은 단지 ID 열에서 작동하지만, 질문이였습니다의 ...
-
==============================
4.그냥 실행 계획을 비교하고 (쿼리를 편집 할 때 Management Studio에서 Ctrl 키 + M) 당신은 볼 수 있습니다. 내 추측은이 쿼리가 동일하게 확대됨에 ID 열에서 (클러스터) 인덱스가 제공된다는 것입니다.
그냥 실행 계획을 비교하고 (쿼리를 편집 할 때 Management Studio에서 Ctrl 키 + M) 당신은 볼 수 있습니다. 내 추측은이 쿼리가 동일하게 확대됨에 ID 열에서 (클러스터) 인덱스가 제공된다는 것입니다.
그러나, 이것은 전체적으로 아주 나쁜 생각이다.
-
==============================
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.MAX는 일반적으로 빠르다.
MAX는 일반적으로 빠르다.
존재하는 경우 두 쿼리는 컬럼에 인덱스를 사용합니다.
인덱스 컬럼에 존재하지 않는 경우, TOP 1 쿼리 대신 느리게 만드는 스트림 집계의 테이블을 정렬하는 상위 N 정렬 연산자를 사용합니다.
MAX는 가독성을 제공합니다.
사이드 참고 : MAX가 인덱스 경우 실행 계획에 스트림 집계 연산자를 사용하면서 단 하나의 행 (실제 행 = 1)을 처리하는 것, 그것은 어떤 특정 비용이 없습니다. 당신은 하나의 일괄를 실행하여 쿼리를 비교하고 상대적 비용을 볼 수 있습니다. 인덱스의 경우, 두 쿼리는 50 %의 비용을 것입니다. 나는 7000에 대한 행이 테이블에 비 인덱스 케이스를 테스트 TOP 35 %를 소비 MAX에 비해 65 % 비용을 것입니다.
-
==============================
7.사례 1과 2의 경우 모두 클러스터 된 인덱스 스캔 반환하는 하나의 기록을 수행합니다. 두 쿼리 사이에 IO 차이가 없습니다.
사례 1과 2의 경우 모두 클러스터 된 인덱스 스캔 반환하는 하나의 기록을 수행합니다. 두 쿼리 사이에 IO 차이가 없습니다.
케이스 3, 4, 5, 6의 경우, 모두는 반환 단일 레코드 검색 인덱스를 수행합니다. 두 쿼리 사이에 IO 차이가 없습니다.
사례 7의 경우 모두 테이블 스캔을 수행합니다. 입출력 비용에는 차이가 없습니다.
요약 : 케이스 1-6 승리 만들어진! 당신이 케이스 (7)에 있다면, 당신은 이미 IO 관점에서 잃었습니다.
당신은 SQL의 쿼리 분석기를 사용하여 IO를 측정 할 수 있습니다. 쿼리하기 전에이 작업을 실행합니다.
SET STATISTICS IO ON
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
'SQL' 카테고리의 다른 글
[SQL] 독특하고 합 SQL 쿼리 (0) | 2020.07.10 |
---|---|
[SQL] SQL 테이블 별명을 때 왜 "있는 그대로"를 사용해야합니까? (0) | 2020.07.10 |
[SQL] 는 SQL CE를위한 프로파일 (0) | 2020.07.10 |
[SQL] 빈 반환 카운트 대신 0 (0) | 2020.07.10 |
[SQL] SQL Server의 테이블 TABLENAME을 만들보기 (0) | 2020.07.10 |