Использование пользовательских функций и производительности?
Я использую хранимую процедуру для извлечения данных, и мне нужно было фильтровать динамически. Например, если я не хочу получать какие-либо данные с идентификатором 5, 10 или 12, я отправляю их в виде строки в процедуру и преобразую их в таблицу через пользовательскую функцию. Но я должен рассмотреть производительность, так что вот пример:
Решение 1:
SELECT *
FROM Customers
WHERE CustomerID NOT IN (SELECT Value
FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',','));
Решение 2:
CREATE TABLE #tempTable (Value NVARCHAR(4000));
INSERT INTO #tempTable
SELECT Value FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',')
SELECT *
FROM BusinessAds
WHERE AdID NOT IN (SELECT Value FROM #tempTable)
DROP TABLE #tempTable
Какое решение лучше для производительности?
1 ответ
Вам, вероятно, было бы лучше создать #temp
таблица с кластеризованным индексом и соответствующим типом данных
CREATE TABLE #tempTable (Value int primary key);
INSERT INTO #tempTable
SELECT DISTINCT Value
FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',')
Вы также можете поместить кластерный индекс в таблицу, возвращаемую TVF.
Что касается того, что лучше, SQL Server всегда будет предполагать, что TVF вернет 1 строку, а не перекомпилирует после #temp
таблица заполнена, поэтому вам нужно будет подумать, может ли это предположение вызвать неоптимальные планы запросов для случая, когда список большой.