문제

SQL Server 2008 쿼리가 있습니다

SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...

나는 또한 행의 총 수를 얻고 싶습니다. 비정상적인 방법은 두 번째 쿼리를 만드는 것입니다

SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...

효율적인 방법이 있습니까?

감사

도움이 되었습니까?

해결책

두 번째 쿼리를 원하십니까?

SELECT TOP 10
    *, foo.bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

또는

DECLARE @bar int
SELECT @bar = COUNT(*) AS bar FROM T WHERE ...
SELECT TOP 10
    *, @bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

또는 (편집 : 사용)

WITH cTotal AS
(
    SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
    *, cTotal .bar
FROM
    T
WHERE
    ...
ORDER BY
    ...

다른 팁

이 답변에있는 것은 작동하는 것 같습니다.

https://stackoverflow.com/a/19125458/16241

기본적으로 당신은 다음을 수행합니다.

SELECT top 100 YourColumns, TotalCount = Count(*) Over()
From YourTable
Where SomeValue = 32

TotalCount에는 총 행 수가 있습니다. 그래도 각 행에 나열되어 있습니다.

이것을 테스트했을 때 쿼리 계획은 테이블이 한 번만 치는 것으로 나타났습니다.

두 번째 쿼리에서도 순서 별 절을 제거하십시오.

아니.

SQL Server 유지하지 않습니다 COUNT(*) 메타 데이터와 같은 MyISAM, 그것은 매번 그것을 계산합니다.

업데이트: 견적이 필요한 경우 통계 메타 데이터를 사용할 수 있습니다.

SELECT  rows
FROM    dbo.sysindexes
WHERE   name = @primary_key,

어디 @primary_key 테이블의 기본 키 이름입니다.

이것은 반환합니다 COUNT(*) 마지막 통계 업데이트에서.

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top