У меня есть хранимая процедура, которая объединяет данные из нескольких таблиц через UNION ALL
. Если параметры, переданные в хранимую процедуру, не применяются к конкретной таблице, я пытаюсь «закоротить» эту таблицу, используя «вспомогательные биты», например. @DataSomeTableExists
и добавление соответствующего условия в предложение WHERE
, например.Awkward JOIN вызывает низкую производительность
Стол для одного (psuedo) в хранимой процедуре немного неудобен и вызывает у меня некоторое горе.
DECLARE @DataSomeTableExists BIT = (SELECT CASE WHEN EXISTS(SELECT * FROM #T WHERE StorageTable = 'DATA_SomeTable') THEN 1 ELSE 0 END);
...
UNION ALL
SELECT *
FROM REF_MinuteDimension AS dim WITH (NOLOCK)
CROSS JOIN (SELECT * FROM #T WHERE StorageTable = 'DATA_SomeTable') AS T
CROSS APPLY dbo.fGetLastValueFromSomeTable(T.ParentId, dim.TimeStamp) dpp
WHERE @DataSomeTableExists = 1 AND dim.TimeStamp >= @StartDateTime AND dim.TimeStamp <= @EndDateTime
UNION ALL
...
Примечание: REF_MinuteDimension
не более чем smalldatetimes с шагом в минуту.
(1) План выполнения (ниже) указывает на предупреждение оператора вложенных циклов, говорящего, что предиката соединения нет. Это, вероятно, не очень хорошо, но между таблицами действительно нет естественного соединения. Есть ли лучший способ написать такой запрос? Для каждого ParentId в T я хочу получить значение из UDF за каждую минуту между @StartDateTime и @EndDateTime.
(2) Даже когда @DataSomeTableExists = 0
, в этом запросе есть активность ввода-вывода, как сообщается SET STATISTICS IO ON
, и фактический план выполнения. В плане выполнения указано 14,2% стоимости, что слишком сильно, учитывая, что эти таблицы даже не применяются в этом случае.
SELECT * FROM #T WHERE StorageTable = 'DATA_SomeTable'
возвращается пустым.
Это так, как мой запрос написан? Почему бы не вспомогательный бит или пустое Т короткое замыкание этого запроса?
Вы должны изменить что 'DECLARE' вещь это:' объявить @DataSomeTableExists бит = 0 , если существует (SELECT * FROM #T WHERE StorageTable = 'DATA_SomeTable') начало \t комплект @DataSomeTableExists = 1 конец'. Трудно читать, так вот [pastebin] (http://pastebin.com/4y0VTJCD). И почему у вас нет вашего аргумента «короткое замыкание» 'WHERE' в запросе' CROSS JOIN'? Я должен упомянуть, у меня нет подсказки *, если это когда-либо будет работать, поскольку это нечетный способ написать sproc. –