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 

Второй подход, с помощью КТР и крест присоединиться

;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 заканчивается? Тогда я думаю, что нет проблем с использованием первого подхода.

Предложения пожалуйста!

+0

не уверен, что я полностью понимаю вопрос, но разве аналитическая функция не будет работать для вас? 'COUNT (*) OVER()' – mcha

+0

@mcha Первоначально я использовал это только, но у меня много времени, и поэтому я переключился на CTE –

+0

, интересно ли вам добиться лучшей производительности с помощью других методов? – mcha

ответ

0

A Этот подход будет использовать COUNT с OVER:

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

Я изначально использовал 'count over', но это занимает намного больше времени, чем этот, мои оба подхода занимают около 1-2 секунд, когда я использую count над ним требуется 26 секунд –

0

Идея -1

sp_MSforeachtable 'sp_spaceused "?"' 

Идея -2

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

Идея -3

SELECT object_name(id), rows 
FROM sysindexes 
WHERE indid IN (0, 1) 
Смежные вопросы