1

У меня есть sproc, который я запускаю, я пытаюсь использовать разбивку на страницы, но также возвращаю все количество товаров. Это «работает», но проблема в том, что когда я вынимаю totalCount CTE и удаляю его из окончательного SELECT, мой sproc работает в ~ 50 мс. Когда я держу его там, мой запрос занимает 7-8 секунд. Это большой запрос, если я захвачу все записи, но идея состоит в том, чтобы захватить только нужную мне страницу, но мне нужно вернуть итоговые записи. Есть ли более эффективный способ сделать это?CTE Paging, с графом

/** ГЛАВНАЯ ПОИСК BLOCK **/

WITH search_results AS 
(

SELECT DISTINCT  
    ROW_NUMBER() OVER (ORDER BY @sortExpression) as rowNumber, 
      products.pid, 
      brands.bid, 
      brands.brand_name, 
      products.model, 
      products.name, 
      products.searchedprice 
      products.status 

FROM products WITH (NOLOCK) 
      JOIN brands WITH (NOLOCK) ON products.bid=brands.bid 

WHERE 
    (
      CONTAINS(products.*,@inflectionSearchText) 
      OR 
      CONTAINS(brands.Brand_Name,@inflectionSearchText) 
    ) 
    AND 
     products.productstatus=1 
    AND 
     brands.brandstatus=1 
    AND 
     products.searchedprice BETWEEN @fromprice TO @toprice 

), 
totalCount AS 
(SELECT COUNT(*) Total FROM search_results) 

SELECT * 
FROM search_results, totalCount 
WHERE 
    rowNumber BETWEEN ((@pageNumber-1)*@pageSize)+1 
     AND ((@pageNumber-1)*@pageSize)[email protected] 

ORDER BY products.model 
+2

отчетливую с row_number() и не группировка? Зачем? –

+0

Вы просмотрели план выполнения, особенно для этого последнего 'JOIN' между' search_results' и 'totalCount'? Можно было бы возвращать общее количество в параметре 'OUTPUT'? Он будет близок к 'Max (rowNumber)'? – HABO

ответ

2

Вы можете использовать следующий подход для получения счета без выполнения суб-выбора.

SELECT some_field, COUNT(*) OVER() AS total 
FROM some_table 

SQLFIDDLE

+0

Fiddle не загружается. – bcr

+0

@bcr Работает для меня? – plalx

Смежные вопросы