2012-11-08 11 views
7

Wczoraj dostaliśmy scenariusz, w którym musieliśmy uzyskać typ db field i na tej podstawie musieliśmy napisać opis pola. Tak jakFunkcja bazy danych VS Case Statement

Zasugerowałem, aby napisać funkcję db zamiast tej instrukcji case, ponieważ byłoby to bardziej do wielokrotnego użytku. Jak

Select dbo.GetTypeName(DB_Type) 
from DB_table 

Interesującą częścią jest jeden z naszych deweloper powiedział użyciu funkcji baza danych będzie nieefektywne jak database functionswolniej niż Case statement. Przeszukałem przez Internet, aby znaleźć odpowiedź, która jest lepszym podejściem pod względem wydajności, ale niestety nie znalazłem niczego, co mogłoby być uznane za satysfakcjonującą odpowiedź. Proszę oświecić mnie swoimi myślami, które podejście jest lepsze?

+1

Czy to 'dbo.GetTypeName (typ_DB)' ma takie samo wyrażenie 'CASE'? tj .: Pytasz o różnicę między napisaniem wyrażenia "CASE" bezpośrednio do zapytania i umieszczeniem go w funkcji zdefiniowanej przez użytkownika *** pod względem wydajności i ponownego wykorzystania ***. Dobrze? –

+0

Tak! wszystko jest takie samo. –

Odpowiedz

7
UDF function is always slower than case statements 

Patrz artykuł

http://blogs.msdn.com/b/sqlserverfaq/archive/2009/10/06/performance-benefits-of-using-expression-over-user-defined-functions.aspx

Poniższy artykuł sugeruje kiedy użyć UDF

http://www.sql-server-performance.com/2005/sql-server-udfs/

Podsumowanie:

Istnieje duża wydajność zapłacił karę, gdy funkcje zdefiniowane przez użytkownika jest used.This kara pokazuje się jako słabe czas wykonania zapytania, gdy zapytanie dotyczy UDF do dużej liczby wierszy, zwykle 1000 lub więcej. Kara jest ponoszona, ponieważ silnik bazy danych programu SQL Server musi utworzyć własny wewnętrzny kursor, taki jak przetwarzanie. Musi wywoływać każdy UDF w każdym wierszu. Jeśli UDF jest używane w klauzuli WHERE, może się to zdarzyć jako część filtrowania wierszy. Jeśli UDF jest używany na liście wyboru, dzieje się tak podczas tworzenia wyników zapytania, aby przejść do następnego etapu przetwarzania zapytania. Jest to przetwarzanie wiersz po wierszu, które spowalnia SQL Server najbardziej.

1

Podczas korzystania z funkcji skalarnej (funkcja, która zwraca jedną wartość) zawartość funkcji będzie wykonywana raz na wiersz, ale instrukcja case będzie wykonywana w całym zestawie.

Operując w odniesieniu do całego zestawu, serwer pozwala na bardziej efektywną optymalizację zapytania.

Tak więc teoria mówi, że to samo zapytanie jest uruchamiane w obie strony przeciwko dużemu zestawowi danych, dlatego funkcja powinna działać wolniej. Różnica może być jednak niewielka, gdy operujesz na danych, więc powinieneś wypróbować obie metody i przetestować je w celu ustalenia, czy jakikolwiek zysk z wydajności jest wart zwiększonej użyteczności funkcji.