Ricerca su più valori

0

Ho un database con circa 15 tabelle. Attualmente sto lavorando su una pagina di generazione di report, che ha 16 criteri. I valori sono distribuiti tra più tabelle. L'utente può selezionare qualsiasi numero di criteri di ricerca. Il problema è che se l'utente inserisce valori di 2-3, è meglio filtrare prima per un determinato valore e quindi applicare il livello successivo di filtraggio sui valori rimanenti e questo ordine di filtraggio dipende sempre dall'utente. Ciò significa che devo controllare tutti i possibili modi di permutazione dell'input e dare un percorso di esecuzione per ciascuno, il che sarà orribile. C'è un modo per ridurre i percorsi di esecuzione. Non riesco a trovare un algoritmo efficiente.

Supponiamo di avere 3 parametri: name , skill , programExp

Se viene dato name , allora dovrei filtrare in base a name prima. Se viene dato skill , allora dovrei filtrare usando skill , programExp e poi name .

    
posta Renjith 25.03.2013 - 09:34
fonte

3 risposte

2

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.

    
risposta data 25.03.2013 - 14:40
fonte
1

Non dovresti codificare un "Tracciato di esecuzione Sql \ Albero decisionale del piano"

È necessario ottimizzare la query (singolare) per eseguire il meglio possibile senza alcun criterio. Quindi aggiungi una clausola Dynamic where che comprenda tutti i criteri di ricerca selezionati.

    
risposta data 25.03.2013 - 13:44
fonte
0

Come già suggerito in un commento, un indice di ricerca è una soluzione migliore per le query del database. Posso seguire il suggerimento di Thorsten di Apache Solr. Probabilmente potresti ottenere un indice di lavoro in un'ora.

    
risposta data 25.03.2013 - 13:32
fonte

Leggi altre domande sui tag