2010-09-30 2 views
10

To jest pytanie oparte na wydajności, a nie pytanie "I don't understand" lub "best practice".Względna wydajność w SQLServer dla kombinacji podłańcuch i kombinacja prawa i lewa

Mam pole varchar w bazie danych SQLServer, która ma więcej niż 7 znaków. Potrzebuję wyodrębnić pole char (4) składające się z 2, 3, 4 i 5 znaków w varcharze.

Na przykład, jeśli varchar miał wartość 1234567890, to szukałbym części 2345.

Czy istnieje korzyść związana z wydajnością korzystania z podłańcucha nad kombinacją po lewej i prawej stronie?

SELECT SUBSTRING(account,2,4) FROM payment 

lub

SELECT RIGHT(LEFT(account,5),4) FROM payment 

zauważyłem niewielki przewagę stosując prawo-lewo na stole z 1,760,335 rekordów, ale nie jestem pewien, czy to ze względu na kwerendy buforowania lub temu lubić.

UPDATE Zrobiłem trochę więcej pracy domowej. Wydaje się, że w tym przypadku lewica prawostronna jest ostatecznie wykonywana jako prawe podciąganie. Czy to jest reguła? czy jest to po prostu sposób, w jaki SQLServer zdecydował się na skórze tego konkretnego kota? alt text

+0

Jedynym sposobem na upewnienie się w danych okolicznościach jest porównanie ... –

Odpowiedz

2

+1 za interesujące pytanie. Twoja ocena, że ​​SQL Server może znacząco zmienić każdą instrukcję poprzez optymalizację jest prawdopodobnie dokładna; tak samo jak ocena, że ​​w takim dużym zbiorze SQL Server może być w stanie buforować jedno zapytanie lepiej niż inne.

Dwie inne rzeczy przychodzą do głowy, że może być (niejasno) dotyczy:

  • zużycie pamięci; Byłbym ciekawy, czy kombinacja LEFT/RIGHT zużywa nieco więcej pamięci. Teoretycznie, wartość zwracana pierwszej funkcji musiałaby być przechowywana, aby mogła zostać przekazana do drugiej funkcji, chociaż ten sam rejestr może być wielokrotnie używany.

  • Sprawdzanie granic. Varchar jest w zasadzie wskaźnikiem do początku znaku char [] z 2 dodatkowymi bajtami określającymi długość. Sugeruje to, że należy przeprowadzić pewne sprawdzanie granic podczas uzyskiwania dostępu do wartości przez indeks, sprawdzając wartość zawartą w tych 2 bajtach, aby upewnić się, że nie jest poza zakresem.

Serwer SQL jest również bardzo wyrozumiały podczas wysyłania próśb poza granice łańcucha znaków zarówno z postaciami znaków, jak i varcharami. Poniższy kod będzie działał bez żadnych błędów.

DECLARE @Test varchar(50); 
SET @Test = 'Hello World'; 
SELECT substring(@Test, 2, 4); 
SELECT substring(@Test, 2000, 5000); 

Więc będzie:

SELECT right(left(@test, 500), 400); 

Domyślam się, że wyjaśnienie na odpowiedź na swoje pytanie leży w czymś związanym; niestety nie podaję odpowiedzi na twoje pytanie znam.

Byłbym ciekawy, czy uzyskasz te same wyniki wydajności, używając dłuższego ciągu znaków lub znaku char versus varchar. Te testy mogą dostarczyć więcej wglądu w elementy wewnętrzne SQL Server.