HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Táblaindexek hatékonysági tesztje


Példaprogram letöltése

10691 bájt

Adatbázisok tervezésekor fontos kérdés lehet, hogy a várható adatmennyiséghez milyen típusú indexet válasszunk, és hogy ezeket az adott tábla mely oszlopára definiáljuk. Cikkünkben négy azonos szerkezettel és adattartalommal rendelkező adattáblát hasonlítottunk össze abból a szempontból, hogy eltérő indexeik közül melyik az, amellyel egy adott lekérdező művelet leggyorsabban elvégezhető.

A példához szükséges az IndexTest adatbázis, melyet a mellékelt IndexTest.sql lefuttatásával hozhatunk létre. Az IndexTest.sql script 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
A bevezetőben megfogalmazott kérdést, vagyis hogy milyen indexet adjunk meg adattábláinkhoz, elsősorban több ezer, vagy több tízezer rekorddal rendelkező táblák esetén érdemes komolyan mérlegelni, ahol bizonyos információk az adathalmaz többszöri végigpásztázása esetén állhatnak elő. A keresett adatok megtalálása úgynevezett egész táblás kereséssel hosszadalmas, és költséges, így valamilyen módszerrel instruálnunk kell a szervert annak érdekében, hogy a művelet gyorsabb legyen.
Ezt a célt szolgálják a megfelelően megadott indexek (akár több is), melyek használatára bizonyos utasításokkal a szerver akár kényszeríthető is.
Példánkban négy táblát vizsgálunk, melyek közül az első három tábla oszlopaira létrehoztunk indexeket, míg a negyedik tábla index-szel nem rendelkezik. A táblák azonos szerkezettel (3 darab egész számot tartalmazó oszlop), és azonos adattartalommal (10-10000 rekord) rendelkeznek.
A példában azt vizsgáljuk, hogy egy alkalmasan megválasztott SELECT utasítás az egyes táblákban mennyi idő alatt vezet eredményre. A mérést táblánként, és műveletenként meghatározott számú esetben végezzük el, a kapott eredmények átlagát vesszük figyelembe a végeredmény meghatározásakor. A mérés számát a művelet indítása előtt kell kiválasztani egy listából.
A kapott eredmények alapján eldönthető, hogy az adott hardver és szoftver környezetben mely index bizonyult a leghatékonyabbnak. A számadatok tájékoztató jellegűek, inkább az eredmények közötti eltérések azok, amelyek összehasonlítás alapját képezhetik.
A program indulásakor a ’Feltöltés’ feliratú gomb segítségével indítható a táblák feltöltésének művelete, mely időigényes, azonban mindenképpen szükséges. A mérés elvégzése után az eredmények TextBox-okban jelennek meg.
Nézzük meg a három tábla indexeit. Az első tábla (Table1) egyetlen indexet tartalmaz a három oszlopára:
CREATE INDEX [Col_Index] ON [dbo].[Table1]([COL1],[COL2],[COL3])
  ON [PRIMARY]
A második tábla (Table2) három indexet tartalmaz, minden oszlopára egyet-egyet:
CREATE INDEX [Col1_Index] ON [dbo].[Table2]([COL1])
  ON [PRIMARY]
CREATE INDEX [Col2_Index] ON [dbo].[Table2]([COL2])
  ON [PRIMARY]
CREATE INDEX [Col3_Index] ON [dbo].[Table2]([COL3])
  ON [PRIMARY]
A harmadik tábla (Table3) szintén csak egy indexet az első oszlopára:
CREATE INDEX [FirstCol_Index] ON [dbo].[Table3]([COL1])
  ON [PRIMARY]
A szükséges segédmetódusok kódját a Counter.cs állományban helyezzük el. A műveletek időtartalmának meghatározására felhasználjuk a Kernel32.dll állományban található két API függvényt, melyeket egy saját osztályba ágyazunk, ennek neve Win32.
public class Win32
{
  [System.Runtime.InteropServices.DllImport("KERNEL32")]
  public static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);
  [System.Runtime.InteropServices.DllImport("KERNEL32")]
  public static extern bool QueryPerformanceFrequency(ref long lpFrequency);
}
A könnyebb kezelhetőség érdekében létrehoztunk egy Counter nevű osztályt, melynek Start metódusa indítja az időmérést úgy, hogy a rendszer számlálójának meghatározza az aktuális értékét:
public class Counter
{
  private static long start = 0;
  public static void Start()
  {
    Win32.QueryPerformanceCounter(ref start);
  }
A Stop metódus megállítja azt, vagyis újra lekérdezi a rendszerszámlálót, a két érték különbségét pedig elosztja az adott frekvenciával. Visszatérési értékében megadja az eltelt időt másodpercben:
  public static float Stop()
  {
    long stop = 0;
    Win32.QueryPerformanceCounter(ref stop);
    long freq = 0;
    Win32.QueryPerformanceFrequency(ref freq);
    return ((float)(stop-start)/(float)freq);
  }
}
A példában a mérendő művelet előtt meg kell hívni a Start, majd a végén a Stop metódusokat, és a visszatérési időt felhasználhatjuk.
A méréseket többször elvégezve az volt tapasztalható, hogy a Table1 tábla esetén kaptuk meg a leggyorsabban a megadott SELECT utasítás eredményét. A következő táblázat egy mérés eredményeit tartalmazza. Az eredmények azt tükrözik, hogy legjobb eredmény 30-ad része a legrosszabbnak, így az indexek elhagyása óriási időveszteség. A két legjobb eredményt összevetve szintén világosan látható, hogy a három oszlopra kiterjedő index mintegy kétszerte hatékonyabb az oszlopokra külön-külön megadott indexeknél.
Táblanév Eredmény
Table1 0,003939298 sec
Table2 0,008038466 sec
Table3 0,01154349 sec
Table4 0,01502544 sec
Fenti eredmények természetesen csak tájékoztató jellegűek, hiszen nagyban függnek az adott számítógép teljesítményétől.

Cikksorozat

#IDKategóriaCikk címeSorozat
1621DelphiMySQL szerverek elérése Delphi-ből1. rész
1632DelphiMySQL szerverek elérése Delphi-ből2. rész
1641DelphiMySQL szerverek elérése Delphi-ből3. rész
1649DelphiMySQL szerverek elérése Delphi-ből4. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 64. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |