복붙노트

[SQL] SQL 수 (*) 성능

SQL

SQL 수 (*) 성능

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

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

    2.당신은 단지 행 카운트 알고 싶다면이 시도 :

    당신은 단지 행 카운트 알고 싶다면이 시도 :

    exec sp_spaceused [TABLE_NAME]
    
  3. ==============================

    3.당신이 당신의 쿼리에 대한 실행 계획을보고있는 경우에 당신은 무슨 일이 일어나고 있는지 볼 것입니다.

    당신이 당신의 쿼리에 대한 실행 계획을보고있는 경우에 당신은 무슨 일이 일어나고 있는지 볼 것입니다.

    존재하는 경우 (선택 BookChapters에서 *)로 첫 번째 쿼리 (BookChapters에서 SELECT COUNT (*)를) = 0 경우는 동일 쿼리 최적화에 의해 인식됩니다. SQL 서버는 적어도 하나 개의 행이 존재하는 경우는 한 행의 존재를 찾는 대신 테이블의 모든에게 행을 계산 간다 있도록 표현식이 참 것을 알고있다.

    다른 쿼리의 경우는 그 똑똑하고 true 또는 false로 표현 평가되면 결정하기 전에 테이블의 행 수를 계산 할 수 없습니다.

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

    4.당신은 쿼리를 선택 카운트 BookChapterTable에서 (BookChapterId)을 고려 했습니까? -`BookChapterId 비 클러스터 인덱스입니다. 즉, 훨씬 더 빨리 실행해야합니다.

    당신은 쿼리를 선택 카운트 BookChapterTable에서 (BookChapterId)을 고려 했습니까? -`BookChapterId 비 클러스터 인덱스입니다. 즉, 훨씬 더 빨리 실행해야합니다.

    테이블이 사용되며 행이 비 클러스터형 인덱스에 대한 쿼리, 접근 방법에 따라 키 포인트가 될 수 있습니다 난 그냥 MDSN에서 몇 가지 포인트를했다 :

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

    5.테이블이 하나 이상의 행이있는 경우, 감지해야하는 경우,이 시도 :

    테이블이 하나 이상의 행이있는 경우, 감지해야하는 경우,이 시도 :

    if (SELECT COUNT(*) FROM (SELECT TOP 2 * FROM BookChapters) AS b) > 1
    
  6. from https://stackoverflow.com/questions/11130448/sql-count-performance by cc-by-sa and MIT license