C# - A sysindexes rendszertábla

MS SQL Server rendszertáblái 7. rész

forráskód letöltése
A cikksorozatnak ebben a számában a sysindexes rendszertáblával foglalkozunk részletesebben, mely szintén minden létrejövő adatbázisban megtalálható. Cikkünkből kiderül, hogy milyen adatok tárolására használja a rendszer a rendszertáblát. A cikkben bemutatjuk a sysindexes rendszertáblához kapcsolódó egyik rendszerfüggvényt is, mellyel információkat kaphatunk a rendszertábla egyes elemeiről.
A példához szükséges a SampleDatabase07 adatbázis, melyet a mellékelt SampleDatabase07.sql lefuttatásával hozhatunk létre. A SampleDatabase07.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 rendszertábla az adattáblák egyes oszlopaihoz deklarált különböző típusú megszorítások, és indexek bejegyzéseit tartalmazza. Minden sor egy indexnek felel meg, a tárolt tulajdonságok igen sokfélék. Gyakorlatilag helyettesíti a syskeys rendszertáblát, de kompatibilitási okokból ez utóbbit is megtartották.
Nézzük meg, milyen oszlopokban tárolja az információkat a rendszertábla:
Sorszám Oszlopnév Típus Leírás
1 id int Tábla azonosítója, melyhez az index tartozik.
2 status int Belső rendszerállapotot kifejező érték.
3 first binary(6) Mutató az első, vagy gyökérlapra.
4 indid smallint Index azonosítója. Értékei: 1 – az index nyaláboló (létrehozása CLUSTERED kulcsszóval történt), >1 – az index nem nyaláboló, 255 – olyan táblához tartozik, melynek van text, vagy image típusú oszlopa.
5 root binary(6) Indid >=1 és indid < 255 értékkel rendelkező indexek esetén mutató a gyökérlapra. Indid = 1 vagy indid = 255 értékkel rendelkező indexek esetén mutató az utolsó lapra.
6 minlen smallint Sor minimális mérete.
7 keycnt smallint Kulcsok száma.
8 groupid smallint Fájlcsoport azonosító, melyben az index létrejött.
9 dpages int Indid=0 vagy indid=1 esetén a használt lapok száma, míg indid=255 esetén nulla. Egyéb esetekben az indexlapok száma.
10 reserved int Indid=0 vagy indid=1 esetén az indexek és táblaadatok számára lefoglalt lapok száma; indid=255 esetén a text és image adatok számára lefoglalt lapok száma.
11 used int Indid=0 vagy indid=1 esetén az összes használt lap; indid=255 esetén a text és image adatok számára lefoglalt lapok száma.
12 rowcnt bigint Adatok sorainak száma. Indid=255 esetén nulla.
13 rowmodctr int Az utolsó statisztikai frissítés óta beszúrt, törölt vagy módosított sorok száma (UPDATE STATISTICS utasítás kiadása óta).
14 xmaxlen smallint Sorok maximális hossza.
15 maxirow smallint Nem-levélblokkos indexeket tartalmazó sorok maximális hossza.
16 OrigFillFactor tinyint Eredeti FillFactor értéke az indexnek, melyre az index újra –deklarálásakor lehet szükség.
17 reserved1 tinyint Fenntartott.
18 reserved2 int Fenntartott.
19 FirstIAM binary(6) Fenntartott.
20 impid smallint Fenntartott.
21 lockflags smallint A zárolások indexre vonatkoztatott korlátozásainak a jelzésére.
22 pgmodctr int Fenntartott.
23 keys varbinary(813) Az indexet alkotó oszlopok oszlop-azonosítói.
24 name sysname Indid=1 és indid=255 esetén a tábla neve, egyéb esetekben az index neve.
25 statblob image Statisztika tárolására.
26 maxlen int Fenntartott.
27 rows int A lefelé kompatibilitás miatt megtartott érték.
A példaprogramban bemutatjuk, milyen sorok íródnak a sysindexes rendszertáblába, ha programból indexeket hozunk létre egy adott táblához.
A mellékelt alkalmazásban a SampleDatabase07.sql parancsállomány lefuttatása után két tábla kerül az adatbázisba: Products és Orders. Mindkettő tartalmaz elsődleges kulcs megszorításokat az index-oszlopaikra, melyek neve PK_Products és PK_Orders. Ezek már az adatbázis létrehozásakor beíródnak a rendszertáblába, a program indításakor ezek láthatók csak.
Az adatbázisba került két tárolt eljárással hozhatók létre új indexek, illetve törölhetők a meglévők (CreateIndex és DropIndex).
Az alkalmazás Form-ján található füleken találjuk meg ’Rendszertáblák’ felirat alatt a sysindexes tábla aktuális adatait egy DataGrid kontrolban. Az ’Indexek létrehozása’, illetve ’Indexek törlése’ feliratú gombokkal indíthatók a fenti eljárások.
A fül alsó táblájában a sp_helpindex rendszerfüggvényt használjuk ComboBox vezérlőben kiválasztott táblanévvel, mint bemenő paraméterrel. A rendszerfüggvény információkat ad vissza táblázatos formában az adott tábla indexeiről. Használata:
sp_helpindex [ @objname = ] 'name'
A bemenő paraméter az adatbázis egy táblájának neve karakteres formában, melynek maximális értéke 776. Visszatérési értéke sikeres lekérdezés esetén 0, egyébként 1.
A visszaadott értékek táblázatosan a következők:
Oszlop neve Adattípusa Jellemzői
index_name sysname Index neve.
index_description varchar(210) Leírása, jellemzői szövegesen.
index_keys nvarchar(2078) Tábla, vagy nézet, melyre az index létrejött.
A mellékelt alkalmazásban az adatbázisba került tárolt eljárásban hívjuk meg a sp_helpindex rendszerfüggvényt, ennek neve GetInfo.
A sp_helpindex használata a következőképpen történik:
DECLARE @objname nvarchar(776)
SET @objname = ’Products’
EXEC sp_helpindex @objname
A MS SQL Server 2000 SQL Query Analyzer segédprogramjában végrehajtva a fenti eljárást – természetesen azt követően, hogy létrehoztuk az indexeket - a következő eredményt kapjuk:
INDEX_NAME INDEX_DESCRIPTION INDEX_KEYS
PK_Products clustered, unique, primary key located on PRIMARY ProductID
PN_Index nonclustered located on PRIMARY ProductName
Az adott táblában megadott indexek és kulcsok természetesen a MS SQL Enterprise Manager programjának grafikus felületén is megtekinthetők.
A mellékelt programban a ComboBox kontrol indexének megváltozásakor, vagyis amikor új értéket választunk, frissülnek a tábla értékei. Ennek érdekében a BuildInfo nevű saját metódusban a visszaadott adatokat betöltjük egy DataTable objektumba, majd adatforrásként értékül adjuk a DataGrid kontrolnak.
A metódust használjuk a program indításakor is. Az első sorokban így létrehozáskor oszlopokat csatolunk a táblához. Ezek a sorok újratöltéskor nem futnak le:

infoTable = new DataTable();
DataColumn dc1 = new DataColumn("INDEX_NAME", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("INDEX_DESCRIPTION", Type.GetType("System.String"));
DataColumn dc3 = new DataColumn("INDEX_KEYS", Type.GetType("System.String"));
infoTable.Columns.Add(dc1);
infoTable.Columns.Add(dc2);
infoTable.Columns.Add(dc3);
Újratöltéskor mindig töröljük az addig beírt adatokat. A táblába egy metódus végrehajtásának eredményeként kerülnek az adatok, mely a GetInfo tárolt eljárást hajtja végre. Bemenő paramétere a tábla neve:
DataRow dr;
...
io.Parameters["@tablename"].Value = tblCombo.Text;
SqlDataReader reader = io.ExecuteReader();
Az egyes sorok oszlopait a SqlDataReader objetum egyes mezőinek kiolvasott értékeivel töltjük fel:
while (reader.Read())
{
  dr=infoTable.NewRow();
  dr["INDEX_NAME"] = reader.GetSqlString(0);
  dr["INDEX_DESCRIPTION"] = reader.GetSqlString(1);
  dr["INDEX_KEYS"] = reader.GetSqlString(2);
  infoTable.Rows.Add(dr); 
}
...
A CreateIndex és DropIndex tárolt eljárások paraméter nélküliek, végrehajtásuk után a sysindexes rendszertáblába bekerülnek, vagy törlődnek adatsorok, így a megjelenítő DataGrid kontrol tartalmát egyszerűen frissítjük. A DataGrid kontrolban csak az említett Products és Orders táblákkal kapcsolatos bejegyzések kerülnek megjelenítésre.
Az adattáblák értékei az ’Adattáblák’ feliratú fül alatt elhelyezett DataGrid kontrolokban láthatók.

MS SQL Server rendszertáblái cikksorozat