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: