Esiste un modo per impedire la potatura della struttura del memo?


8

Sappiamo che la struttura dei memo viene eliminata e alcuni piani alternativi costosi vengono scartati durante l'ottimizzazione. Mi chiedevo se ci fosse un modo per impedirlo e lasciare che l'ottimizzatore prendesse semplicemente in considerazione ogni piano possibile e selezionasse il meglio da tutte le alternative?


3
Non è chiaro cosa vuoi prevenire. Vuoi forzare in qualche modo l'ottimizzatore a calcolare un costo per tutti i possibili piani (che può essere su trilioni di miliardi di miliardi, anche per una semplice query con 10 join)?
ypercubeᵀᴹ

si, anche se non sembra possibile. Vorrei forzare l'ottimizzatore a prendere in considerazione tutti i possibili piani, calcolare i loro costi e quindi scegliere il più economico.
zli89,

4
E perché dovrebbe farlo? Se ha calcolato di dire un piano con costo = 7 e poi scopre che qualsiasi piano che includerà a hash join bavrà un costo di 10 o più, perché calcolare tutti quei milioni di piani e non eliminarli? (non che l'ottimizzatore
funzioni in

Risposte:


12

Sappiamo che la struttura dei memo viene eliminata e alcuni piani alternativi costosi vengono scartati durante l'ottimizzazione. Mi chiedevo se ci fosse un modo per impedirlo e lasciare che l'ottimizzatore prendesse semplicemente in considerazione ogni piano possibile e selezionasse il meglio da tutte le alternative?

Esiste, ma non lo pubblicizzo perché sarebbe frainteso e applicato male. In ogni caso, non si tradurrebbe in una ricerca esaustiva dello spazio del piano perché sono implementate solo una serie limitata di trasformazioni (quelle che normalmente producono buoni risultati).

Prevenire la potatura e il rigetto in genere comporterebbe semplicemente tempi di compilazione (molto) più lunghi senza un notevole miglioramento della qualità del piano finale, se presente.

In definitiva, la domanda è naturale e ragionevole, ma si basa su un fraintendimento degli obiettivi di Query Optimizer di SQL Server: è progettato per trovare rapidamente buoni piani per le query comuni. Non è costruito su un framework progettato per una ricerca esaustiva.

Se hai una situazione nel mondo reale che trarrebbe beneficio da un diverso approccio all'ottimizzazione, potresti farlo sul sito Web Connect (anche se penso che sia improbabile che Microsoft investa le risorse di ingegneria necessarie).


9

Non esiste alcun pomello o flag di traccia che conosco per forzare questo comportamento in alcun modo (anche se Paul White menziona qui alcuni flag di traccia che offrono maggiore visibilità e consentono di persuadere alcuni delta di comportamento ).

Microsoft fornisce un sacco di armi, ma questo sarebbe quasi garantito per puntare esattamente ai tuoi piedi il 100% delle volte. Quando si esegue una query per la prima volta, non credo che si desideri che SQL Server passi una quantità infinita di tempo a costruire ogni singola variazione possibile di un piano per ottenere i risultati desiderati. Come menziona @ypercube, questo potrebbe essere un numero molto elevato di piani e vanificherebbe lo scopo di eseguire la query. Il tuo obiettivo nell'eseguire una query, in primo luogo, presumibilmente, è quello di restituire i dati ad un certo punto, giusto? E "un certo punto" deve rientrare in determinate soglie, poiché a determinati livelli dell'applicazione verranno applicati vari timeout di query / comandi e gli utenti aspetteranno solo il caricamento di una pagina ...

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.