Perché è l'operazione TOP nel piano di esecuzione SQL


9

Dopo aver cercato per un po ', ho deciso di pubblicare questa domanda per mancanza di trovare una risposta e scusarmi se c'è una domanda / risposta simile là fuori.

Quando eseguiamo la query di seguito su due server SQL configurati in modo simile, incontriamo diversi piani di esecuzione che influiscono sulle prestazioni e abbiamo bisogno di aiuto per capire la causa.

La domanda:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Piano di esecuzione del server A Server B

Piano di esecuzione del server B Server B http://s2.postimg.org/z9fjrfv4n/server_B.png

Noterai che il server B ha l'operazione fisica TOP nel piano di esecuzione effettivo e stiamo cercando di capire perché. Entrambe le query utilizzano lo stesso indice nella ricerca indice.

Ecco alcuni dettagli del server A e del server B.

Server A e B sono entrambi

Windows Server 2008 R2 Standard Service Pack 1

24 GB di RAM

Sistema operativo a 64 bit

Versioni di SQL Server 2012 ottenute utilizzando ( SELEZIONA SERVERPROPERTY ('ProductVersion') )

Server Una versione SQL 11.0.3000.0

Server B SQL versione 11.0.5058.0

Cosa abbiamo provato

  1. Svuotare la cache delle procedure
  2. Ricostruzione degli indici
  3. Statistiche di aggiornamento
  4. SET ROWCOUNT 0 con il conteggio delle righe e via

Perché il server B ha il TOP nel piano di esecuzione? In questo semplice esempio di query non ci sono problemi reali, ma in una query più ampia il costo aumenta per il TOP e vediamo un successo nelle prestazioni. Qualsiasi aiuto per il debug di questo sarebbe molto apprezzato e possiamo fornirti tutte le informazioni aggiuntive di cui potresti aver bisogno per aiutarti.


L' TOPoperatore suggerisce che un diverso da zero SET ROWCOUNTera stato precedentemente eseguito su quella connessione. Riprovare con dopo l'esecuzione SET ROWCOUNT 0;. Inoltre, le versioni SQL che hai pubblicato non sono SQL 2008 R2. Eseguire SELECT SERVERPROPERTY('ProductVersion');sui 2 server per ottenere la versione effettiva di SQL Server.
Dan Guzman,

Ho aggiornato il post originale con le versioni sql usando la query di selezione fornita. I server su cui è installato sql sono server Windows 2008 R2 mentre i server sql installati sono il 2012. Come precedentemente suggerito da un altro membro poi eliminato, abbiamo provato a impostare ROWCOUNT su 0 senza alcuna modifica nel piano di esecuzione. Vedi la domanda aggiornata
Arthur Yegiazaryan,

Puoi mettere un GOdopo la riga del conteggio delle righe. Puoi pubblicare anche le proprietà dell'operatore Top?
Rob Farley,

Rob, ha aggiunto il GO e le proprietà da TOP al post originale
Arthur Yegiazaryan,

Risposte:


12

Verificare che il livello di compatibilità del database sia lo stesso sui 2 server. Ho eseguito un test rapido su un'istanza di SQL Server 2012 e ho visto l'operatore TOP introdotto se il livello di compatibilità è 100 o inferiore. A meno che non si abbia un motivo specifico per fare diversamente, è consigliabile utilizzare il livello di compatibilità 110 (SQL Server 2012) su un'istanza di SQL Server 2012.


2

Suppongo che tu abbia un valore per ROWCOUNT. Fare:

SET ROWCOUNT 0

... per spegnerlo.


1
SET ROWCOUNT 0 non ha rimosso il TOP dal piano di esecuzione
Arthur Yegiazaryan,

1
@Arthur Anche se questa non era la soluzione nel tuo caso, potrebbe essere la ragione del comportamento per i futuri lettori. (Mi dispiace Rob, mi sono preso la libertà di deselezionare il tuo post perché questo potrebbe davvero essere il problema per lo stesso sintomo.)
Aaron Bertrand

Aaron, ha accettato e grazie per averlo riportato. Non è la soluzione per me, ma potrebbe essere per gli altri.
Arthur Yegiazaryan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.