SQL lekérdezésoptimalizálási technikák

SQL lekérdezésoptimalizálási technikák

Forrás csomópont: 1985278

SQL lekérdezésoptimalizálási technikák
A kép szerzője
 

Kezdő szinten csak az SQL-lekérdezések írására és futtatására koncentrálunk. Nem foglalkozunk azzal, hogy mennyi időt vesz igénybe a végrehajtás, vagy hogy képes-e kezelni több millió rekordot. Ám középszinten az emberek azt várják, hogy a lekérdezés optimalizálva legyen, és a végrehajtása minimális időt vesz igénybe.

Az optimalizált lekérdezések írása nagy, több millió rekordot tartalmazó alkalmazásokban, például e-kereskedelmi platformokon vagy banki rendszerekben, elengedhetetlen. Tegyük fel, hogy Ön egy e-kereskedelmi cég tulajdonosa több mint millió termékkel, és egy ügyfél keresni szeretne egy terméket. Mi van akkor, ha a háttérben írt lekérdezés több mint egy percet vesz igénybe a termék lekérése az adatbázisból? Gondolja, hogy az ügyfelek vásárolnak termékeket az Ön webhelyéről?

Meg kell értened az SQL lekérdezés optimalizálás fontosságát. Ebben az oktatóanyagban néhány tippet és trükköt mutatok be az SQL-lekérdezések optimalizálásához és gyorsabb végrehajtásához. Az elsődleges feltétel, hogy rendelkezzen alapvető SQL ismeretekkel.

Annak ellenőrzéséhez, hogy egy adott elem szerepel-e a táblázatban, használja a EXIST() kulcsszó helyett a COUNT() optimalizált módon fogja futtatni a lekérdezést.

<p></p> COUNT(), a lekérdezésnek meg kell számolnia az adott elem összes előfordulását, amely nem hatékony, ha az adatbázis kiterjedt. Másrészről, EXIST() csak az adott elem első előfordulását ellenőrzi, majd megáll, amikor megtalálja az első előfordulást. Ezzel sok időt takaríthatunk meg.

Ezenkívül csak az érdekli, hogy egy adott elem jelen van-e vagy sem. Nem érdekli, hogy megtalálja az előfordulások számát. Ezért is EXIST() jobb.

SELECT EXISTS( SELECT * FROM table WHERE myColumn = 'val' );

 

A fenti lekérdezés visszatér 1 ha legalább egy táblázatsor olyan bejegyzést tartalmaz, ahol egy oszlop neve myColumn értéke egyenlő val. Ellenkező esetben vissza fog térni 0.

Mindkét char és a varchar adattípusok a karakterláncok táblázatban való tárolására szolgálnak. De varchar sokkal memóriahatékonyabb, mint char

A char adattípus csak a meghatározott fix hosszúságú karakterláncot tudja tárolni. Ha a karakterlánc hossza kisebb, mint a rögzített hosszúság, akkor kitölti az üres helyeket, hogy a hossza megegyezzen a beállított hosszúsággal. Ez feleslegesen pazarolja a memóriát a párnázásban. Például,CHAR(100) 100 bájt memóriát foglal el, még akkor is, ha egyetlen karakter van tárolva.

Másrészt a varchar adattípus tárolja a változó hosszúságú karakterláncot, amelynek hossza kisebb, mint a megadott maximális hosszúság. Nem tölti ki az üres helyeket, és csak a karakterlánc tényleges hosszával megegyező memóriát veszi fel. Például, VARCHAR(100) csak 1 bájt memóriát foglal el egyetlen karakter tárolásakor.

CREATE TABLE myTable ( id INT PRIMARY KEY, charCol CHAR(10), varcharCol VARCHAR(10)
);

 

A fenti példában egy táblázat myTable két oszlopból készül, charCol és a varcharCol char és varchar adattípusokkal. charCol mindig 10 bájt memóriát foglal el. Ellentétben, varcharCol a benne tárolt karakterlánc tényleges méretével megegyező memóriát vesz fel.

Az SQL-lekérdezések optimalizálásához kerülnünk kell a WHERE záradékon belüli részlekérdezések használatát. Mivel az allekérdezések drágák és nehézkesek lehetnek, ha nagy számú sort adnak vissza.

Az allekérdezés használata helyett ugyanazt az eredményt kaphatja egy összekapcsolási művelet használatával vagy egy korrelált részlekérdezés írásával. A korrelált részlekérdezés olyan segédlekérdezés, amelyben a belső lekérdezés a külső lekérdezéstől függ. És nagyon hatékonyak a nem korrelált részlekérdezéshez képest.

Az alábbiakban egy példa a kettő közötti különbség megértésére.

# Using a subquery
SELECT * FROM orders WHERE customer_id IN ( SELECT id FROM customers WHERE country = 'INDIA' ); # Using a join operation
SELECT orders.* FROM orders JOIN customers ON orders.customer_id = customers.id WHERE customers.country = 'INDIA';

 

Az 1. példában az allekérdezés először összegyűjti az összes INDIA-hoz tartozó ügyfél-azonosítót, majd a külső lekérdezés megkapja a kiválasztott ügyfél-azonosítók összes megrendelését. A 2. példában pedig ugyanazt az eredményt értük el, ha csatlakoztunk a customers és a orders táblázatokat, majd csak azokat a rendeléseket választja ki, amelyekhez a vevők INDIÁBAN tartoznak.

Ily módon optimalizálhatjuk a lekérdezést úgy, hogy elkerüljük a WHERE záradékon belüli segédlekérdezéseket, és könnyebben olvashatóvá és érthetővé tesszük őket. 

A JOIN a nagyobb táblából egy kisebb táblába történő művelet egy általános SQL optimalizálási technika. Mert ha egy nagyobb táblát egy kisebb táblához csatlakozik, akkor a lekérdezés gyorsabban végrehajtható. Ha alkalmazzuk a JOIN Egy kisebb táblából egy nagyobb táblába történő művelethez az SQL-motorunknak nagyobb táblában kell keresnie a megfelelő sorokat. Ez erőforrás- és időigényesebb. De másrészt ha a JOIN egy nagyobb táblából egy kisebb táblába kerül alkalmazásra, akkor az SQL-motornak egy kisebb táblában kell keresnie a megfelelő sorokat.

Íme egy példa a jobb megértés érdekében.

# Order table is larger than the Customer table # Join from a larger table to a smaller table
SELECT * FROM Order JOIN Customer ON Customer.id = Order.id # Join from a smaller table to a larger table
SELECT * FROM Customer JOIN Order ON Customer.id = Order.id

Ellentétben a LIKE kikötés, regexp_like mintakeresésre is használják. A LIKE A záradék egy alapvető mintaillesztő operátor, amely csak olyan alapvető műveleteket tud végrehajtani, mint pl _ or %, amelyek egyetlen karakterhez vagy tetszőleges számú karakterhez illeszkednek. A LIKE A záradéknak át kell vizsgálnia a teljes adatbázist, hogy megtalálja az adott mintát, ami nagy táblák esetén lassú.

Másrészt, regexp_like egy hatékonyabb, optimalizált és erőteljesebb mintakereső technika. Bonyolultabb reguláris kifejezéseket használ, hogy meghatározott mintákat keressen egy karakterláncban. Ezek a reguláris kifejezések specifikusabbak, mint az egyszerű helyettesítő karakterillesztés, mert lehetővé teszik, hogy pontosan az általunk talált mintára keressen. Ennek köszönhetően csökken a keresendő adatok mennyisége, és gyorsabban fut le a lekérdezés.

Felhívjuk figyelmét, hogy regexp_like előfordulhat, hogy nem minden adatbázis-kezelő rendszerben jelen van. Szintaxisa és funkcionalitása más rendszerekben eltérő lehet.

Íme egy példa a jobb megértés érdekében.

# Query using the LIKE clause
SELECT * FROM mytable WHERE ( name LIKE 'A%' OR name LIKE 'B%' ); # Query using regexp_like clause
SELECT * FROM mytable WHERE regexp_like(name, '^[AB].*');

 

A fenti lekérdezések az A-val vagy B-vel kezdődő elemek megkeresésére szolgálnak. Az első példában LIKE az összes A-val vagy B-vel kezdődő név keresésére szolgál. A% azt jelenti, hogy az első karakter A; ezt követően tetszőleges számú karakter jelen lehet. A második példában regexp_like használt. Belül ^[AB], ^ azt jelenti, hogy a szimbólum megegyezik a karakterlánc elején, [AB] azt jelenti, hogy a kezdő karakter lehet A vagy B, és .* az összes karaktert képviseli ezután.

<p></p> regexp_like, az adatbázis gyorsan ki tudja szűrni azokat a sorokat, amelyek nem egyeznek a mintával, javítva a teljesítményt és csökkentve az erőforrás-felhasználást.

Ebben a cikkben különféle módszereket és tippeket tárgyaltunk az SQL-lekérdezés optimalizálásához. Ez a cikk világosan megérti a hatékony SQL-lekérdezések írásának módját és azok optimalizálásának fontosságát. A lekérdezések optimalizálásának számos módja van, például az egész értékek használata a karakterek helyett, vagy az Union All használata az Union helyett, amikor a táblázat nem tartalmaz ismétlődéseket stb.
 
 
Aryan Garg egy B.Tech. Villamosmérnök hallgató, jelenleg az utolsó évfolyamon tanul. Érdeklődése a webfejlesztés és a gépi tanulás területe. Ezt az érdeklődést követte, és szívesen dolgozom tovább ezen az irányon.
 

Időbélyeg:

Még több KDnuggets