Il mio dipartimento è stato recentemente rimproverato (graziosamente) dal nostro reparto IT per l'esecuzione di query con costi molto elevati sulla base del fatto che le nostre query hanno una reale possibilità di destabilizzazione e/o arresto anomalo del database. Nessuno di noi è DBA; Erano solo ricercatori che scrivono ed eseguono query sul database, e io sono probabilmente l'unico che abbia mai esaminato un piano di spiegazioni prima del rimprovero.Costo della query rispetto alla velocità di esecuzione + parallelismo
Ci è stato detto che i costi di query superiori a 100 dovrebbero essere molto rari e le query con costi superiori a 1000 non dovrebbero mai essere eseguite. I problemi che sto incontrando sono che il costo sembra non avere alcuna correlazione con il tempo di esecuzione, e sto perdendo produttività mentre cerco di ottimizzare le mie query.
Come esempio, ho una query che viene eseguita in meno di 5 secondi con un costo di 10844. Ho riscritto la query per utilizzare una vista che contiene la maggior parte delle informazioni di cui ho bisogno e ho ottenuto un costo inferiore a 109, ma la nuova query, che recupera gli stessi risultati, impiega 40 secondi per essere eseguita. Ho trovato una domanda qui con una possibile spiegazione:
Measuring Query Performance : "Execution Plan Query Cost" vs "Time Taken"
Tale questione mi ha portato a suggerimenti parallelismo. Ho provato a utilizzare /*+ no_parallel*/
nella query 10884, ma il costo non è cambiato, né il tempo di esecuzione, quindi non sono sicuro che il parallelismo sia la spiegazione del tempo di esecuzione più veloce ma dei costi più elevati. Quindi, ho provato a utilizzare l'hint /*+ parallel(n)*/
e ho riscontrato che maggiore è il valore di n
, minore è il costo della query. Nel caso della query 10844 relativa al costo, ho riscontrato che lo /*+ parallel(140)*/
ha portato il costo a 97, con un aumento molto minore del tempo di esecuzione.
Questo sembrava un ideale "barare" per soddisfare le esigenze che il nostro reparto IT di cui, ma poi ho letto questo:
L'articolo contiene questa frase:
Parallel l'esecuzione può consentire a una singola operazione di utilizzare tutte le risorse di sistema.
Quindi, le mie domande sono:
Perchè sono effetti mette più a dura prova le risorse del server utilizzando il /*+ parallel(n)*/
suggerimento con un altissimo grado di parallelismo, anche se sto abbassando il costo?
Presumendo nessun parallelismo, la velocità di esecuzione è una misura migliore delle risorse utilizzate rispetto al costo?
Che bella spiegazione del motivo per cui le unità aziendali spesso impostano i propri database per aggirare le restrizioni IT. –