Я использую SQL Server 2008. У меня есть таблица с более чем 3 миллионами записей, которая связана с другой таблицей с миллионом записей.
Я провел несколько дней, экспериментируя с различными способами запроса.эти таблицы.У меня есть два радикально разных запроса, каждый из которых занимает 6 секунд на моем ноутбуке.
В первом запросе используется метод грубой силы для оценки совпадений , возможно, вероятных , и удаляется неправильныйсовпадения с помощью вычислений совокупного суммирования.
Вторая получает все возможные совпадения, а затем удаляет неправильные совпадения с помощью запроса EXCEPT, который использует два выделенных индекса для нахождения низкого и высокого совпадений.
Логически, одинбудет ожидать, что грубая сила будет медленной, а индексы быстрой.Не так.И я много экспериментировал с индексами, пока не добился наилучшей скорости.
Кроме того, для запроса грубой силы не требуется столько индексов, что означает, что технически он обеспечит лучшую общую производительность системы.
Ниже приведены два плана выполнения.Если вы их не видите, пожалуйста, дайте мне знать, и я отправлю вам сообщение в альбомной ориентации / отправлю вам по почте.
Запрос грубой силы:
SELECT ProductID, [Rank]
FROM (
SELECT p.ProductID, ptr.[Rank], SUM(CASE
WHEN p.ParamLo < si.LowMin OR
p.ParamHi > si.HiMax THEN 1
ELSE 0
END) AS Fail
FROM dbo.SearchItemsGet(@SearchID, NULL) AS si
JOIN dbo.ProductDefs AS pd
ON pd.ParamTypeID = si.ParamTypeID
JOIN dbo.Params AS p
ON p.ProductDefID = pd.ProductDefID
JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
ON ptr.ProductTypeID = pd.ProductTypeID
WHERE si.Mode IN (1, 2)
GROUP BY p.ProductID, ptr.[Rank]
) AS t
WHERE t.Fail = 0
Запрос об исключении на основе индекса:
with si AS (
SELECT DISTINCT pd.ProductDefID, si.LowMin, si.HiMax
FROM dbo.SearchItemsGet(@SearchID, NULL) AS si
JOIN dbo.ProductDefs AS pd
ON pd.ParamTypeID = si.ParamTypeID
JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
ON ptr.ProductTypeID = pd.ProductTypeID
WHERE si.Mode IN (1, 2)
)
SELECT p.ProductID
FROM dbo.Params AS p
JOIN si
ON si.ProductDefID = p.ProductDefID
EXCEPT
SELECT p.ProductID
FROM dbo.Params AS p
JOIN si
ON si.ProductDefID = p.ProductDefID
WHERE p.ParamLo < si.LowMin OR p.ParamHi > si.HiMax
Мой вопрос: какой из планов выглядит более эффективным?Я понимаю, что это может измениться с ростом моих данных.
РЕДАКТИРОВАТЬ:
Я обновил индексы и теперь имею следующий план выполнения для второго запроса: