Я намагаюся з'ясувати, чи це відноснодобре функціонує 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 в програмі.