[SQL] SQL 수 (*) 성능
SQLSQL 수 (*) 성능
나는 20 수백만 행이 SQL 테이블 BookChapters 있습니다. 그것은 클러스터 된 기본 키 (bookChapterID)를 가지고 있으며, 다른 키 또는 인덱스를 가지지 않습니다. 그것은 다음과 같은 쿼리를 실행 밀리 초 소요
if (select count(*) from BookChapters) = 0
...
그러나, 내가 그렇게 좋아 변경할 때 십분 인수
if (select count(*) from BookChapters) = 1
...
또는
if (select count(*) from BookChapters) > 1
...
왜 그런 겁니까? 어떻게 빨리 실행 SELECT COUNT (*)를받을 수 있나요?
해결법
-
==============================
1.첫 번째 쿼리가 빠른 이유 미카엘 에릭손 감독은 좋은 설명 울부 짖는 소리가 있습니다 :
첫 번째 쿼리가 빠른 이유 미카엘 에릭손 감독은 좋은 설명 울부 짖는 소리가 있습니다 :
SQL 서버 최적화를 어 : 존재하는 경우 (BookChapters에서 *를 선택). 그래서 한 행의 존재를 찾는 대신 테이블의 모든에게 행을 계산 간다.
다른 두 쿼리의 경우, SQL Server는 다음과 같은 규칙을 사용합니다. SELECT의 COUNT 같은 쿼리 (*)를 수행하려면, SQL Server는 좁은 사용 행을 계산하는 인덱스를 비는 클러스터. 테이블은없는 경우 클러스터되지 않은 인덱스는 테이블을 스캔해야합니다.
테이블이 클러스터 된 인덱스가있는 경우 또한, 다음과 같은 쿼리를 사용하는 경우에도 빠르게 수를 얻을 수 있습니다 (빠른 행 수를 가져이 사이트에서 빌린를!)
--SQL Server 2005/2008 SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count] FROM sys.sysindexes i WITH (NOLOCK) WHERE i.indid in (0,1) ORDER BY i.rowcnt desc --SQL Server 2000 SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count] FROM sysindexes i (NOLOCK) WHERE i.indid in (0,1) ORDER BY i.rows desc
그것은를 sysindexes 시스템 테이블을 사용합니다. 여기에 SQL Server 2000을 찾을 수 있습니다 더 많은 정보를 원하시면, SQL 서버 2005, SQL 서버 2008, 2012 SQL 서버
여기에 너무 느리게 실행 내 SELECT COUNT (*) 왜 다른 링크는 무엇입니까? 또 다른 솔루션. 그것은 당신이 바로 테이블을 클릭하고 속성을 선택하면 마이크로 소프트가 신속하게 행의 수를 표시하기 위해 사용하는 방법을 보여줍니다.
select sum (spart.rows) from sys.partitions spart where spart.object_id = object_id(’YourTable’) and spart.index_id < 2
이 수익률이 매우 빠르게 더 당신이 얼마나 많은 테이블에 문제가 있음을 찾을 수 없습니다.
당신은 SQL 2000을 사용하는 경우 여전히 숫자를 얻기 위해 sysindexes의 테이블을 사용할 수 있습니다.
select max(ROWS) from sysindexes where id = object_id(’YourTable’)
이 숫자는 약간 SQL은 sysindexes의 테이블을 업데이트하는 빈도에 따라 해제 할 수 있지만 보통 corrent (또는 적어도 충분히 가까이에)입니다.
-
==============================
2.당신은 단지 행 카운트 알고 싶다면이 시도 :
당신은 단지 행 카운트 알고 싶다면이 시도 :
exec sp_spaceused [TABLE_NAME]
-
==============================
3.당신이 당신의 쿼리에 대한 실행 계획을보고있는 경우에 당신은 무슨 일이 일어나고 있는지 볼 것입니다.
당신이 당신의 쿼리에 대한 실행 계획을보고있는 경우에 당신은 무슨 일이 일어나고 있는지 볼 것입니다.
존재하는 경우 (선택 BookChapters에서 *)로 첫 번째 쿼리 (BookChapters에서 SELECT COUNT (*)를) = 0 경우는 동일 쿼리 최적화에 의해 인식됩니다. SQL 서버는 적어도 하나 개의 행이 존재하는 경우는 한 행의 존재를 찾는 대신 테이블의 모든에게 행을 계산 간다 있도록 표현식이 참 것을 알고있다.
다른 쿼리의 경우는 그 똑똑하고 true 또는 false로 표현 평가되면 결정하기 전에 테이블의 행 수를 계산 할 수 없습니다.
-
==============================
4.당신은 쿼리를 선택 카운트 BookChapterTable에서 (BookChapterId)을 고려 했습니까? -`BookChapterId 비 클러스터 인덱스입니다. 즉, 훨씬 더 빨리 실행해야합니다.
당신은 쿼리를 선택 카운트 BookChapterTable에서 (BookChapterId)을 고려 했습니까? -`BookChapterId 비 클러스터 인덱스입니다. 즉, 훨씬 더 빨리 실행해야합니다.
테이블이 사용되며 행이 비 클러스터형 인덱스에 대한 쿼리, 접근 방법에 따라 키 포인트가 될 수 있습니다 난 그냥 MDSN에서 몇 가지 포인트를했다 :
-
==============================
5.테이블이 하나 이상의 행이있는 경우, 감지해야하는 경우,이 시도 :
테이블이 하나 이상의 행이있는 경우, 감지해야하는 경우,이 시도 :
if (SELECT COUNT(*) FROM (SELECT TOP 2 * FROM BookChapters) AS b) > 1
from https://stackoverflow.com/questions/11130448/sql-count-performance by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 날짜 사이의 개월 (0) | 2020.04.25 |
---|---|
[SQL] 테이블의 한 열을 기준으로 중복 된 값을 제거 (0) | 2020.04.25 |
[SQL] 단일 쿼리에서 여러 개의 CTE (0) | 2020.04.25 |
[SQL] SQL 1 100에서 번호 목록을 생성하는 (0) | 2020.04.25 |
[SQL] SQL 서버에서 변수로 저장 프로 시저의 출력을 반환하는 방법 (0) | 2020.04.25 |