2016-06-16 2 views
0

총 레코드 수뿐만 아니라 레코드를 가져 오는 쿼리를 작성했습니다. 나는 마음에 두 가지 방법을 가지고 있지만 하나SQL - 총 레코드 수에 대한 더 나은 접근 방식

;with allRecords as 
(
    -- query fetching all the records with many joins 
), 
recordsCount as 
(
    select count(*) as RecordsCount from allRecords 
) 
select * from allRecords, recordsCount 

두 번째 방법, CTE 및 크로스를 사용하여

;with allRecords as 
(
    -- query fetching all the records with many joins 
) 
select *, c.totalRecords from allRecords 
cross join (select count(*) as totalRecords from allRecords) c 

I에 가입 여러 CTE의와

먼저 더 저렴 알아낼 수 없습니다 개인적으로 두 번째 접근법에서 아주 작은 성능을 느꼈습니다.

첫 번째 접근법에서는 두 번째 cte가 첫 번째 cte의 모든 레코드에 대해 매번 호출되거나 첫 번째 cte가 완료 될 때 한 번 실행됩니다. 그렇다면 첫 번째 접근법을 사용하는 데 문제가 없다고 생각합니다.

제안 사항!

+0

확실하지 않은 질문을 완전히 이해했지만 분석 기능이 효과가 없을까요? – mcha

+0

@mcha 처음에는 그만 사용했지만 시간이 많이 걸렸으므로 CTE의 –

+0

으로 재미 있고 다른 방법으로 더 나은 성능을 얻으려면 성공 했습니까? – mcha

답변

0

A 본 방법은 OVER으로 COUNT을 사용하는 것이다 :

SELECT *, COUNT(*) OVER() 
FROM --- rest of the query here 
+0

처음에는'count over'를 사용 했었지만이 방법보다 많은 시간이 걸렸습니다. 두 방식 모두 1-2 초 정도 걸립니다. 26 초 이상 걸린다. –

0

아이디어 -1

sp_MSforeachtable 'sp_spaceused "?"' 

아이디어 -2

sp_MSforeachtable 'select ''?'' Tablename, count(*) ''Rows'' from ?'; 

아이디어 -3