2009-07-10 12 views
8

Sembra essere abbastanza accettato che tra cui il proprietario dello schema nella query db aumenta le prestazioni, ad es .:e nomi di tabella completi

SELECT x FROM [dbo].Foo vs SELECT x FROM Foo.

Questo dovrebbe salvare una ricerca, in quanto SQL Server cercherà una tabella Foo appartenente all'utente nel contesto di connessione.

Oggi mi è stato detto che tra cui sempre il nome del database migliora le prestazioni allo stesso modo, anche se si sta interrogando il database selezionato nella stringa di connessione:

SELECT x FROM MyDatabase.[dbo].Foo 

C'è qualche verità in questo? Ha senso come uno standard di codifica? Qualcuno di questo (anche il primo esempio) si traduce in benefici misurabili?

Stiamo parlando di alcuni cicli per una ricerca extra del dizionario sul server di database rispetto a più rigonfiamenti SQL e concatenazione extra sul server web (o altro client)?

+2

Se fa la differenza, aggiunge un problema di manutenzione poiché tutte le query contengono il nome del database. Rende molto difficile rinominare un database. – adrianbanks

+0

Dipende da cosa stai mantenendo. Avere nomi completi nella mia particolare procedura garantisce che funzioni esattamente allo stesso modo anche quando sono collegati a un diverso db nel mio ambiente di test - nel mio particolare scenario, voglio il test env. per produrre risultati di "produzione" per quanto riguarda il proc memorizzato.Forse non è una buona pratica, mi rendo conto, ma il nostro ampio panorama di data-store non ha controparti completamente riprodotte in uno stato pulito, sandbox in un dominio TEST separato, quindi, molti dei nostri ambienti TEST/DEV sono, nel migliore dei casi, un mix di dati falsi e di produzione. – bkwdesign

risposta

11

Una cosa da tenere a mente è che si tratta di una compilation vincolante, non un'esecuzione uno. Quindi, se esegui la stessa query 1 milione di volte, solo la prima esecuzione "colpirà" il tempo di ricerca, il resto riutilizzerà lo stesso piano e i piani saranno pre-associati (i nomi sono già stati risolti in ID oggetto).

+0

+1 Esatto: salva il sovraccarico della compilazione – gbn

1

Provalo? Basta scorrere un milione di query su entrambi e vedere quale finisce per primo.

Suppongo che sia un mucchio di cuccette però. Gli sviluppatori di MS SQL dedicano milioni di ore alla ricerca dell'efficienza per gli algoritmi di ricerca e i metodi di archiviazione solo per essere ostacolati dagli utenti che non specificano nomi di tabelle completi? Risibile.

0

Come ha detto Spencer - prova, ovviamente assicurati di svuotare la cache ogni volta in quanto ciò interferirà con i risultati.

http://www.devx.com/tips/Tip/14401

anche io sarei sorpreso se ha fatto alcuna differenza apprecible.

1

Il server SQL non eseguirà una ricerca aggiuntiva se lo schema predefinito è lo stesso. Dovrebbe essere incluso se non lo è ed è una query che viene usata molto.

Il nome del database non apporterà benefici alle prestazioni della query. Penso che questo potrebbe essere visto con il piano di esecuzione stimato in Management Studio.

4

In questo caso, preferirei personalmente la leggibilità per il piccolo aumento di prestazioni che potrebbe eventualmente causare.

SELECT * FROM Foo 

Sembra molto più facile per eseguire la scansione di:

SELECT * FROM MyDatabase.[dbo].Foo 
Problemi correlati