/ / Продуктивність збереженої процедури при оновленні стовпчиків вибірково на основі параметрів? - sql-сервер, продуктивність, sql-server-2008, збережені процедури

Виконання збереженої процедури при оновленні стовпців вибірково за параметрами? - sql-сервер, продуктивність, sql-server-2008, збережені процедури

Я намагаюся з'ясувати, чи це відноснодобре функціонує T-SQL (це SQL Server 2008). Мені потрібно створити збережену процедуру, яка оновлює таблицю. Проц приймає стільки параметрів, скільки є стовпці в таблиці, і за винятком стовпчика PK всі вони за умовчанням мають значення NULL. Тіло процедури виглядає так:

CREATE PROCEDURE proc_repo_update
@object_id bigint
,@object_name varchar(50) = NULL
,@object_type char(2) = NULL
,@object_weight int = NULL
,@owner_id int = NULL
-- ...etc
AS
BEGIN
update
object_repo
set
object_name = ISNULL(@object_name, object_name)
,object_type = ISNULL(@object_type, object_type)
,object_weight = ISNULL(@object_weight, object_weight)
,owner_id = ISNULL(@owner_id, owner_id)
-- ...etc
where
object_id = @object_id

return @@ROWCOUNT

END

Так в основному:

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

Це працює досить добре, але як ISNULL дзвінок поверне значення стовпця, якщоотриманий параметр був нульовим, чи буде SQL Server це як-то оптимізувати? Це може бути вузьким місцем роботи програми, де таблиця може бути значно оновлена ​​(вставка буде нечасто, тому продуктивність не є проблемою). Тому я намагаюся зрозуміти, що це найкращий спосіб це зробити. Чи є спосіб стверджувати вирази стовпців з чимось на зразок CASE WHEN або щось? Таблиця буде індексована як для читання, так і для читання. Це найкращий підхід? Моя альтернатива на цьому етапі полягає у створенні UPDATE вираз в коді (наприклад, вбудований SQL) і виконати його на сервері. Це дозволить вирішити мої сумніви щодо продуктивності, але я, скоріше за все, залишу це в збереженому процесі.

Відповіді:

1 для відповіді № 1

Подивіться на публікацію блогу Х'юго Корнеліса на сторінці http://sqlblog.com/blogs/hugo_kornelis/archive/2007/09/30/what-if-null-if-null-is-null-null-null-is-null.aspx. Сколоти трохи до обговорення на тему COALESCE vs ISNULL. Якщо переносимість є майбутнім розглядом, подивіться на COALESCE.

Проте з а продуктивність Погляньте на погляди на Adam, присвячену продуктивності в блозі http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx. ISNULL - це швидше.

Ваш вибір...

До речі, у мене є купа SP, які так само схожіваш приклад і не має проблем із продуктивністю, використовуючи ISNULL. (Будучи трохи лінивим, мені подобається вводити 6 або 8 символів і бути литлеподібним до палець-дислексії, ISNULL набагато легше вводити :-))


1 для відповіді № 2

ISNULL є найшвидшим способом - єдиним способом, який ви поліпшите, буде, якщо ви перейдете в NULL або фактичне значення, а ISNULL в програмі.