Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Buktatók - Adatbázis továbbképzés

Buktatók - Adatbázis továbbképzés

Mik a leggyakoribb, fejlesztők által elkövetett hibák, amik terheléshez, és problémákhoz vezetnek az adatábzis karbantartás során.

Avatar for Bence Faludi

Bence Faludi

November 04, 2012
Tweet

More Decks by Bence Faludi

Other Decks in Technology

Transcript

  1. •  NULL értékek problémája Ismeretlen érték, amely kiértékeléskor 3VL-t használ.

    •  DISTINCT ON elmarad Elfeledkezés arról, hogy az adatbázis állapota és adatai soha sem tökéletesek, és minden rendszerben van duplikáció. •  Tárolt eljárások, nézetek kihagyása Kész dolgok újboli feltalálása, hiányosan. •  Hibás összekapcsolások használata Mik is ezek a buktatók?
  2. •  Másodlagos Index-ek hibás kezelése Állandó B-fa generálás táblákon, …

    •  Szűrési feltételek helyében hiba Allekérdezések használatakor feltételek elhelyezésének jelentése és következményei •  Szöveg vizsgálata •  Adatbázis optimalizáció hiánya Nem ismert fogalmak, ismeretlen módszerek, … Mik is ezek a buktatók?
  3. •  Nem definiált érték, amely nincs benne semmilyen értéktartományban. • 

    Háromértékű logika kiértékeléskor. NULL értékek problémája AND F N T F F F F N F N N T F N T OR F N T F F N T N N N T T T T T NOT F T N N T F
  4. •  Ha egy aritmetikai művelet egyik operandusa NULL, akkor az

    eredménye is NULL lesz. •  Ha egy NULL egy összehasonlításban szerepel akkor az összehasonlítás eredménye UNKNOWN lesz. •  Egy állítás így lehet ismeretlen értékű is, WHERE-ben azonban csak az fog találatnak számítani, ami kiértékelve TRUE. NULL értékek problémája
  5. •  Adatbázis értékei soha sem tökéletesek, mindig tartalmaznak valamekkora duplikációt.

    •  Ha a feladat megköveteli a duplikáció mentesítést a lekérdezésben (pl. számosság) mindig tegyük hozzá. •  Paramétereinek listája kritikus! DISTINCT ON elmarad
  6. DISTINCT ON elmarad SELECT DISTINCT ON ( co.surname, co.firstname, co.company_name,

    co.postal_code, co.city, co.street ) co.*, … FROM … ORDER BY co.surname, co.firstname, co.company_name, co.postal_code, co.city, co.street, KRITIKUS RENDEZÉS •  Az ORDER BY-ban szereplő nem DISTINCT ON-ban felsorolt oszlopok sorrendezése dönt arról, melyik értékek maradnak meg az eredményhalmazban. •  Figyelj az oszlopokra, minél több van, annál nagyobb lesz az ismétlődés.
  7. •  Ellenőrizzed le, milyen nézetek és tárolt eljárok vannak a

    rendszerben. Ha pedig még nincs a feladathoz, hozzad létre. •  Könnyebb egy VIEW-t karban tartani, mint akár több száz helyen a PHP kódot. •  Soha ne legyen duplikáció az eljárásokban! •  Mindenhez írj ellenőrzést! Tárolt eljárások, nézetek kihagyása
  8. Tárolt eljárások, nézetek kihagyása CREATE OR REPLACE VIEW "public"."valid_ownerships" AS

    SELECT oin.id, oin.ind_id, oin.vin, … dd.dealer_code AS "odealer_code", COALESCE( oin.start_date_of_ownership, oin.purchase_date, oin.invoice_date ) AS spidate, COALESCE( oin.purchase_date, oin.start_date_of_ownership, oin.invoice_date ) AS psidate FROM ownership oin INNER JOIN individual AS ind ON ( ind.id = oin.ind_id ) INNER JOIN household AS hh ON ( hh.id = ind.hh_id ) LEFT OUTER JOIN dealer AS dd ON ( dd.id = oin.dealer_id ) WHERE oin.vin IS NOT NULL AND CHAR_LENGTH( TRIM( both from oin.vin ) ) = 17 AND TRIM( both from oin.vin ) SIMILAR TO '[a-zA-Z0-9]+’ AND DATE_PART( 'year', COALESCE( oin.start_date_of_ownership, oin.purchase_date, oin.invoice_date ) ) > 1980 AND DATE_PART( 'year', COALESCE( oin.purchase_date, oin.start_date_of_ownership, oin.invoice_date ) ) > 1980 AND COALESCE( oin.start_date_of_ownership, oin.purchase_date, oin.invoice_date ) <= CURRENT_DATE AND COALESCE( oin.purchase_date, oin.start_date_of_ownership, oin.invoice_date ) <= CURRENT_DATE;
  9. Tárolt eljárások, nézetek kihagyása CREATE OR REPLACE VIEW "public"."current_ownerships" AS

    SELECT voin.*, voin.spidate AS "pdate" FROM valid_ownerships voin WHERE voin.end_date_of_ownership IS NULL OR voin.end_date_of_ownership > CURRENT_DATE ORDER BY voin.spidate DESC NULLS LAST; CREATE OR REPLACE VIEW "public"."last_current_ownership" AS SELECT DISTINCT ON ( co.surname, co.firstname, co.company_name, co.postal_code, co.city, co.street ) co.*, m.name AS model_name FROM current_ownerships co LEFT JOIN model AS m ON ( m.id = co.model_id ) ORDER BY co.surname, co.firstname, co.company_name, co.postal_code, co.city, co.street , co.pdate DESC NULLS LAST;
  10. •  Összekapcsolások fajtái: Direktszorzat, Természetes, USING utasítással történő, Teljes vagy

    kétoldali, Tetszőleges feltételen alapuló. •  Összekapcsolások irányai: Belső, Külső, Teljes külső Hibás összekapcsolások használata
  11. •  Belső összekapcsolás: Azon összekapcsolások, amelyek két tábla megegyező soraival

    térnek vissza. •  Külső összekapcsolás: Két tábla olyan összekapcsolását, amely a belső összekapcsolás eredményeihez hozzáveszi a bal (vagy jobboldali) tábla összes sorát, baloldali vagy (jobboldali) külső összekapcsolásnak nevezzük. •  Teljes külső összekapcsolás: Amikor a külső összekapcsolás egyszerre bal- és jobboldali. Hibás összekapcsolások használata
  12. #1: Nem kötelező kiegészítő információk gyűjtésekor rekordokhoz mindig külső összekapcsolást

    használjunk, különben szűrjük az eredményhalmazt indokolatlanul. #2: Ahol extra adatgyűjtés szükséges több értékből ott készüljön tárolt eljárás, nézet, vagy trigger a helyzettől függően. Hibás összekapcsolások használata
  13. •  Átlagosan B-fa indexeket használunk PostgreSQL-ben, ennek szerkezetét az adatbázisnak

    karban kell tartania. •  Fa leveleiben vannak a bejegyzésekek, mellettük a sorazonosítók. •  Levélblokkok minden irányban láncolva vannak. •  Lehet egy- vagy többsoros. Másodlagos Index-ek hibás kezelése
  14. •  Minden INSERT és DELETE esetén ami a sort éri

    a B-fa szerkezetet befolyásolja, ilyenkor újra kell kalkulálnia. •  Minden UPDATE esetén ami az index-elt oszlopban történt újra kell kalkulálnia a friss érték helyét! Másodlagos Index-ek hibás kezelése
  15. #1: Ne tegyünk index-et olyan oszlopokra amik állapota nagyon sűrűn

    változik, vagy a tábla értékei folyamatosan törlődnek, és beszúródnak! Nagyon komoly adatbázis terhelést és lassulást eredményez! #2: Tegyünk azonban index-et minden olyan nem sűrűn változó értékre, amire gyakran szűrűnk, vagy amire gyakran rendezünk. Ne feledjük a NULL értékek nem kerülnek index- elésre. Másodlagos Index-ek hibás kezelése
  16. •  Feltételek megfelelő elhelyezése kritikus főleg DISTINCT ON-t tartalmazó allekérdezések

    szerepeltetése mellett. #1: Figyeljünk a feltételek helyére. Minél bentebb szűrűnk, annál jobban befolyásoljuk a külső lekérdezést, és olyan eredményektől eshetünk el, amit épp keresünk. Szűrési feltételek helyében hiba
  17. #1: Szöveget TRIM-eljük bármilyen formátum vizsgálat előtt! #2: LIKE helyett

    hasznájunk SIMILAR TO-t. #3: Figyeljünk a PostgreSQL verziói eltérésére. (pl.: \d csak 9.1-től, escape-elés \\-el 9.0-ban) #4: Két szöveg bármilyen összehasonlításakor LOWER függvényt használata, UPPER helyett. Szöveg vizsgálata SELECT … FROM ownership oin WHERE oin.vin IS NOT NULL AND CHAR_LENGTH( TRIM( both from oin.vin ) ) = 17 AND TRIM( both from oin.vin ) SIMILAR TO '[a-zA-Z0-9]+’