Как оптимизировать запрос T-SQL, который выбирается из одной или другой из двух таблиц - PullRequest
0 голосов
/ 31 октября 2019

Есть две идентичные таблицы. Динамический параметр будет определять, из какой из двух таблиц получить данные. Подход, который я выбрал, заключается в объединении результатов из обеих таблиц и добавлении предиката в каждый подзапрос для фильтрации по переданному параметру (см. Ниже). В результате был составлен примерный план выполнения, который считывает обе таблицы, а затем применяет фильтр. Есть ли способ оптимизировать запрос без использования условия (например, IF), чтобы запрашивалась только соответствующая таблица?

create table Flip (ID uniqueidentifier)
create table Flop (ID uniqueidentifier)

Запрос

declare @useFlip bit
select * from Flip where @useFlip=1
union
select * from Flop where @useFlip<>1

План выполнения

enter image description here

1 Ответ

0 голосов
/ 31 октября 2019

Я бы лично перешел к динамическому утверждению или IF...ELSE логике. Поскольку вы когда-либо будете запрашивать только одну таблицу, имеет смысл создать соответствующий план.

Динамический подход:

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT * FROM ' + QUOTENAME(CASE @UseFlip WHEN 1 THEN N'Flip' ELSE N'Flop' END) + N';';
EXEC sp_executesql @SQL;

IF...ELSE Подход:

IF @UseFlip = 1
    SELECT * FROM Flip;
ELSE
    SELECT * FROM Flop;

Редактировать: Вышеупомянутое было полностью признано недействительным, так как ОП прокомментировал ниже этот ответ, чтобы сообщить, что они используют встроенную функцию табличного значения (эта информация в данный момент не рассматривается),Ни одно из этих утверждений не может быть использовано в iTVF.

...