2010-09-30 5 views
10

Questa è una domanda basata sulle prestazioni, non una domanda "I don't understand" o "best practice".Prestazione relativa in SQLServer di sottostringa rispetto a una combinazione destra-sinistra

Ho un campo varchar in un database SQLServer che è garantito per essere più lungo di 7 caratteri. Ho bisogno di estrarre un campo char (4) composto dal 2 °, 3 °, 4 ° e 5 ° carattere nel varchar.

Ad esempio se il varchar aveva il valore 1234567890, avrei cercato la parte 2345.

Esiste un vantaggio in termini di prestazioni nell'utilizzo di una sottostringa su una combo da destra a sinistra?

SELECT SUBSTRING(account,2,4) FROM payment 

o

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

ho notato un leggero vantaggio utilizzando un destra-sinistra su un tavolo con 1,760,335 dischi, ma non sono sicuro se questo è dovuto alle richieste di caching o il piace.

UPDATE Ho fatto un po 'di compiti in più. In questo caso, sembra che in questo caso la destra-sinistra sia eseguita come sottostringa destra. È una regola? o è solo il modo in cui SQLServer ha deciso di skinare questo particolare gatto? alt text

+0

l'unico modo per essere sicuri nelle vostre circostanze è il benchmark ... –

risposta

2

+1 per una domanda interessante. La tua valutazione secondo cui SQL Server potrebbe modificare in modo significativo ogni istruzione tramite l'ottimizzazione è probabilmente accurata; come la tua valutazione che in un set così grande SQL Server può essere in grado di memorizzare una query in cache meglio di un'altra. altri

Due cose mi vengono in mente che potrebbe essere (vagamente) rilevanti:

  • Il consumo di memoria; Sarei curioso di sapere se la combo SINISTRA/DESTRA consuma un po 'di memoria in più. In teoria, il valore di ritorno della prima funzione dovrebbe essere memorizzato in modo che possa essere passato alla seconda funzione, sebbene lo stesso registro possa essere usato più e più volte.

  • Controllo dei limiti. Un varchar è fondamentalmente un puntatore all'inizio di un carattere [] con 2 byte in più per indicare la lunghezza. Ciò suggerisce che sarebbe necessario eseguire una sorta di controllo dei limiti quando si accede a un valore da un indice osservando il valore contenuto in quei 2 byte per assicurarsi che non fosse fuori intervallo.

SQL Server è anche molto indulgente quando si effettuano richieste al di fuori dei limiti della stringa con caratteri e varchar. Il seguente codice verrà eseguito senza errori.

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

Così sarà:

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

La mia ipotesi è che la spiegazione per la risposta alla tua domanda sta in qualcosa connessi; sfortunatamente non lo so so la risposta alla tua domanda.

Sarei curioso di sapere se si ottengono gli stessi risultati delle prestazioni utilizzando una stringa più lunga o un carattere contro un valore varchar. Questi test potrebbero fornire più informazioni sugli interni di SQL Server.