Sql Оптимизация: XML или Строка с разделителями - PullRequest
4 голосов
/ 11 февраля 2010

Надеемся, что это простой вопрос, связанный с оптимизацией производительности, когда речь идет о запросах в Sql 2008.

Я работал для компаний, которые часто используют Stored Procs для своих процессов ETL, а также для некоторых своих веб-сайтов. Я видел сценарий, в котором им нужно извлекать конкретные записи на основе конечного набора ключевых значений. Я видел, как он обрабатывается тремя различными способами, что показано ниже с помощью псевдокода.

Динамический Sql, который объединяет строку и выполняет ее.

EXEC('SELECT * FROM TableX WHERE xId IN (' + @Parameter + ')'

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

SELECT * FROM TableY INNER JOIN SPLIT(@Parameter) ON yID = splitId

ИСПОЛЬЗОВАНИЕ XML в качестве параметра вместо значения varchar с разделителями

SELECT * FROM TableZ JOIN @Parameter.Nodes(xpath) AS x (y) ON ...

Хотя я знаю, что создание динамического sql в первом фрагменте является плохой идеей по большому количеству причин, мое любопытство исходит из последних 2 примеров. Лучше ли в моем коде должным образом усердно передавать такие списки через XML, как в фрагменте 3, или лучше просто разграничить значения и использовать udf для этого?

Ответы [ 2 ]

5 голосов
/ 11 февраля 2010

Теперь есть 4-й параметр - табличные параметры , в котором вы можете фактически передать таблицу значений в sproc в качестве параметра, а затем использовать его, как обычно для табличной переменной. Я бы предпочел этот подход XML (или CSV)

Я не могу процитировать показатели производительности между всеми различными подходами, но я бы попробовал это - я бы рекомендовал провести некоторые реальные тесты производительности на них.

Edit:
Еще немного о ТВП. Для того, чтобы передать значения в sproc, вы просто определяете SqlParameter (SqlDbType.Structured) - значение этого может быть установлено на любой источник IEnumerable, DataTable или DbDataReader. Вероятно, у вас уже есть список значений в каком-либо списке / массиве - вам не нужно ничего делать, чтобы преобразовать его в XML или CSV.

Я думаю, что это также делает sproc более понятным, простым и более обслуживаемым, обеспечивая более естественный способ достижения конечного результата. Одним из основных моментов является то, что SQL лучше всего работает при операциях, основанных на наборе / не зацикливании / не строковых манипуляциях.

Это не значит, что он будет отлично работать с большим набором передаваемых значений. Но с меньшими наборами (до ~ 1000) это должно быть хорошо.

2 голосов
/ 11 февраля 2010

UDF вызов немного дороже, чем разделение XML с помощью встроенной функции.

Однако это нужно делать только один раз для каждого запроса, поэтому разница в производительности будет незначительной.

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