Vado sul presupposto che i risultati della query siano i risultati di un JOIN
filtrato utilizzando una clausola WHERE
.
I have to check all the possible ways of input permutation and give
execution path for each, which will be horrible.
Sarà orribile. Sembra che tu stia cercando di fare qualcosa che un database decente fa già per te.
I buoni database hanno un ottimizzatore di query il cui compito è esaminare le query in arrivo e trovare un piano di esecuzione per eseguirlo. I piani sono costruiti per consumare il minor numero di risorse (CPU, memoria, accesso allo storage) mentre rispondono alle richieste in modo rapido e corretto. I fattori principali che entrano in queste decisioni sono le tabelle utilizzate, le condizioni JOIN
, le clausole WHERE
, gli indici disponibili e le statistiche delle tabelle. Ad esempio, se l'ottimizzatore rileva che una delle tue clausole WHERE
può tagliare il set di risultati di un JOIN
da un miliardo di righe a, diciamo, mille, tale condizione verrà applicata prima piuttosto che dopo, quindi un minor numero di risultati intermedi avrà da gestire.
Ciò significa per te che non devi preoccuparti di quale ordine applichi le condizioni. Impilarli in una clausola WHERE
e l'ottimizzatore si prenderà cura di tutto il resto. Una volta che hai funzionato e lavorato correttamente, puoi preoccuparti di farlo funzionare rapidamente se hai stabilito che le tue query sono un collo di bottiglia . La cura non tenterà quasi mai di superare in astuzia l'ottimizzatore o di gestire i dati da solo, ma ottimizzerà il database in modo che l'ottimizzatore abbia ciò di cui ha bisogno per fare un lavoro migliore. I database con ottimizzatori spesso dispongono di una funzione EXPLAIN
o SHOW PLAN
che ti consente di vedere che cosa viene generato dall'ottimizzatore per una determinata query e le parti che causano problemi di prestazioni si attaccheranno come un pugno.
Bottom line: crea una query basata sulle condizioni in vigore e lascia che il database faccia il suo lavoro.