domenica 11 settembre 2011

Legati comportamento Server quando viene utilizzato sulle clausole JOIN


Recentemente, un cliente aveva alcuni problemi di prestazioni con una query che ha eseguito un join con una tabella remota utilizzando un server collegato. Il cliente ha chiesto perché query simili, che utilizzano filtri sui tavoli locali e tornò poche righe, a volte compilare query IO costoso sul server remoto.
E 'importante sapere come query SQL Server compilare con tabelle remote, questo ci aiuterà per sintonizzare le nostre domande e avere buoni tempi di risposta, perché usando meno IO e il trasferimento di meno dati sulla rete avremo una migliore performance.
Quando si lavora con i server collegati è molto importante sapere che SQL Server devono inviare i dati dal server remoto al server che sta chiamando l'oggetto remoto per valutare e applicare i filtri definiti nella clausola JOIN.
Quando si utilizza server collegati su una clausola JOIN, SQL Server compilare il piano migliore per eseguire la query, evitando inutili trasmissione di dati attraverso la rete, per cui la query avrà meno tempo per l'esecuzione.Rivediamo alcuni esempi passo passo su come SQL Server gestisce le query che coinvolgono tabelle remote:
CASO 1: Il seguente esempio il JOIN utilizza una tabella remota e senza filtri sono sul posto. Si può vedere che tutti i record vengono restituiti dal server remoto, perché quando non si hanno filtri tutti i record sono necessari sul server locale per valutare ed eseguire la condizione di join.
 
CASO 2: alla query caso 1 abbiamo applicato un filtro su una colonna della tabella remota. Si può vedere che SQL Servire controllare le statistiche della tabella remota per costruire il miglior query, e si può vedere la dichiarazione di filtro per la tabella remota sulla colonna identificata
 
3a CASE: alla query caso 1 abbiamo applicato un filtro su una colonna della tabella locale. Si può vedere che SQL Server prima di applicare il filtro e se ottiene un numero basso di valori diversi (relativi per richiesta) dopo l'applicazione del filtro, si costruisce una query per ottenere solo i dati necessari dalla tabella remota utilizzando la condizione di join sul campo corrispondente, e questo sarà eseguito tante volte quanto diversi valori di ritorno il filtro sulla tavola locale.

3b CASE: alla query caso 1 abbiamo applicato un filtro su una colonna della tabella locale. Si può vedere che SQL Server prima di applicare il filtro e se si ottiene un elevato numero di valori diversi (relativi per richiesta) dopo l'applicazione del filtro, SQL Server invierà una query senza filtri, specifica solo le colonne necessarie e ordina il risultato sul campo condizione JOIN per aiutare l'esecuzione, in quanto sarà necessario eseguire un Merge Join invece di un ciclo nidificato Join.
NOTA: vedrete questo comportamento sia con l'esistenza di un indice sul campo JOIN o non

CASE 4a: alla query caso 1 abbiamo applicato un filtro su una colonna della tabella locale che causa che nessun record viene restituito per la tabella e quindi nessun record viene restituito per la query. Come si può vedere SQL Server non esegue una query per restituire i dati (perché non è necessario), tuttavia sarà stabilire una sessione al server remoto ed eseguire alcune query per tornare statistiche e per ottenere un blocco di schema sulla tabella remota.

La stessa cosa accadrà quando si esegue la forma stessa query il caso 1, ma con una condizione che fa sì che nessun record viene restituito quando il suo filtro applicato sulla tabella remota: no query per restituire i dati viene eseguito dopo aver controllato le statistiche tabella remota.

CASE 4b: alla query caso 1 abbiamo applicato un filtro su una colonna della tabella locale che causa che nessun record viene restituito per la tabella e quindi nessun record è tornato per la query, inoltre abbiamo inserito un filtro sulla tabella remota in un colonna che hanno un indice UNIQUE definito, si può vedere che a differenza della 4a caso, SQL Server esegue una query sul server remoto utilizzando un filtro sulla colonna indicata a distanza.

NOTA: SINISTRA DESTRA ENTRA ENTRA e si comporterà esattamente come un JOIN EQUAL. Le query inviare al server remoto sarà costruito a seconda dei dati da restituire, indici e le statistiche.
Nel caso riportato dal mio cliente, la differenza tra le esecuzioni di query simili è stato causato perché SQL Server non è stato in grado di creare le migliori query da eseguire sul server remoto dopo aver aggiunto uno o due condizioni per la query, e la situazione era ancora peggio a causa di statistiche obsolete sui database locali e remoti.
Dopo aver esaminato il comportamento di SQL Server quando si utilizzano server collegati sulle clausole JOIN, possiamo concludere:
  • Statistiche Mantenere aggiornato non è importante solo per SQL Server per compilare i migliori piani di esecuzione per le operazioni locali, sono importanti anche quando si utilizzano server collegati al fine di definire se è necessario eseguire una query sul server remoto, e se necessario userà loro di costruire il miglior query per restituire la quantità minima di dati possibile.
  • Anche se SQL Server determina che non è necessario eseguire una query sul server remoto per soddisfare la query, SQL Server stabilire una connessione, statistiche delle query e applicare serrature schema sull'oggetto remoto, e questo potrebbe portare ad alcuni ritardi e il blocco, per esempio, un blocco di schema precedente sull'oggetto porterà ad un blocco.
  • Sui volti sviluppo e la risoluzione dei problemi, analizzando la query SQL Server viene eseguito sul server remoto è davvero utile per identificare la causa principale di ciò che sembra essere un cattivo comportamento. La 3a e 3b casi sono esempi di casi sui quali la distribuzione, il volume di dati e statistiche potrebbero portare a una grande differenza sulle prestazioni. Casi 4a e 4b sono esempio di SQL Server potrebbe progettare la query remote in modo diverso solo grazie all'utilizzo di diverse condizioni.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.