/ / Wydajność przechowywanego procesu przy aktualizacji kolumn w sposób selektywny na podstawie parametrów? - sql-server, wydajność, sql-server-2008, zapisane procedury

Wydajność przechowywanego procesu przy aktualizacji kolumn w sposób selektywny na podstawie parametrów? - sql-server, wydajność, sql-server-2008, zapisane procedury

Próbuję ustalić, czy to jest względnedobrze działający T-SQL (to jest SQL Server 2008). Potrzebuję utworzyć procedurę składowaną, która aktualizuje tabelę. Proces akceptuje tyle parametrów, ile kolumn w tabeli, z wyjątkiem kolumny PK, wszystkie domyślnie mają wartość NULL. Treść procedury wygląda następująco:

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

Więc w zasadzie:

Zaktualizuj kolumnę tylko wtedy, gdy podano jej odpowiedni parametr i pozostaw resztę samodzielnie.

Działa to dobrze, ale jako ISNULL call zwróci wartość kolumny, jeśliodebrany parametr miał wartość null, czy SQL Server zoptymalizuje to w jakiś sposób? Może to być wąskie gardło wydajności w aplikacji, w której tabela może być mocno aktualizowana (wstawianie będzie rzadkie, więc wydajność nie będzie stanowiła problemu). Więc próbuję dowiedzieć się, jaki jest najlepszy sposób na zrobienie tego. Czy istnieje sposób na warunkowanie wyrażeń kolumn z czymś podobnym CASE WHEN lub coś? Tabela zostanie również zindeksowana do poziomu wazoo oraz do odczytu. Czy to najlepsze podejście? Moją alternatywą w tym momencie jest stworzenie UPDATE wyrażenie w kodzie (np. wbudowany SQL) i wykonać go na serwerze. To rozwiąże moje wątpliwości dotyczące wydajności, ale raczej zostawię to w przechowywanym proccie, jeśli to możliwe.

Odpowiedzi:

1 dla odpowiedzi № 1

Spójrz na blogu Hugo Kornelisa na http://sqlblog.com/blogs/hugo_kornelis/archive/2007/09/30/what-if-null-if-null-is-null-null-null-is-null.aspx. Ponownie przeanalizuj dyskusję na temat COALESCE vs. ISNULL. Jeśli przenośność jest kwestią przyszłościową, spójrz na COALESCE.

Jednak z wydajność z perspektywy, spójrz na blog reklamowy Adama na stronie http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx. ISNULL jest szybszy.

Twój wybór...

BTW, mam kilka SP, które są po prostu podobneTwój przykład i nie występują problemy z wydajnością za pomocą ISNULL. (Będąc trochę leniwym, lubię pisać 6 vs 8 znaków i będąc nieznacznie podatnym na dysleksję palców, ISNULL jest znacznie łatwiejszy do wpisania :-))


1 dla odpowiedzi nr 2

ISNULL to najszybsza metoda - jedyny sposób, w jaki się poprawisz, to jeśli przekażesz wartość NULL lub rzeczywistą wartość i wykonasz ISNULL w aplikacji.