Viedumu Vietne ar Sandi

2007-04-3

Orāklis un Tabulas lasīšana

Filed under: Tech — Sandis @ 13:23

Cīnoties ar lēndarbīgiem SQL-iem veicu vairākus testus autotreisojot (autoizsekojot) un explainojot (izskaidrojot) SQL darbības principu un veidu. Testi rādīja ka pie lielu datu apjoma ar vairākmiljonu ierakstiem Orāklis sāk bremzēt un čakarēties. Un pie visa vainīga ir Orākļa vēlme nolasīt visu tabulu neizmantojot indeksus.

No sākuma es domāju, wtf, man vajag labi ja 0,01% no datiem, es lietoju četrus nosacījumus indeksētos laukos, bet šitas cūcis ņem un lasa visu tabulu tam atvēlot vairākas minūtes. Nelietojot distinct vai group by.

Kā izrādījās, Orāklim ir savs optimizētājs, kurš lemj vai izmantot indeksus vai nē un balstās viņš uz vienkāršu, bet diezgan aplamu (varbūt ir gadījumi, kad precīzu) pieņēmumu par fiziskā diska lasīšanu. Indeksi ir daudz un lieli, tāpēc to nolasīšanai vajag n skaitu pieprasījumu un nolasījumu. Piekļustot tabulai vajag vēl noteiktu skaitu pieprasījumu un nolasījumu. Ja nolasāmo bloku skaits indeksā ir lielāks par nolasāmo bloku skaitu tabulai, tad Orāklis drošu sirdi atmet ar roku indeksiem un palaiž full scan.

Labojumi sekojoši – uzstādam datubāzes konfigurācijas elementam Optimizer_index_cost_adj vērtību 30 līdz 50 (noklusēti ir 100) un Optimizer_index_caching tuvu 100 (noklusēti ir 0). Pirmā vērtība nozīmē ka viena bloka nolasīšana izmaksās 30-50% no multibloku nolasīšanas, jo vērtība (procenti) mazāki, jo vairāk tiks izmantoti indeksi. Otrā vērtība nozīmē cik daudz procentus no indeksiem Orāklis atradīs kešatmiņā – jo procenti lielāki, jo vairāk datubāze izmantos indeksus.

Advertisements

2 komentāri »

  1. A vai ta Orāklim nevar pašā kverijā norādīt (tip šitā kaut kā) – izmantot vai neizmantot indeksu(s)?

    Komentārs by Kristaps Kaupe — 2007-04-3 @ 16:27

  2. Var, protams.

    SELECT /* +index (index_name) */ * FROM table;

    Komentārs by Sandis — 2007-04-3 @ 19:07


RSS feed for comments on this post. TrackBack URI

Komentēt

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Mainīt )

Twitter picture

You are commenting using your Twitter account. Log Out / Mainīt )

Facebook photo

You are commenting using your Facebook account. Log Out / Mainīt )

Google+ photo

You are commenting using your Google+ account. Log Out / Mainīt )

Connecting to %s

WordPress.com blogs.

%d bloggers like this: