Sql_celko - 14. fejezet
14. fejezet Az állítmány [NOT] IN
Kinevezés állítmány inkább nyilvánvaló. Ez ellenőrzi, hogy az érték az adott értékek listája. SQL-89 szabvány lehetővé teszi az egyszerű ellenőrzést csak skalár mennyiségek, de az SQL-92 szintén megengedett kifejezést. állítmány szintaxist:
14.1. Optimalizálása predikátum
A legtöbb adatbázis feldolgozók nem vezetnek statisztikát, hogy milyen gyakran vannak állandók értékeit listában, mert skanmruyut listája sorrendben jelennek meg. Általános szabályként, a lista szerinti sorrendben, az abszolút értéke az elemek, vagy ABC sorrendben, de a legjobb, hogy ezt a leggyakrabban előforduló értékek ritkább. Semmi értelme, hogy a listán az ismétlődések mint állítmány TRUE értékkel tér vissza, mint csak úgy találja, az első példányt, és soha nem megy a második. Sőt, még ha ez megtörténik, akkor az megjelenik HAMIS választ, hogy a további felhasznált mozogni egy hosszú listát a számítógép időveszteség hiába.
A legtöbb SQL processzor teljesít predikátum allekérdezés első helyen az eredmény egy ideiglenes munka asztal, és akkor a beolvasott balról jobbra. Néha ez vezet a nagy erőforrások pazarlását. Például, hogy megtanulják a nevét a személy, aki eladja a város jegyeket sporteseményekre, lehetséges, hogy írjon egy lekérdezés:
Várható, hogy a kombináció (város, állam) egyedülálló. De nézzük meghosszabbítja a példáját, és azt feltételezik, hogy a személyzet él n városok és sportolók városokban található, így annyira ahol nagy n. Ha a kívánt város lesz a lista tetején által generált allekérdezés, az utóbbi fejezi be munkáját sokkal gyorsabban, mint ha azokat a végén található a listán. Az eredmények bemutatása egy kifejezés segédlekérdezés tartalmazó kérését nem lehet szabályozni.
Azonban, akkor rendezni a megjelenése a kifejezések a listában, forgalomba őket, hogy a legnagyobb valószínűséggel jelenik meg ott.
SQL-92 szabvány lehetővé teszi, hogy hasonlítsa össze húr kifejezést, és ha a végrehajtás során az SQL létrehozott külön oszlopban a város és az állam, akkor lehet írni egy kifejezést:
Ezután lépjen az adatokat táblázat, és válassza ki a versenyző szemszögéből egy oszlopon a SELECT utasításban.
Ha QualityGuide.stars indexelt oszlop, az SQL processzor valószínűleg építeni egy ideiglenes táblát négy-csillagos éttermek, és adja meg a külső igény. Az utolsó fogja kezelni, mintha egy listát állandók.
Azonban, mint általában, ezek az oszlopok nem indexelt. Ebben az esetben a processzor végzi szekvenciális keresésének QualityGuide táblázatban. Ez a kérés helyébe más - kérdezi csatlakozni.
Az ilyen kérelmet fog működni gyorsabban restname kulcsfontosságú mindkét tábla, és ezért kell használni annak biztosítására, egyediségét. Ugyanakkor azt is vissza ismétlődő sorokat, ami feldolgozza a KIVÁLASZTOTT KÜLÖNÁLLÓ nyilatkozatot. Tegyük fel, hogy meg akarja találni egy étterem, ahol lehet enni kevesebb, mint $ 10, és az Ön rendelkezésére áll egy referencia menü mindenféle ételeket. A lekérdezés körülbelül ugyanaz, mint korábban:
Úgy tűnik, hogy lehet helyébe a következő:
Azonban, ennek eredményeként az utóbbi jelenik meg több sornyi, amelyek mindegyike megfelel az egyik eleme helyezi Murphy Két dollár Hash House. Ennek orvoslására, akkor ki kell cserélni a SELECT restname, telefon a KIVÁLASZTOTT KÜLÖNÁLLÓ restname, telefon, de az a fajta, hogy távolítsa el a másolatokat némi időt vesz igénybe. Ha azt szeretnénk, hogy megtalálják a legjobb megoldás, kísérlet egy adott terméket.
Állítmány NEM, talán a legjobb, hogy cserélje ki az állítmány NEM létezik. Térjünk vissza a például éttermek. Mondjuk azt tapasztaltuk, hogy a barátunk Johnnak iskolák listáját, és azt akarjuk megtudni azokat, amelyek nem szerepelnek a könyvtárban. Kérjen legkézenfekvőbb formája:
Ha írsz a állítmány NEM létezik, akkor gyorsabban fog futni:
Ennek oka az a növekedés sebessége használni az indexek mindkét tábla. NEM változat ellenőriznie kell az egyenlőtlen minden érték a segédlekérdezés asztalra. Végrehajtása SQL gyakran épített egy ideiglenes tábla a eredmények a allekérdezés predikátum III, kivéve, ha tartalmaz egy WHERE, de az ideiglenes tábla nem indexek. Továbbá, ez tartalmazhat ismétlődések, és a vonalak ott lehet rendezetlen, így a processzor lesz, hogy végezzen teljes.
14.2. Cseréje az üzemeltető vagy predikátum
Novice programozók gyakran figyelmen kívül hagyják azt a lehetőséget helyett a predikátum állítmány csoport egyesül az üzemeltető vagy. Például:
Ez a lekérdezés átírható, mint:
Az ok hiányában az ilyen kérés, hogy a programozók vannak szokva, hogy akár subqueries vagy egyszerű listák állandók. Ezek azonban figyelmen kívül hagyni azt a tényt, hogy a predikátum lista lehet kifejezések listája. A WHERE záradék optimalizáló kezeli az összes eredeti predikátumok külön, de predikátum úgy dolgozzuk fel, egyik eleme, amely megváltoztathatja a kiértékelés. Egyes kéri, ez a folyamat kevesebb időt vesz igénybe, mint a megmunkálás állítmány lista csatlakoztatva vagy.
14.3. NULL-értékek és állítmány IN
A megjelenése NULL értékek az állítmány NEM vezethet bizonyos problémák. Tekintsük a következő két táblázat:
Tekintsük a szakaszában annak végrehajtását.
1. Végezze el a allekérdezés:
2. Alakítsa át az állítmány NEM igenlő:
3. Bontsa ki a predikátum:
4. Alkalmazza az eredmény a törvény De Morgan:
5. Az általunk használt konstans logikai kifejezés:
6. Csökkentjük az utolsó sorban az állandó
7. Az eredmény mindig üres.
Ellenőrizze, hogy más táblázatok:
Elemezzük ismét a végrehajtási szakaszai azonos lekérdezés.
1. Végezze el a allekérdezés:
2. Alakítsa át az állítmány NEM egy logikai kifejezés:
3. Bontsa ki a predikátum:
4. Alkalmazza a törvény a De Morgan:
5. kiszámításához az eredményt. Megmutatom, mint egy unió a helyettesítések:
6. Az eredmény egy egysoros = (4).
14.4. Predikátum és referencia-határérték
Nagyon gyakran predikátum [N használt mondatban CHECK () táblázat. Tipikusan ilyen esetben, ez egy listát az érvényes értékek oszlopok, például:
Ez a módszer jól működik a kis értékek listáját, de amikor azok a hosszabb listák problémát. Ahhoz, hogy gyorsítsák fel a keresést, az érték kell helyezni a listán a sorrendet, amely gyorsan megtalálja az összes egyező kétbetűs state_code.
A teljes verzió az SQL-92 szabvány, ez lehet hivatkozni más táblákhoz, így ugyanaz a kényszer lehet újraírni az alábbiak szerint: