Megosztás a következőn keresztül:


Heapek (fürtözött indexek nélküli táblák)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

A halom egy olyan tábla, amely nem rendelkezik csoportosított indexszel. Egy vagy több nem rendezett index halomként tárolt táblákon hozható létre. Az adatok a halomban tárolódnak sorrend megadása nélkül. Az adatok tárolása általában a sorok beszúrási sorrendjében történik. Az adatbázismotor azonban áthelyezheti adatait a halmon belül a sorok hatékony tárolása érdekében. A lekérdezési eredményekben nem lehet előrejelezni az adatsorrendet. A halomból visszaadott sorok sorrendjének garantálásához használja a záradékot ORDER BY . A sorok tárolására szolgáló állandó logikai sorrend megadásához hozzon létre egy fürtözött indexet a táblán, hogy a tábla ne halom legyen.

Note

Néha jó okok szólnak amellett, hogy egy táblát halomként hagyjunk ahelyett, hogy egy fürtözött indexet hoznánk létre, de a halom hatékony használata haladó készség. A legtöbb táblának gondosan kiválasztott klaszteres indexet kell tartalmaznia, hacsak nincs jó ok arra, hogy halmazszerkezetként hagyja meg a táblát.

Mikor érdemes kupacot használni?

A halom ideális azokhoz a táblákhoz, amelyeket gyakran csonkolnak és újra betöltenek. Az adatbázismotor a lehető legkorábbi rendelkezésre álló terület kitöltésével optimalizálja a tárterületet egy halomban.

Vegye figyelembe a következőket:

  • A memóriakupac szabad helyének meghatározása költséges lehet, különösen akkor, ha sok törlés vagy frissítés történt.
  • A fürtözött indexek állandó teljesítményt nyújtanak a nem gyakran csonkolt táblákhoz.

A rendszeresen csonkolt vagy újra létrehozott táblák , például ideiglenes vagy átmeneti táblák esetén a halom használata gyakran hatékonyabb.

A halom és a fürtözött index használata közötti választás jelentősen befolyásolhatja az adatbázis teljesítményét és hatékonyságát.

Ha egy táblázat halomként van tárolva, a rendszer az egyes sorokat egy 8 bájtos sorazonosítóra (RID) hivatkozva azonosítja, amely a lap fájlszámából, adatoldalszámából és pontjáról (FileID:PageID:SlotID) áll. A sorazonosító egy kicsi és hatékony szerkezet.

A halmok átmeneti táblákként használhatók nagy, rendezetlen beszúrási műveletekhez. Mivel az adatok beszúrása szigorú sorrend kényszerítése nélkül történik, a beszúrási művelet általában gyorsabb, mint az egyenértékű beszúrás egy fürtözött indexbe. Ha a halom adatai egy végső célhelyre lesznek beolvasva és feldolgozva, hasznos lehet egy keskeny, nemclustered index létrehozása, amely lefedi a lekérdezés által használt keresési predikátumot.

Note

Az adatok lekérése egy halomból adatlapsorrendben történik, de nem feltétlenül abban a sorrendben, ahogy az adatokat beszúrták.

Az adatszakértők néha kupacokat is használnak, ha az adatok mindig nem fürtözött indexeken keresztül érhetők el, és a RID kisebb, mint egy klaszterezett indexkulcs.

Ha egy tábla halom, és nem tartalmaz nem rendezett indexeket, akkor a teljes táblázatot be kell olvasni (táblavizsgálatot) a sorok megkereséséhez. Az SQL Server nem tud közvetlenül RID-et keresni a kupacon. Ez a viselkedés elfogadható lehet, ha a táblázat kicsi.

Mikor ne használjon halomot?

Ne használjon halomot, ha az adatokat gyakran rendezési sorrendben adják vissza. A rendezési oszlop klaszterezett indexe elkerülheti a rendezési műveletet.

Ne használjon halomot, ha az adatok gyakran csoportosítva lesznek. Az adatokat a csoportosítás előtt rendezni kell, és a rendezési oszlop fürtözött indexe elkerülheti a rendezési műveletet.

Ne használjon halomot, ha az adattartományokat gyakran kérdezik le a táblából. A klaszterezett index az intervallum oszlopra elkerüli a teljes halom rendezésének szükségességét.

Ne használjon halomot, ha nincsenek nem rendezett indexek, és a tábla nagy. A terv egyetlen alkalmazása a teljes táblatartalom visszaadása megadott sorrend nélkül. Egy halomban az adatbázismotor beolvassa az összes sort, hogy megtalálja bármelyik sort.

Ne használjon halomot, ha az adatok gyakran frissülnek. Ha frissít egy rekordot, és a frissítés több helyet használ az adatlapokon, mint amennyit jelenleg használ, a rekordot át kell helyezni egy olyan adatlapra, amely elegendő szabad területet tartalmaz. Ez egy továbbított rekordot hoz létre, amely az adatok új helyére mutat, és a továbbítási mutatót a korábban az adatokat tartalmazó lapon kell megírni, hogy jelezze az új fizikai helyet. Ez töredezettséghez vezet a halomban. Amikor az adatbázismotor egy halomot vizsgál, az alábbi mutatókat követi. Ez a művelet korlátozza az előreolvasási teljesítményt, és további I/O-kkal járhat, ami csökkenti a vizsgálati teljesítményt.

Halomok kezelése

Halom létrehozásához hozzon létre egy táblát klaszterezett index nélkül. Ha egy tábla már rendelkezik fürtözött indexszel, törölje a fürtözött indexet, hogy a táblát visszaállítsa halomra.

A halom eltávolításához hozzon létre egy klaszterezett indexet a halomhoz.

Egy halom újraépítése a feleslegesen használt helyfelszabadításhoz:

  • Hozzon létre egy fürtözött indexet a halmazra, majd távolítsa el a fürtözött indexet.
  • Használja a ALTER TABLE ... REBUILD parancsot a halom újraépítéséhez.

Warning

A fürtözött indexek létrehozásához vagy elvetéséhez újra kell írni a teljes táblát. Ha a tábla nem fürtözött indexeket tartalmaz, a fürtözött index módosításakor az összes nem fürtözött indexet újra létre kell hozni. Ezért a halomról fürtözött indexszerkezetre történő átváltás vagy visszahelyezés sok időt és lemezterületet igényelhet az adatok tempdb-ben való átrendezéséhez.

Halmok azonosítása

Az alábbi lekérdezés az aktuális adatbázis halmainak listáját adja vissza. A lista a következőket tartalmazza:

  • Táblanevek
  • Sémanevek
  • Sorok száma
  • Táblázat mérete KB-ban
  • Indexméret kb-ban
  • Nem használt terület
  • Egy halom azonosítására szolgáló oszlop
SELECT t.name AS 'Your TableName',
    s.name AS 'Your SchemaName',
    p.rows AS 'Number of Rows in Your Table',
    SUM(a.total_pages) * 8 AS 'Total Space of Your Table (KB)',
    SUM(a.used_pages) * 8 AS 'Used Space of Your Table (KB)',
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS 'Unused Space of Your Table (KB)',
    CASE 
        WHEN i.index_id = 0
            THEN 'Yes'
        ELSE 'No'
        END AS 'Is Your Table a Heap?'
FROM sys.tables t
INNER JOIN sys.indexes i
    ON t.object_id = i.object_id
INNER JOIN sys.partitions p
    ON i.object_id = p.object_id
        AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a
    ON p.partition_id = a.container_id
LEFT JOIN sys.schemas s
    ON t.schema_id = s.schema_id
WHERE i.index_id <= 1 -- 0 for Heap, 1 for Clustered Index
GROUP BY t.name,
    s.name,
    i.index_id,
    p.rows
ORDER BY 'Your TableName';

Halomszerkezetek

A halom egy olyan tábla, amely nem rendelkezik csoportosított indexszel. A halomnak egy sora van a sys.partitions táblában, a index_id = 0 halom által használt minden partícióhoz. Alapértelmezés szerint egy halom egyetlen partícióval rendelkezik. Ha egy halom több partícióval rendelkezik, minden partíciónak van egy halomszerkezete, amely az adott partíció adatait tartalmazza. Ha például egy halom négy partícióval rendelkezik, négy halomszerkezet van; egy-egy partícióban.

A halom adattípusától függően minden halomstruktúra egy vagy több foglalási egységgel rendelkezik egy adott partíció adatainak tárolásához és kezeléséhez. Minden halomnak legalább egy IN_ROW_DATA foglalási egysége lesz partíciónként. A halom partíciónként egy LOB_DATA foglalási egységgel is rendelkezik, ha nagy objektumoszlopokat (LOB) tartalmaz. Partíciónként egy ROW_OVERFLOW_DATA foglalási egység is lesz, ha olyan változó hosszúságú oszlopokat tartalmaz, amelyek túllépik a 8060 bájtos sorméretkorlátot.

A(z) first_iam_page oszlop a(z) sys.system_internals_allocation_units rendszernézetben az IAM-lapok láncolatának első IAM-lapjára mutat, amely a halomnak egy adott partícióban lefoglalt területet kezeli. Az SQL Server az IAM-oldalak használatával lépeget a halomon. Az adatoldalak és a bennük lévő sorok nincsenek meghatározott sorrendben, és nincsenek összekapcsolva. Az adatoldalak közötti egyetlen logikai kapcsolat az IAM-oldalakon rögzített információk.

Important

A sys.system_internals_allocation_units rendszernézet csak belső SQL Server-használatra van fenntartva. A jövőbeli kompatibilitás nem garantált.

Egy halom táblázatvizsgálata vagy soros olvasása az IAM-oldalak beolvasásával végezhető el, hogy megtalálja a halom lapjait tartalmazó kiterjedéseket. Mivel az IAM ugyanabban a sorrendben jeleníti meg a kiterjedéseket, mint ahogy azok az adatfájlokban megtalálhatók, ez azt jelenti, hogy a soros adathalmaz beolvasások sorban, szekvenciálisan haladnak végig az egyes fájlokon. Ha az IAM-oldalakat használja a vizsgálatsorozat beállítására, az azt is jelenti, hogy a halom sorai általában nem abban a sorrendben jelennek meg, amelyben beszúrták őket.

Az alábbi ábra bemutatja, hogyan használja az SQL Server adatbázismotorja az IAM-oldalakat az adatsorok egyetlen partíciós halomba való lekéréséhez.

iam_heap

INDEX KÉSZÍTÉSE (Transact-SQL)
DROP INDEX (Transact-SQL)
Fürtözött és nemfürtözött indexek ismertetése