SQL Server 2008 извлечение выгружаемых строк и большие таблицы - PullRequest
2 голосов
/ 23 марта 2012

Я использую SQL Server 2008 и следующий запрос для реализации извлечения выгружаемых данных из нашего приложения JSF, в приведенном ниже коде я извлекаю 25 строк за время, отсортированное по столбцу сортировки по умолчанию в порядке DESC .

SELECT * FROM 
    (  
        SELECT TOP 25 * FROM 
        ( 
            SELECT TOP 25  ...... WHERE CONDITIONS 
            --ORDER BY ... DESC
        )AS INNERQUERY  ORDER BY INNERQUERY.... ASC
    ) 
AS OUTERQUERY 
ORDER BY OUTERQUERY.... DESC 

Работает, но с одним очевидным потоком.Если пользователи запрашивают просмотр последней страницы и в таблице содержится более 10 миллионов записей , тогда second TOP Query будет необходимо сначала retrieve the 10 million записей и только затем first top Query выберет Top 25, который будет выглядеть следующим образом:

SELECT * FROM 
    (  
        SELECT TOP 25 * FROM 
        ( 
            SELECT TOP 10000000  ...... WHERE CONDITIONS 
            --ORDER BY ... DESC
        )AS INNERQUERY  ORDER BY INNERQUERY.... ASC
    ) 
AS OUTERQUERY 
ORDER BY OUTERQUERY.... DESC 

Я пытался заменить вышеприведенное на ROW_NUMBER OVER (....), но, похоже, у меня возникла та же проблема, что и для второго оператора TOPдолжен получить полный результат, и только тогда вы сможете сделать where ROW_NUMBER between x and y.

Не могли бы вы указать на мои ошибки в вышеупомянутом подходе и намеки на то, как его можно оптимизировать?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2013

мы можем улучшить выше запрос немного больше.Если я предполагаю, что @current_index является номером текущей страницы, то мы можем переписать вышеуказанный запрос следующим образом:

WITH PAGED_QRY (
               SELECT top (@current_index * @rows_to_retrieve) *, ROW_NUMVER() 
                 OVER(ORDER BY Y) AS ROW_NO
               FROM TABLE WHERE ....
           ) 
 SELECT TOP @ROWS_TO_RETRIEVE FROM PAGED_QRY
 ORDER BY ROW_NO DESC

В этом случае наш внутренний запрос не вернет весь набор записей.Предположим, что наш page_index равен 3, а page_size равен 50, тогда он выберет только 150 строк (даже если наша таблица содержит сотни / тысячи / миллионы строк) и мы также можем пропустить предложение where.

0 голосов
/ 01 апреля 2012

В настоящее время я использую следующее для кодирования, чтобы получить подмножество строк:

WITH PAGED_QRY (
                   SELECT *, ROW_NUMVER() OVER(ORDER BY Y) AS ROW_NO
                   FROM TABLE WHERE ....
               ) 
SELECT * FROM PAGED_QRY WHERE ROW_NO BETWEEN @CURRENT_INDEX and @ ROWS_TO_RETRIEVE
ORDER BY ROW_NO

где @current_index и @rows_to_retrieve (т. Е. 1 и 50) - ваши переменные подкачки. это чище и легче для чтения.

Я также пытался использовать SET ROW_COUNT @ROWS_TO_RETRIEVE, но, похоже, ничего не изменилось.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...