Привет всем, у меня есть пара запросов для некоторых отчетов, в которых каждый запрос извлекает данные из 35+ таблиц. Каждая таблица имеет почти 100 тыс. записей. Все запросы объединены ALL для примера
;With CTE
AS
(
Select col1, col2, col3 FROM Table1 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table2 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table3 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table4 WHERE Some_Condition
.
.
. And so on
)
SELECT col1, col2, col3 FROM CTE
ORDER BY col3 DESC
До сих пор я тестировал этот запрос только на Dev Server, и я вижу, что для получения результатов требуется время. Все эти 35+ таблиц не связаны друг с другом, и это единственный способ, который я могу придумать, чтобы получить все желаемые данные в наборе результатов.
Есть ли лучший способ сделать такой запрос??
Если это единственный способ выполнить такой запрос, как я могу улучшить производительность этого запроса, внеся какие-либо изменения, если это возможно??
Мое мнение
Я не возражаю против нескольких грязных чтений в этом отчете. Я думал использовать подсказки для запросов with nolock
или Transaction Isolation Level
, установленные на READ UNCOMMITED
.
Поможет ли что-то из этого???
Редактировать
Каждая таблица имеет 5-10-битные столбцы и столбец с соответствующей датой для каждого битового столбца, и мое условие для каждого оператора SELECT выглядит примерно так:
WHERE BitColumn = 1 AND DateColumn IS NULL
Предложение коллег
Отфильтрованный индекс
CREATE NONCLUSTERED INDEX IX_Table_Column
ON TableName(BitColumn)
WHERE BitColum = 1
Отфильтрованный индекс с включенным столбцом
CREATE NONCLUSTERED INDEX fIX_IX_Table_Column
ON TableName(BitColumn)
INCLUDE (DateColumn)
WHERE DateColumn IS NULL
Это лучший способ? или любые предложения, пожалуйста ???