Domanda

Uno dei miei posti di lavoro di mantenere la nostra banca dati, di solito abbiamo problemi con la mancanza di prestazioni durante il recupero di report e utilizzo di Pentecoste quella base.
Quando inizio a guardare domande che il nostro ERP invio di dati Vedo un sacco di domande del tutto inutilmente subselect all'interno query principali.
Come io non sono membro di sviluppatori che è creatore del programma che utilizza, a loro non piace molto quando io critico che codice e lavoro. Diciamo che non prendere la mia recensione come affermazioni gravi. Quindi ho chiesto qualche domanda su subselect in SQL

La selezione secondaria sta prendendo un sacco di tempo più esterno si unisce poi a sinistra?
Non esiste qualsiasi blog, articolo o qualsiasi cosa in cui mi subselect si raccomanda di non usare?
Come posso dimostrare che se evitiamo subselesct nella query quella query sta per essere più veloce?

Il nostro server di database è MSSQL2005

È stato utile?

Soluzione

"Show, Do not Tell" - esaminare e confrontare i piani di query delle query identificate utilizzando SQL Profiler. Particolarmente guardare fuori per scansioni di tabella e ricerche di segnalibro (che si desidera vedere indice cerca più spesso possibile). La 'bontà di adattamento' di piani di query dipende da statistiche up-to-date, ciò che gli indici sono definiti, il olistica interrogazione carico di lavoro.

Esegui le query in SQL Server Management Studio (SSMS) e accendere query-> Includere piano di esecuzione effettivo (CTRL + M)

Pensate fortunato Stanno solo subselect (che in alcuni casi l'ottimizzatore produrrà equivalente 'unirsi a piani') e non correlato sub-query!

Identificare una query che esegue un elevato numero di letture logiche, ri-scrittura utilizzando la vostra tecnica preferita e poi mostrare come poche Logicals legge lo fa tramite il confronto.

Ecco un suggerimento. Per ottenere letture eseguito il numero totale di logica, avvolgere una query in questione con:

SET STATISTICS IO ON
GO

-- Run your query here

SET STATISTICS IO OFF
GO

Esegui la tua ricerca, e passare alla scheda messaggi nel riquadro dei risultati.

Se siete interessati a saperne di più, non v'è nessun libro migliore di SQL Server 2008 Query performance Tuning distillata , che copre le tecniche essenziali per il monitoraggio, l'interpretazione e la risoluzione dei problemi di prestazioni.

Altri suggerimenti

Una cosa che si può fare è di caricare SQL Profiler e mostrare loro il costo (in termini di cicli di CPU, legge e scrive) dei sub-query. E 'difficile discutere con freddo, le statistiche dure.

Vorrei anche verificare il piano di query per queste query per rendere sicuri gli indici appropriati vengono utilizzati, e le scansioni di tabella / indice sono detenuti al minimo.

In generale, non direi sub-query sono male, se usati correttamente e gli indici siano in atto adeguate.

Io non sono molto familiare con MSSQL, come stiamo usando postrgesql nella maggior parte delle nostre applicazioni. Tuttavia ci dovrebbe esistere qualcosa come "spiegare" che mostra il piano di esecuzione per la query. Ci si dovrebbe essere in grado di vedere le varie fasi che una query produrrà, al fine di recuperare i dati necessari.

Se si vede c'è un sacco di scansioni di tabella o join di loop senza l'utilizzo degli indici è sicuramente un suggerimento per l'esecuzione di query lente. Con tale strumento una si dovrebbe essere in grado di confrontare i due query (uno con il join, l'altra senza)

E 'difficile stato che è il modo migliore, perché in realtà dipende molto gli indici l'ottimizzatore può assumere nei vari casi ea seconda del DBMS l'ottimizzatore può essere in grado di riscrivere implicitamente una sottoquery-query in un join -query ed eseguirlo.

Se davvero si vuole dimostrare che è meglio devi eseguire entrambi e misurare il tempo, cpu-utilizzo e così via.

UPDATE: Probabilmente è questa per MSSQL -> QueryPlan

Dalla mia esperienza entrambi i metodi può essere valido, come ad esempio un EXISTS selezione secondaria può evitare un sacco di trattamento con un'interruzione precoce.

Buts la maggior parte delle query di tempo con un sacco di selezione secondaria sono fatto da sviluppatori che non capisco SQL e usano il loro modo classico-procedurale-programmatore di pensare su query. Quindi non hanno nemmeno pensare unisce, e fa alcune query Awfull. Quindi preferisco unisce, e ho sempre controllare sottoquery. Per essere completamente honnest a monitorare query lente, e il mio primo tentativo sulla query lente contenenti subselect sta cercando di fare si unisce. Funziona un sacco di tempo.

Ma non c'è nessuna regola che può stabilire che selezione secondaria sono cattivi o più lento rispetto unisce, è solo che male programmatore SQL spesso fanno subselect: -)

La selezione secondaria sta prendendo un sacco di più tempo esterno poi a sinistra si unisce?

Questo dipende dalla subselect e esterno sinistro si unisce.

In generale, questo costrutto:

SELECT  *
FROM    mytable
WHERE   mycol NOT IN
        (
        SELECT  othercol
        FROM    othertable
        )

più efficiente di questo:

SELECT  m.*
FROM    mytable m
LEFT JOIN
        othertable o
ON      o.othercol = m.mycol
WHERE   o.othercol IS NULL

Vedere qui:

non esiste qualsiasi blog, articolo o qualsiasi cosa in cui subselect si consiglia di non utilizzare?

Vorrei evitare di blog che raccomandano ciecamente alla subselect evitare.

Si sono implementate per un motivo e, che ci crediate o no, gli sviluppatori hanno messo qualche sforzo in ottimizzazione di loro.

Come faccio a dimostrare che se evitiamo subselesct nella query quella query sta per essere più veloce?

Scrivi una query senza le subselect che corre più veloce.

Se pubblichi la query qui forse sarà in grado di migliorarlo. Tuttavia, una versione con i subselect potrebbe rivelarsi più veloce.

Prova riscrivere alcune delle domande rivolte per eliminare il sub-selezionare e confrontare i tempi di esecuzione.

Condividere e godere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top