2010-10-24 2 views
6

При запросе таблицы на сервере sql im пытается получить только текущую страницу записей. Однако мне нужно общее количество записей, которые будут возвращены конкретному запросу для вычисления количества страниц. Как сделать это эффективно, не записывая другой запрос для подсчета записей.Эффективный способ получения общего количества записей на сервере SQL во время пейджинга

WITH allentities 
     AS (SELECT Row_number() OVER (ORDER BY se.entityid ASC) AS 
        rowid 
        ,empid 
        ,lastname 
        ,firstname 
        ,d.depname 

      FROM emp e join dep d on e.depid=d.depid) 
    SELECT * 
    FROM allentities 
    WHERE rowid >= @pageid 
      AND rowid <= @pageid + 20 
+1

... но хорошая новость: вы можете это исправить! –

ответ

4

Если вы добавили вторую сортировку ROW_NUMBER()DESC, а не ASC, вы можете рассчитать общее количество записей, добавив два ряда строк вместе и вычитая их. Любая строка в наборе rsult будет иметь правильное общее количество строк:

WITH allentities 
     AS (SELECT Row_number() OVER (ORDER BY se.entityid ASC) AS 
        rowid 
        ,empid 
        ,lastname 
        ,firstname 
        ,d.depname 
        ,ROW_NUMBER() OVER (ORDER BY se.entityid DESC) AS rowIdNeg 
      FROM emp e join dep d on e.depid=d.depid) 
    SELECT * 
      ,rowid + rowIdNeg - 1 as totalRecords 
    FROM allentities 
    WHERE rowid >= @pageid 
      AND rowid <= @pageid + 20 
+0

Это потрясающе. Является ли это выгодным с точки зрения производительности по сравнению с моим предыдущим запросом? –

+0

@Sundararajan S - будет некоторая дополнительная стоимость для расчета второго «ROW_NUMBER», но насколько это во многом будет зависеть от расположения ваших данных и индексов. –

+0

awesome answer thnx – MonsterMMORPG

0

Если ваше приложение позволяет это сделать, вы можете попробовать установить и использовать индекс поиска для выполнения таких запросов. Индексы поиска имеют функциональные возможности для работы с пейджингом.

Вы можете использовать, например, http://lucene.apache.org/solr/. Он может быть настроен для индексирования SQL-сервера Sql.

+0

Нет. Я хочу сделать это с помощью только SQL-сервера и sql-запроса –

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