Использование: SQL Server 2016 +
Я хотел посмотреть, есть ли способ оценить, сколько времени потребуется SQL Server для перекомпиляции плана выполнения запроса.У нас есть несколько хранимых процедур, в которых мы выбираем из таблицы 1 на основе обнуляемого параметра в таблице 2. Например, если клиент не равен NULL, вернуть его продажи, иначе вернуть все продажи.
Пример данных:
DROP TABLE IF EXISTS dbo.TestTable1;
DROP TABLE IF EXISTS dbo.TestTable2;
CREATE TABLE dbo.TestTable1 (ID INT NOT NULL PRIMARY KEY CLUSTERED , TextValue NVARCHAR(255) NULL);
CREATE TABLE dbo.TestTable2 (ID INT NOT NULL PRIMARY KEY CLUSTERED , TextValue NVARCHAR(255) NULL);
INSERT INTO TestTable1 (ID, TextValue)
VALUES (1, N'Table 1 - Text 1'),
(2, N'Table 1 - Text 2'),
(3, N'Table 1 - Text 3'),
(4, N'Table 1 - Text 4'),
(5, N'Table 1 - Text 5'),
(6, N'Table 1 - Text 6'),
(7, N'Table 1 - Text 7'),
(8, N'Table 1 - Text 8'),
(9, N'Table 1 - Text 9'),
(10, N'Table 1 - Text 10');
INSERT INTO TestTable2 (ID, TextValue)
VALUES (1, N'Table 2 - Text 1'),
(2, N'Table 2 - Text 2'),
(3, N'Table 2 - Text 3'),
(4, N'Table 2 - Text 4'),
(5, N'Table 2 - Text 5'),
(6, N'Table 2 - Text 6'),
(7, N'Table 2 - Text 7'),
(8, N'Table 2 - Text 8'),
(9, N'Table 2 - Text 9'),
(10, N'Table 2 - Text 10');
Это значительно упрощено, поскольку у нас было бы несколько возможных условий, связанных с несколькими таблицами.В настоящее время мы рассматриваем перекомпиляцию запроса, чтобы соединения со вторичной таблицей выполнялись только при необходимости.
DECLARE @LookupValue NVARCHAR(50);
SET @LookupValue = NULL;
SELECT *
FROM dbo.TestTable1 T1
WHERE @LookupValue IS NULL
OR EXISTS ( SELECT TOP (1) 1 A FROM dbo.TestTable2 T2 WHERE T1.ID = T2.ID AND T2.TextValue = @LookupValue)
OPTION (RECOMPILE)
SET @LookupValue = N'Table 2 - Text 1';
SELECT *
FROM dbo.TestTable1 T1
WHERE @LookupValue IS NULL
OR EXISTS ( SELECT TOP (1) 1 A FROM dbo.TestTable2 T2 WHERE T1.ID = T2.ID AND T2.TextValue = @LookupValue)
OPTION (RECOMPILE);
Как видно из приведенного ниже плана запроса, таблица перекомпиляции 2 эффективно удаляется из выполнения.
Однако перекомпиляция требует определенных затрат, и я собираюсь отследить эти накладные расходы, чтобы принять разумные решения относительно того, какой из наших запросов отформатировать таким образом.В общем, я вижу, что перекомпиляция происходит последовательно быстрее, но есть много сообщений о том, что это означает, что планы выполнения могут оказаться намного менее оптимальными.
Будем с благодарностью приняты за любые рекомендации по измерению этих накладных расходов или по любым вопросам, которые я должен исследовать, прежде чем применять их более широко.
Большое спасибо.