У меня есть таблица оракула с количеством записей 99896618.
Я должен выбрать маленький блок данных (позволяет, говорят, что 100 записей) для показа его на веб-странице, (В веб-мире мы называем это подкачкой страниц). В настоящее время я использую следующий запрос для выполнения этого однако, пользователи не удовлетворены производительностью.
SELECT * FROM (select rownum rnum,f.* from findings f where rownum<90000100 )
WHERE rnum > 90000000
В настоящее время 1 минуте требуются 22 секунды для получения результатов. Должен там так или иначе сделать его лучше. Я, конечно, открыт для любого типа предложений включая изменение структуры таблицы или как добавление индексов.
(Просто к вашему сведению я использую ASP.NET в качестве серверной веб-технологии и ADO.NET как уровень доступа к данным и Silverlight для клиентской презентации),
Ваш запрос должен будет рассчитывать на первые 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
из вложенных запросов для повышения производительности.
Смотрите эту статью в моем блоге более подробно:
Из одного из ваших комментариев:
Большую часть времени (около 95% времени) пользователей заинтересованы в последних (последних) записях
в этом случае, почему бы не показывать записи в обратном порядке, так что Это 95% времени, которые пользователи заинтересованы в странице 1, а не на странице 900 000?
, если они действительно хотят видеть «Page 900 000», это означает, что они заинтересованы в данных из давних данных, поэтому позвольте им Фильтровать данные, например, диапазон дат. Просто пейджинг через 100 миллионов строк без какой-либо фильтрации никогда не будет быть исполненным.
Бен прав, что вы видите только запросы текущего процесса. Его можно использовать в одном представлении или в консоли, но не между представлениями.
Лучший способ увидеть, какие запросы выполняются в ваших представлениях, - это использовать панель инструментов отладки Django .
-121--3227065-Имеется несколько переводчиков C/C + +, например этот .
Не пробовал сам, но я думаю, что поскольку он претендует на совместимость с компилируемым C/C + +, он должен иметь «ручное» управление памятью.
-121--3049970- Если вы хотите изменить таблицу, я бы предложил добавить в таблицу столбец номер строки
(используя триггер вставки и последовательность для ее установки), а затем добавить индекс к этому столбцу.
Вам действительно нужно вернуть весь ряд? Как это означает, что вы не используете какие-либо индексы.
Если вам все еще нужно получить весь ряд. Используйте следующий рисунок:
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.
Это будет лучше, чем ваш текущий запрос, который будет полным сканированием таблицы.