Использование пользовательских функций и производительности?

Я использую хранимую процедуру для извлечения данных, и мне нужно было фильтровать динамически. Например, если я не хочу получать какие-либо данные с идентификатором 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 таблица заполнена, поэтому вам нужно будет подумать, может ли это предположение вызвать неоптимальные планы запросов для случая, когда список большой.

Другие вопросы по тегам