Использование пользовательских функций и производительности? - PullRequest
1 голос
/ 12 сентября 2011

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

2 голосов
/ 12 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...