Oracle & Pagination

У меня есть таблица оракула с количеством записей 99896618.

Я должен выбрать маленький блок данных (позволяет, говорят, что 100 записей) для показа его на веб-странице, (В веб-мире мы называем это подкачкой страниц). В настоящее время я использую следующий запрос для выполнения этого однако, пользователи не удовлетворены производительностью.

SELECT * FROM (select rownum rnum,f.* from  findings f where rownum<90000100 ) 
                    WHERE rnum > 90000000 

В настоящее время 1 минуте требуются 22 секунды для получения результатов. Должен там так или иначе сделать его лучше. Я, конечно, открыт для любого типа предложений включая изменение структуры таблицы или как добавление индексов.

(Просто к вашему сведению я использую ASP.NET в качестве серверной веб-технологии и ADO.NET как уровень доступа к данным и Silverlight для клиентской презентации),

6
задан OMG Ponies 25 January 2010 в 17:15
поделиться

4 ответа

Ваш запрос должен будет рассчитывать на первые 90 м записей, чтобы получить следующую 100 , поэтому вряд ли есть комната для улучшения.

Я не вижу порядок с предложением в вашем подзапросе, но, вероятно, у вас есть. В этом случае вы можете захотеть создать индекс на нем.

И вопрос: действительно ли ваши пользователи нажимают на страницы 900k 900k страниц , прежде чем жаловаться на производительность?

Обновление:

Если вам нужна последняя страница, вам нужно переписать ваш заказ К столбцу в порядке убывания:

SELECT  *
FROM    (
        SELECT  rownum rnum, f.*
        FROM    findings f
        ORDER BY
                record_ordering_column DESC
        ) 
WHERE   rnum > 900
        AND rownum <= 100

и создать индекс на Record_ordering_Column

Обратите внимание, что я смешаю rowerum из вложенных запросов для повышения производительности.

Смотрите эту статью в моем блоге более подробно:

6
ответ дан 9 December 2019 в 20:43
поделиться

Из одного из ваших комментариев:

Большую часть времени (около 95% времени) пользователей заинтересованы в последних (последних) записях

в этом случае, почему бы не показывать записи в обратном порядке, так что Это 95% времени, которые пользователи заинтересованы в странице 1, а не на странице 900 000?

, если они действительно хотят видеть «Page 900 000», это означает, что они заинтересованы в данных из давних данных, поэтому позвольте им Фильтровать данные, например, диапазон дат. Просто пейджинг через 100 миллионов строк без какой-либо фильтрации никогда не будет быть исполненным.

5
ответ дан 9 December 2019 в 20:43
поделиться

Бен прав, что вы видите только запросы текущего процесса. Его можно использовать в одном представлении или в консоли, но не между представлениями.

Лучший способ увидеть, какие запросы выполняются в ваших представлениях, - это использовать панель инструментов отладки Django .

-121--3227065-

Имеется несколько переводчиков C/C + +, например этот .

Не пробовал сам, но я думаю, что поскольку он претендует на совместимость с компилируемым C/C + +, он должен иметь «ручное» управление памятью.

-121--3049970-

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

1
ответ дан 9 December 2019 в 20:43
поделиться

Вам действительно нужно вернуть весь ряд? Как это означает, что вы не используете какие-либо индексы.

Если вам все еще нужно получить весь ряд. Используйте следующий рисунок:

SELECT * FROM findings f1 WHERE f1.rowid IN
   (SELECT  rownum rnum, row_id
      FROM (
            SELECT f.rowid row_id
              FROM findings f
          ORDER BY record_ordering_column
           ) 
     WHERE rownum > 900
   )
WHERE rnum <= 100;

см. Asktom

Примечание. Примечание: тонкое дополнительный пункт выбора, а также с использованием запроса ROWID.

Если вы добавляете индекс на Record_ordering_Column, то баганация будет использовать индекс, чтобы получить набор rowiDs. Затем загружайте только блоки, которые содержат строки, идентифицированные их ROWIDS.

Это будет лучше, чем ваш текущий запрос, который будет полным сканированием таблицы.

0
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: