1. Используйте временные таблицы
Создайте временную таблицу для подмножества (строк и столбцов) интересующих вас данных. Временная таблица должна быть намного меньше исходной исходной таблицы и ее можно легко индексировать (при необходимости).
Для создания временной таблицы вы можете использовать код (не проверенный), например:
-- copy records from last month to temporary table
INSERT INTO
#my_temporary_table
SELECT
*
FROM
er101_acct_order_dtl WITH (NOLOCK)
WHERE
er101_upd_date_iso > DATEADD(month, -1, GETDATE())
-- run other queries on temporary table (which can be indexed)
SELECT TOP 100
*
FROM
#my_temporary_table
ORDER BY
er101_upd_date_iso DESC
Плюсы:
Легко сделать для любого набора данных. Легко управлять - это временно и это таблица. Не влияет на общую производительность системы, например на просмотр. Временную таблицу можно индексировать. Минусы:
Это моментальный снимок данных, но, вероятно, этого достаточно для специальных запросов.
2. Создайте представления.
Аналогично предыдущему, но вместо временных таблиц создавайте представления.
Вы можете создавать представления или индексированные представления для подмножества интересующих вас данных и запускать запросы на представлении, которое должно содержать только интересное подмножество данных, намного меньшее, чем вся таблица.
Плюсы:
Легко сделать. Это актуально с исходными данными. Минусы:
Возможно только для определенного набора данных. Может быть неэффективным для больших таблиц с высокой скоростью обновления. Не так-то просто управлять. Может повлиять на общую производительность системы. Выбор всех столбцов Запуск звездного запроса (SELECT * FROM) для большой таблицы - это нехорошо ...
Если у вас есть большие столбцы (например, длинные строки), требуется много времени, чтобы прочитать их с диска и передать по сети.
Я бы попытался заменить * на имена столбцов, которые вам действительно нужны.
Или, если вам нужны все столбцы, попробуйте переписать запрос примерно так:
;WITH recs AS (
SELECT TOP 100
id as rec_id -- select primary key only
FROM
er101_acct_order_dtl
ORDER BY
er101_upd_date_iso DESC
)
SELECT
*
FROM
er101_acct_order_dtl
WHERE
id = rec.rec_id
ORDER BY
er101_upd_date_iso DESC
Грязные чтения
Последнее, что может ускорить запрос, - это разрешить грязное чтение с табличной подсказкой WITH (NOLOCK).
Вместо подсказки вы можете установить уровень изоляции транзакции на чтение без фиксации:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
person
Community
schedule
18.02.2013