Sql_celko - Capitolul 14
Capitolul 14. Predicatul [NU] ÎN
Numirea în predicat destul de evident. Se verifică dacă o valoare într-o listă dată de valori. SQL standard-89 permite verificarea simplă numai cantități scalare, dar în SQL-92 a permis de asemenea exprimare. sintaxa predicat:
14.1. Optimizarea IN predicatul
Cele mai multe procesoare de baze de date nu păstrează statistici cu privire la cât de des există unele constante în lista de valori, și pentru că skanmruyut lista în ordinea în care apar. Ca regulă generală, lista ordonată de valoarea absolută a elementelor, sau în ordine alfabetică, dar cel mai bine este de a face acest lucru de la valorile cele mai frecvente care apar mai puțin frecvente. Nu are nici un sens pentru a pune în lista de duplicate ca predicat returneaza TRUE, cum ar fi găsește numai primul exemplar, și niciodată nu merge la al doilea. Mai mult decât atât, chiar dacă se întâmplă, acesta va fi afișat ca răspuns FALSE, astfel încât să se deplaseze suplimentar cheltuită o listă lungă de timp de calculator a pierdut în zadar.
Cele mai multe procesoare SQL pentru efectuarea predicat primul loc subinterogare rezultatul într-o masă de lucru temporar, iar apoi este scanat de la stânga la dreapta. Uneori, acest lucru duce la o mare risipă de resurse. De exemplu, pentru a afla numele persoanei care vinde la biletele de oraș la evenimente sportive, este posibil să se scrie o interogare:
Este de așteptat ca combinația de (oraș, stat) este unic. Dar să extindă exemplul și să presupunem că personalul trăiește în orașe și n echipe sportive sunt situate în orașe, astfel încât, atât de mult în cazul în care n mare. În cazul în care orașul dorit va fi în partea de sus a listei generate de interogarea secundară, acesta din urmă pentru a finaliza activitatea mult mai rapid decât în cazul în care acestea au fost localizate la sfârșitul listei. Prezentarea rezultatelor unei subinterogare de expresie care conține cererea sa nu poate fi controlată.
Cu toate acestea, aveți posibilitatea să sortați apariția expresiile din listă, plasându-le în ordinea cel mai probabil să apară acolo.
SQL standard-92 vă permite să comparați expresii șir, iar dacă în punerea lor în aplicare de SQL ați creat coloane separate pentru oraș și pentru stat, este posibil să se scrie o expresie:
Apoi, du-te la tabelul de date și selectați competitorul din punctul de vedere o coloană folosind instrucțiunea SELECT.
În cazul în care QualityGuide.stars indexate coloana, procesorul SQL este posibil de a construi un tabel temporar de la restaurante de patru stele, si da-l la o solicitare externă. Acum se va trata ca și cum ar fi o listă de constante.
Cu toate acestea, de regulă, aceste coloane nu sunt indexate. În acest caz, procesorul efectuează căutarea secvențială în tabelul QualityGuide. Această solicitare poate fi înlocuită cu o alta - cere JOIN.
O astfel de solicitare va funcționa mai rapid ca restname este o cheie pentru ambele tabele și, prin urmare, vor fi folosite pentru a asigura unicitatea. Cu toate acestea, el se poate întoarce rânduri duplicate, care pot procesa instrucțiunea SELECT DISTINCT. Să presupunem că doriți să găsiți un restaurant unde puteți mânca mai puțin de 10 $, iar la dispoziția dumneavoastră există un meniu de referință, cu tot felul de feluri de mâncare. Interogarea este aproximativ la fel ca înainte:
Se pare că acesta poate fi înlocuit cu următorul text:
Cu toate acestea, ca urmare a acesteia din urmă va apărea mai multe linii, fiecare dintre acestea corespunzând unuia dintre elementele locuri de doi dolari Hash Casa lui Murphy. Pentru a remedia acest lucru, este necesar să se înlocuiască restname SELECT, telefonul în SELECT DISTINCT restname, telefon, ci un fel pentru a elimina duplicatele va lua ceva timp. Dacă doriți să găsiți cea mai bună opțiune, experimentul cu un anumit produs.
Predicatul NU IN, probabil, cel mai bine pentru a înlocui predicat nu există. Să ne întoarcem la exemplul nostru cu restaurante. Să presupunem că am descoperit că prietenul nostru John are o listă de școli, și dorim să aflăm despre cei care nu sunt listate în directorul. Cerere de formă evidentă:
Dacă-l scrie cu predicat nu există, acesta va rula mai rapid:
Motivul pentru viteza de crestere a este de a utiliza indicii ambele tabele. NU în versiunea ar trebui să verifice inegalitatea tuturor valorilor din tabelul subinterogare. Punerea în aplicare a SQL este adesea construit un tabel temporar din rezultatele predicatului subinterogare III, cu excepția cazului în care conține o clauză WHERE, dar tabela temporară nu are indici. Mai mult decât atât, acesta poate conține duplicate, iar liniile din acestea poate fi dezordonate, astfel încât procesorul va trebui să efectueze o scanare completă.
14.2. Înlocuirea operatorului SAU ÎN predicatul
programatori Novice trece cu vederea de multe ori posibilitatea de a înlocui predicatului în grupa predicat, uniți de către operatorul OR. De exemplu:
Această interogare poate fi rescrisă ca:
Motivul pentru lipsa utilizării unei astfel de cereri este faptul că programatorii sunt obișnuiți să fie subinterogările sau simple liste de constante. Cu toate acestea, ei trec cu vederea faptul că lista predicatul IN poate fi o listă de expresii. Clauza WHERE de optimizare a se ocupa de toate predicatele originale, separat, dar predicat IN este procesat ca un element care poate modifica ordinea de evaluare. Pentru unele cereri, acest proces poate dura mai puțin timp decât prelucrarea lista predicatul conectat SAU.
14.3. NULL-valori și predicat IN
Apariția NULL valori în predicatul NOT IN poate duce la anumite probleme. Luați în considerare următoarele două tabele:
Luați în considerare etapele punerii sale în aplicare.
1. Efectuați interogarea secundară:
2. Transformarea predicatul NU IN afirmativ:
3. Extindeți IN predicatul:
4. Aplicați rezultatul legii De Morgan:
5. Noi folosim expresia logică constantă:
6. Reducem ultima linie la constanta
7. Rezultatul va fi întotdeauna goală.
Verificați pentru alte tabele:
Să analizăm din nou etapele de punere în aplicare a aceleiași interogări.
1. Efectuați interogarea secundară:
2. Transformarea predicatul NU IN într-o expresie logică:
3. Extindeți IN predicatul:
4. Se aplică legea De Morgan:
5. calcula rezultatul. Eu va arăta ca o uniune cu substituții:
6. Rezultatul este un singur rând = (4).
14.4. Predicatului IN și limita de referință
Foarte des predicat [N utilizat în CHECK propoziție) de masă (. De obicei, într-un astfel de caz, este o listă de coloane valori valide, de exemplu:
Această metodă funcționează bine pentru liste mici de valori, dar atunci când sunt aplicate la liste mai lungi de probleme. Pentru a accelera de căutare, valoarea ar trebui să fie introduse pe lista în ordinea în care puteti gasi rapid tot ce se potrivesc cu două litere de cod state_code.
Versiunea completă a standardului SQL-92, este posibil să se facă referire la alte tabele, astfel încât aceeași constrângere poate fi rescrisă după cum urmează: