2013-07-24 34 views
5

Ważę potencjalny wpływ wydajności na użycie jednej z trzech różnych metod zwracania pojedynczej, skalarnej wartości z procedury składowanej do mojej procedury C#. Czy ktoś może mi powiedzieć, który z nich jest "szybszy" i, co najważniejsze, dlaczego?Zestaw wyników wydajności serwera SQL a parametr wyjściowy a wartość zwracana

Metoda 1:

CREATE PROCEDURE GetClientId 
    @DealerCode varchar(10) 
AS 
BEGIN 
    SET NOCOUNT ON 
    SELECT ClientId 
     FROM Client 
     WHERE ClientCode = @DealerCode 
END 
-- this returns null if nothing is found, 
-- otherwise it returns ClientId in a ResultSet 

Metoda 2:

CREATE PROCEDURE GetClientId 
    @DealerCode varchar(10), 
    @ClientValue int out 
AS 
BEGIN 
    SET NOCOUNT ON 
    set @ClientValue = -1 
    set @ClientValue = (SELECT ClientId 
     FROM Client 
     WHERE ClientCode = @DealerCode) 
END 
-- this returns -1 for ClientValue if nothing is found, 
-- otherwise it returns ClientId 
-- the value for ClientValue is a scalar value and not a ResultSet 

Metoda 3:

CREATE PROCEDURE GetClientId 
    @DealerCode varchar(10) 
AS 
BEGIN 
    SET NOCOUNT ON 
    declare @ClientValue int 
    set @ClientValue = 
     (SELECT ClientId FROM Client WHERE ClientCode = @DealerCode) 
    if @ClientValue is null or @ClientValue = 0 
     return -1 
    else 
     return @ClientValue 
END 
-- this uses the return value of the stored procedure; 
-- -1 indicates nothing found 
-- any positive, non-zero value is the actual ClientId that was located 

Odpowiedz

2

Wracając wartością skalarną jest bardziej wydajny niż wyniku, powodem jest wynikiem set zawiera więcej metod pomocniczych wraz z nim, co czyni go ciężkim, co zwiększa opóźnienie w transmisji obiektu od kodu sql do kodu C#/rutyny.

W swojej metodzie 3: Użyłeś zmiennej, aby zwrócić wartość, która jest lepsza niż wysyłanie parametru out, ponieważ tutaj wycinasz na przesuwie obiektu co najmniej na jednej trasie (tj. Podczas wywoływania procedury przechowywanej).

Zestaw wyników jest bardziej elastyczny niż parametr wyjściowy, ponieważ może zwrócić wiele wierszy (oczywiście), więc jeśli potrzebujesz zestawu wyników, to i tak jest to jedyny wybór.

Aby zamówić zapytań na podstawie wyników, że idzie jak Metoda 3, Metoda 2 Metoda 1.

Nadzieja jest to pomocne w zrozumieniu pojęcia.

+1

Kolejna precyzja. Metoda 3 (RETURN) ogranicza użytkownika do typu INTEGER. Jeśli chcesz zwrócić inny typ danych, powinieneś użyć metody 2 lub metody 1. –

+0

Doceniam wszelką pomoc. Osobiście skłaniałem się ku # 2. Jednakże, gdy zwracam wartość INTEGER zarówno w punktach # 2, jak i numerach 3, mogłem zobaczyć, gdzie # 3 miałoby najlepszą wydajność. Użyłbym # 2, gdybym musiał zwrócić jakiś typ ciągu. Oczywiście, zgodnie z wcześniejszymi ustaleniami, używałbym # 1 tylko wtedy, gdy potrzebuję zestawu wyników. –