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


Táblázatos tippek (Transact-SQL)

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

A táblázatos tippek a lekérdezésoptimalizáló alapértelmezett viselkedésének felülbírálására szolgálnak az adatkezelési nyelv (DML) utasítása során. Megadhat zárolási módszert, egy vagy több indexet, lekérdezés-feldolgozási műveletet, például táblavizsgálatot, indexkeresést vagy egyéb beállításokat. A táblamutatók a DML-utasítás FROM záradékában vannak megadva, és csak az adott záradékban hivatkozott táblára vagy nézetre vannak hatással.

Caution

Mivel az SQL Server lekérdezésoptimalizálója általában a legjobb végrehajtási tervet választja ki egy lekérdezéshez, javasoljuk, hogy a tippeket csak a tapasztalt fejlesztők és adatbázis-rendszergazdák használják végső megoldásként.

A következőkre vonatkozik:

Transact-SQL szintaxis konvenciói

Syntax

WITH  ( <table_hint> [ [ , ] ...n ] )

<table_hint> ::=
{ NOEXPAND
  | INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> )
  | FORCESEEK [ ( <index_value> ( <index_column_name> [ , ... ] ) ) ]
  | FORCESCAN
  | HOLDLOCK
  | NOLOCK
  | NOWAIT
  | PAGLOCK
  | READCOMMITTED
  | READCOMMITTEDLOCK
  | READPAST
  | READUNCOMMITTED
  | REPEATABLEREAD
  | ROWLOCK
  | SERIALIZABLE
  | SNAPSHOT
  | SPATIAL_WINDOW_MAX_CELLS = <integer_value>
  | TABLOCK
  | TABLOCKX
  | UPDLOCK
  | XLOCK
}

<table_hint_limited> ::=
{
    KEEPIDENTITY
  | KEEPDEFAULTS
  | HOLDLOCK
  | IGNORE_CONSTRAINTS
  | IGNORE_TRIGGERS
  | NOLOCK
  | NOWAIT
  | PAGLOCK
  | READCOMMITTED
  | READCOMMITTEDLOCK
  | READPAST
  | REPEATABLEREAD
  | ROWLOCK
  | SERIALIZABLE
  | SNAPSHOT
  | TABLOCK
  | TABLOCKX
  | UPDLOCK
  | XLOCK
}

Arguments

WITH ( <table_hint> ) [ [ , ] ... n ]

Néhány kivételtől eltekintve a FROM záradék csak akkor támogatja a táblázatos tippeket, ha a tippeket a WITH kulcsszóval adja meg. A táblázatra vonatkozó tippeket zárójelekkel is meg kell adni.

Important

A WITH kulcsszó kihagyása elavult funkció: Ez a funkció az SQL Server egy későbbi verziójában lesz eltávolítva. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását.

A WITH kulcsszóval a következő táblázatos tippek használhatók: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOTés NOEXPAND. Ha ezek a táblamutatók a WITH kulcsszó nélkül vannak megadva, a tippeket egyedül kell megadni. Például:

FROM t (TABLOCK)

Ha a tipp egy másik beállítással van megadva, a tippet a WITH kulcsszóval kell megadni:

FROM t WITH (TABLOCK, INDEX(myindex))

Javasoljuk, hogy vesszőket használjunk a táblázat tippjei között.

Important

A vesszők helyett szóközök szerint történő elválasztása elavult funkció: Ez a funkció el lesz távolítva az SQL Server egy későbbi verziójában. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását.

NOEXPAND

Azt adja meg, hogy az indexelt nézetek nem lesznek kibontva a mögöttes táblák eléréséhez, amikor a lekérdezés-optimalizáló feldolgozza a lekérdezést. A lekérdezésoptimalizáló úgy kezeli a nézetet, mint egy csoportosított indexet tartalmazó táblázatot. NOEXPAND csak indexelt nézetekre vonatkozik. További információ: A NOEXPANDhasználata.

INDEX ( <index_value> [ , ... n ] ) | INDEX = ( <index_value> )

A INDEX() szintaxis egy vagy több index nevét vagy azonosítóját határozza meg, amelyet a lekérdezésoptimalizáló használ az utasítás feldolgozásakor. A másik INDEX = szintaxis egyetlen indexértéket határoz meg. Táblánként csak egy indexmutató adható meg.

Ha van fürtözött index, INDEX(0) fürtözött indexvizsgálatot kényszerít, és INDEX(1) fürtözött indexvizsgálatot vagy keresést kényszerít. Ha nincs fürtözött index, INDEX(0) kényszeríti a tábla vizsgálatát, és a INDEX(1) hibaként értelmezi.

Ha egyetlen tipplistában több indexet használ, a rendszer figyelmen kívül hagyja az ismétlődéseket, a többi felsorolt index pedig a tábla sorainak lekérésére szolgál. Az indexmutató indexeinek sorrendje jelentős. A több indexmutató is kikényszeríti az index-ANDinget, és a lekérdezésoptimalizáló a lehető legtöbb feltételt alkalmazza az egyes elért indexekre. Ha a hivatkozott indexek gyűjteménye nem tartalmazza a lekérdezés által hivatkozott összes oszlopot, a rendszer lekéri a fennmaradó oszlopokat, miután az SQL Server adatbázismotor lekérte az összes indexelt oszlopot.

Note

Ha egy csillagillesztés ténytábláján több indexre hivatkozó indexmutatót használ, az optimalizáló figyelmen kívül hagyja az indexmutatót, és figyelmeztető üzenetet ad vissza. Az index ORing nem engedélyezett olyan táblák esetében is, amelyen indexmutató van megadva.

A táblamutató indexeinek maximális száma 250 nemclustered index.

KEEPIDENTITY

Csak akkor alkalmazható egy INSERT utasításban, ha a BULK lehetőséget OPENROWSET(BULK) használatával használja.

Megadja, hogy az importált adatfájlban lévő identitásértéket vagy értékeket kell használni az identitásoszlophoz. Ha KEEPIDENTITY nincs megadva, a rendszer ellenőrzi az oszlop identitásértékeit, de nem importálja, és a lekérdezésoptimalizáló automatikusan egyedi értékeket rendel hozzá a tábla létrehozása során megadott mag- és növekményértékek alapján.

Important

Ha az adatfájl nem tartalmazza a tábla vagy nézet identitásoszlopának értékeit, és az identitásoszlop nem a tábla utolsó oszlopa, akkor ki kell hagynia az identitásoszlopot. További információ: Adatmező (SQL Server)kihagyása formátumfájllal. Ha egy identitásoszlop kihagyása sikeres, a lekérdezésoptimalizáló automatikusan egyedi értékeket rendel az identitásoszlophoz az importált táblasorokhoz.

Ha ezt a tippet egy INSERT ... SELECT * FROM OPENROWSET(BULK...) utasításban használja, tekintse meg az Identitásértékek megőrzése adatok tömeges importálásakor (SQL Server)című témakört.

A táblák identitásértékének ellenőrzéséről további információt a DBCC CHECKIDENTtalál.

KEEPDEFAULTS

Csak akkor alkalmazható egy INSERT utasításban, ha a BULK lehetőséget az OPENROWSET (BULK) használatával használja.

A táblaoszlop alapértelmezett értékének beszúrását adja meg, ha van ilyen, ahelyett, hogy NULL, ha az adatrekord nem tartalmaz értéket az oszlophoz.

Ha ezt a tippet egy INSERT ... SELECT * FROM OPENROWSET(BULK...) utasításban használja, tekintse meg a Null értékek vagy alapértelmezett értékek megőrzése a tömeges importálás (SQL Server)során.

FORCESEEK [ ( <index_value> ( <index_column_name> [ , ... n ] ) ]

Megadja, hogy a lekérdezésoptimalizáló csak egy indexkeresési műveletet használ a tábla vagy nézet adatainak elérési útjaként.

Note

Az SQL Server 2008 R2 (10.50.x) Service Pack 1 csomagtól kezdve indexparaméterek is megadhatóak. Ebben az esetben a lekérdezésoptimalizáló csak az indexkeresési műveleteket veszi figyelembe a megadott indexen keresztül, legalább a megadott indexoszlopok használatával.

  • index_value

    Az index neve vagy indexazonosítója. A 0 indexazonosító (halom) nem adható meg. Az index nevének vagy azonosítójának visszaadásához kérdezze le a sys.indexes katalógusnézetet.

  • index_column_name

    Annak az indexoszlopnak a neve, amely szerepel a keresési műveletben. Az indexparaméterekkel rendelkező FORCESEEK megadása hasonló a FORCESEEKINDEX-tipptel való használatához. A lekérdezésoptimalizáló által használt elérési út nagyobb mértékű szabályozását azonban úgy érheti el, hogy megadja a keresendő indexet és a keresési műveletben figyelembe veendő indexoszlopokat. Az optimalizáló szükség esetén több oszlopot is figyelembe vehet. Ha például egy nemclustered index van megadva, az optimalizáló dönthet úgy, hogy a megadott oszlopok mellett fürtözött indexkulcs-oszlopokat is használ.

A FORCESEEK tipp a következő módokon adható meg.

Syntax Example Description
Index vagy INDEX tipp nélkül FROM dbo.MyTable WITH (FORCESEEK) A lekérdezésoptimalizáló csak az indexkeresési műveleteket veszi figyelembe a tábla vagy a nézet bármely releváns indexen keresztüli eléréséhez.
INDEX tippdel kombinálva FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) A lekérdezésoptimalizáló úgy véli, hogy csak az indexkeresési műveletek érhetők el a táblához vagy a nézethez a megadott indexen keresztül.
Index- és indexoszlopok megadásával paraméterezve FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) A lekérdezésoptimalizáló csak az indexkeresési műveleteket tekinti úgy, hogy legalább a megadott indexoszlopok használatával elérhessék a táblát vagy a nézetet a megadott indexen keresztül.

Ha a FORCESEEK tippet használja (indexparaméterekkel vagy anélkül), vegye figyelembe az alábbi irányelveket:

  • A tipp megadható táblamutatóként vagy lekérdezési tippként is. A lekérdezési tippekről további információt a Lekérdezési tippek (Transact-SQL)című témakörben talál.
  • A FORCESEEK indexelt nézetre való alkalmazásához meg kell adni a NOEXPAND tippet is.
  • A tipp táblánként vagy nézetben legfeljebb egyszer alkalmazható.
  • A tipp nem adható meg távoli adatforráshoz. A 7377-et a rendszer akkor adja vissza, ha FORCESEEK indexmutatóval van megadva, és a 8180-at a rendszer akkor adja vissza, ha FORCESEEK indexmutató nélkül használja.
  • Ha FORCESEEK nem talál terveket, a rendszer a 8622-s hibát adja vissza.

Ha FORCESEEK indexparaméterekkel van megadva, a következő irányelvek és korlátozások érvényesek:

  • A tipp nem adható meg olyan táblához, amely egy INSERT, UPDATEvagy DELETE utasítás célja.
  • A tipp nem adható meg INDEX vagy más FORCESEEK tipptel együtt.
  • Legalább egy oszlopot meg kell adni, és a kezdőkulcs oszlopának kell lennie.
  • További indexoszlopok is megadhatóak, a kulcsoszlopok azonban nem hagyhatók ki. Ha például a megadott index tartalmazza a kulcsoszlopokat a, bés c, akkor az érvényes szintaxis FORCESEEK (MyIndex (a)) és FORCESEEK (MyIndex (a, b)tartalmaz. Érvénytelen szintaxis FORCESEEK (MyIndex (c)) és FORCESEEK (MyIndex (a, c).
  • A tippben megadott oszlopnevek sorrendjének meg kell egyeznie a hivatkozott index oszlopainak sorrendjével.
  • Az indexkulcs definíciójában nem szereplő oszlopok nem adhatók meg. Egy nemclustered indexben például csak a megadott indexkulcsoszlopok adhatók meg. Az indexbe automatikusan belefoglalt fürtözött kulcsoszlopokat nem lehet megadni, de az optimalizáló használhatja.
  • Az xVelocity memóriaoptimalizált oszlopcentrikus index nem adható meg indexparaméterként. A 366-os hiba jelenik meg.
  • Az indexdefiníció módosításához (például oszlopok hozzáadásával vagy eltávolításával) szükség lehet az indexre hivatkozó lekérdezések módosítására.
  • A tipp megakadályozza, hogy az optimalizáló mérlegelje a tábla térbeli vagy XML-indexeit.
  • A tipp nem adható meg a FORCESCAN tipptel együtt.
  • Particionált indexek esetén az SQL Server által implicit módon hozzáadott particionálási oszlop nem adható meg a FORCESEEK tippben.

Caution

A paraméterekkel rendelkező FORCESEEK megadása korlátozza az optimalizáló által jobban figyelembe vehető tervek számát, mint a paraméterek nélküli FORCESEEK megadásakor. Ez több esetben Plan cannot be generated hibát okozhat.

FORCESCAN

: SQL Server 2008 R2 (10.50.x) Service Pack 1 és újabb verziók

Megadja, hogy a lekérdezésoptimalizáló csak indexvizsgálati műveletet használ a hivatkozott tábla vagy nézet elérési útjaként. A FORCESCAN tipp hasznos lehet olyan lekérdezésekhez, amelyekben az optimalizáló alábecsüli az érintett sorok számát, és keresési műveletet választ a vizsgálati művelet helyett. Ha ez történik, a művelethez megadott memória mennyisége túl kicsi, és a lekérdezési teljesítmény is befolyásolja.

FORCESCAN INDEX tipptel vagy anélkül is megadható. Indexmutatóval (INDEX = index_name, FORCESCAN) kombinálva a lekérdezésoptimalizáló csak a megadott indexen keresztüli hozzáférési útvonalakat veszi figyelembe a hivatkozott tábla elérésekor. FORCESCAN az indexmutatóval INDEX(0) megadhatja, hogy táblavizsgálati műveletet kényszerítsen az alaptáblán.

Particionált táblák és indexek esetén a rendszer FORCESCAN alkalmaz, miután a partíciók a lekérdezési predikátumok kiértékelése révén ki lettek küszöbölve. Ez azt jelenti, hogy a vizsgálat csak a fennmaradó partíciókra lesz alkalmazva, a teljes táblára nem.

A FORCESCAN tipp a következő korlátozásokkal rendelkezik:

  • A tipp nem adható meg olyan táblához, amely egy INSERT, UPDATEvagy DELETE utasítás célja.
  • A tipp egynél több indexmutatóval nem használható.
  • A tipp megakadályozza, hogy a lekérdezésoptimalizáló figyelembe veszi a tábla térbeli vagy XML-indexeit.
  • A tipp nem adható meg távoli adatforráshoz.
  • A tipp nem adható meg a FORCESEEK tipptel együtt.

HOLDLOCK

Egyenértékű SERIALIZABLE. További információ: SZERIALIZÁLHATÓ a cikk későbbi részében. HOLDLOCK csak arra a táblára vagy nézetre vonatkozik, amelyhez meg van adva, és csak a használt utasítás által meghatározott tranzakció időtartamára. HOLDLOCK nem használható olyan SELECT utasításban, amely tartalmazza a FOR BROWSE beállítást.

IGNORE_CONSTRAINTS

Csak akkor alkalmazható egy INSERT utasításban, ha a BULK lehetőséget az OPENROWSET (BULK) használatával használja.

Azt adja meg, hogy a tömeges importálási művelet figyelmen kívül hagyja a tábla összes korlátozását. Alapértelmezés szerint INSERT ellenőrzi Egyedi megkötéseket, valamint és elsődleges és idegenkulcs-korlátozásokat. Ha IGNORE_CONSTRAINTS van megadva egy tömeges importálási művelethez, INSERT figyelmen kívül kell hagynia ezeket a korlátozásokat egy céltáblán. Nem tilthatja le UNIQUE, PRIMARY KEYvagy NOT NULL korlátozásokat.

Érdemes lehet letiltani CHECK és FOREIGN KEY korlátozásokat, ha a bemeneti adatok olyan sorokat tartalmaznak, amelyek megsértik a korlátozásokat. A CHECK és FOREIGN KEY korlátozások letiltásával importálhatja az adatokat, majd Transact-SQL utasításokkal törölheti az adatokat.

Ha azonban CHECK és FOREIGN KEY kényszereket figyelmen kívül hagy, a rendszer a művelet után is_not_trusted ként jelöli meg a táblán lévő összes figyelmen kívül hagyott kényszert a sys.check_constraints vagy sys.foreign_keys katalógusnézetben. Egy bizonyos ponton ellenőriznie kell az egész táblára vonatkozó korlátozásokat. Ha a tábla nem volt üres a tömeges importálási művelet előtt, a kényszer újraértékelésének költsége meghaladhatja a CHECK és FOREIGN KEY korlátozások növekményes adatokra való alkalmazásának költségét.

IGNORE_TRIGGERS

Csak akkor alkalmazható egy INSERT utasításban, ha a BULK lehetőséget az OPENROWSET (BULK) használatával használja.

Azt adja meg, hogy a táblában definiált eseményindítókat a tömeges importálási művelet figyelmen kívül hagyja. Alapértelmezés szerint INSERT alkalmazza az eseményindítókat.

Csak akkor használja IGNORE_TRIGGERS, ha az alkalmazás nem függ semmilyen eseményindítótól, és fontos a teljesítmény maximalizálása.

NOLOCK

Egyenértékű READUNCOMMITTED. További információ: READUNCOMMITTED a cikk későbbi részében.

Note

UPDATE vagy DELETE utasítások esetén: Ez a funkció el lesz távolítva az SQL Server egy későbbi verziójában. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását.

NOWAIT

Arra utasítja az adatbázismotort, hogy azonnal küldje vissza az üzenetet, amint zárolás történt a táblában. NOWAIT egy adott tábla SET LOCK_TIMEOUT 0 megadásával egyenértékű. A NOWAIT tipp nem működik, ha a TABLOCK tipp is szerepel benne. Ha a TABLOCK-tipp használatakor várakozás nélkül szeretné leállíteni a lekérdezést, a lekérdezést inkább SET LOCK_TIMEOUT 0;.

PAGLOCK

Az oldalzárolásokat vagy az egyes zárolásokat általában sorokra vagy kulcsokra rögzíti, vagy ahol általában egyetlen táblazárolás történik. Alapértelmezés szerint a művelethez megfelelő zárolási módot használja. Ha a SNAPSHOT elkülönítési szinten működő tranzakciókban meg van adva, az oldalzárolások csak akkor lesznek megadva, ha PAGLOCK más, zárolást igénylő táblamutatókkal van kombinálva, például UPDLOCK és HOLDLOCK.

READCOMMITTED

Meghatározza, hogy az olvasási műveletek megfelelnek-e a READ COMMITTED elkülönítési szintre vonatkozó szabályoknak zárolással vagy sorverzióval. Ha az adatbázis-beállítás READ_COMMITTED_SNAPSHOTOFF, az adatbázismotor megosztott zárolásokat szerez be az adatok olvasása közben, és az olvasási művelet befejezésekor feloldja ezeket a zárolásokat. Ha az adatbázis-beállítás READ_COMMITTED_SNAPSHOTON, az adatbázismotor nem szerez be zárolásokat, és sorverziót használ. További információ az elkülönítési szintekről: SET TRANSACTION ISOLATION LEVEL.

Note

UPDATE vagy DELETE utasítások esetén: Ez a funkció el lesz távolítva az SQL Server egy későbbi verziójában. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását.

READCOMMITTEDLOCK

Meghatározza, hogy az olvasási műveletek a zárolás használatával megfeleljenek az READ COMMITTED elkülönítési szint szabályainak. Az adatbázismotor az adatok olvasása közben szerzi be a megosztott zárolásokat, és az olvasási művelet befejezésekor feloldja ezeket a zárolásokat, függetlenül a READ_COMMITTED_SNAPSHOT adatbázis beállításától. További információ az elkülönítési szintekről: SET TRANSACTION ISOLATION LEVEL. Ez a tipp nem adható meg egy INSERT utasítás céltábláján; a függvény a 4140-et adja vissza.

READPAST

Azt adja meg, hogy az adatbázismotor ne olvassa be a más tranzakciók által zárolt sorokat. Ha READPAST van megadva, a sorszintű zárolások kimaradnak, az oldalszintű zárolások azonban nem lesznek kihagyva. Vagyis az adatbázismotor kihagyja a sorokat ahelyett, hogy blokkolja az aktuális tranzakciót a zárolások feloldásáig. Tegyük fel például, hogy a T1 tábla egyetlen egész oszlopot tartalmaz 1, 2, 3, 4, 5 értékekkel. Ha az A tranzakció 3-ról 8-ra módosítja az értéket, de még nem véglegesített, SELECT * FROM T1 (READPAST) 1, 2, 4, 5 értéket ad vissza. READPAST elsősorban a zárolási versengés csökkentésére szolgál egy SQL Server-táblát használó munkahelyi üzenetsor megvalósításakor. Az READPAST használó üzenetsor-olvasó kihagyja a többi tranzakció által zárolt korábbi üzenetsor-bejegyzéseket a következő elérhető üzenetsor-bejegyzésbe anélkül, hogy várnia kellene, amíg a többi tranzakció feloldja a zárolásokat.

READPAST egy UPDATE vagy DELETE utasításban hivatkozott bármely táblához, valamint egy FROM záradékban hivatkozott táblához megadható. Ha egy UPDATE utasításban van megadva, a READPAST csak az adatok beolvasásakor lesz alkalmazva, hogy megállapítsa, mely rekordokat kell frissítenie, függetlenül attól, hogy az utasítás hol van megadva. READPAST nem adható meg INTO utasítás INSERT záradékában szereplő táblákhoz. A READPAST használó műveletek frissítése vagy törlése blokkolhatja az idegen kulcsok vagy indexelt nézetek olvasását, illetve a másodlagos indexek módosítását.

READPAST csak a READ COMMITTED vagy REPEATABLE READ elkülönítési szinten működő tranzakciókban adható meg. Ha az SNAPSHOT elkülönítési szinten működő tranzakciókban van megadva, READPAST más, zárolást igénylő táblamutatókkal kell kombinálni, például UPDLOCK és HOLDLOCK.

A READPAST tábla tippje nem adható meg, ha a READ_COMMITTED_SNAPSHOT adatbázis beállítása ON, és az alábbi feltételek valamelyike teljesül:

  • A munkamenet tranzakcióelkülönítési szintje READ COMMITTED.
  • A READCOMMITTED tábla tippje is meg van adva a lekérdezésben.

Ha ezekben az esetekben meg szeretné adni a READPAST tippet, távolítsa el a READCOMMITTED táblamutatót, ha van ilyen, és vegye fel a READCOMMITTEDLOCK táblamutatót a lekérdezésbe.

READUNCOMMITTED

Azt határozza meg, hogy engedélyezettek-e a piszkos olvasások. A rendszer nem ad ki megosztott zárolásokat, amelyek megakadályozzák, hogy más tranzakciók módosítsák az aktuális tranzakció által beolvasott adatokat, és a más tranzakciók által beállított kizárólagos zárolások nem akadályozzák az aktuális tranzakciót a zárolt adatok beolvasásában. A piszkos olvasás engedélyezése nagyobb egyidejűséget okozhat, de az adatmódosítások olvasásának költségén, amelyeket aztán más tranzakciók visszaállítanak. Ez hibákat okozhat a tranzakcióhoz, olyan adatokat jeleníthet meg a felhasználóknak, amelyeket soha nem véglegesítettek, vagy a felhasználók kétszer láthatják a rekordokat (vagy egyáltalán nem).

READUNCOMMITTED és NOLOCK tippek csak az adatzárolásokra vonatkoznak. Az összes lekérdezés, beleértve a READUNCOMMITTED és NOLOCK tippeket tartalmazó lekérdezéseket is, Sch-S (sémastabilitási) zárolásokat szerez be a fordítás és a végrehajtás során. Emiatt a lekérdezések le lesznek tiltva, ha egy egyidejű tranzakció Sch-M (sémamódosítás) zárolást tartalmaz a táblán. Egy adatdefiníciós nyelv (DDL) művelet például Sch-M zárolást szerez be, mielőtt módosítja a tábla sémaadatait. Az egyidejű lekérdezések, beleértve a READUNCOMMITTED vagy NOLOCK tippekkel futó lekérdezéseket is, le lesznek tiltva, amikor Sch-S zárolást próbálnak beszerezni. Ezzel szemben egy Sch-S zárolást tartalmazó lekérdezés blokkolja az egyidejű tranzakciót, amely megpróbál Sch-M zárolást szerezni.

READUNCOMMITTED és NOLOCK nem adható meg a beszúrási, frissítési vagy törlési műveletekkel módosított táblákhoz. Az SQL Server lekérdezésoptimalizálója figyelmen kívül hagyja a READUNCOMMITTED és NOLOCKFROM záradék azon tippeit, amelyek egy UPDATE vagy DELETE utasítás céltáblájára vonatkoznak.

Note

A READUNCOMMITTED és NOLOCK tippek FROM vagy UPDATE utasítás céltáblájára vonatkozó DELETE záradékban való használatának támogatása az SQL Server egy későbbi verziójában megszűnik. Ne használja ezeket a tippeket ebben a környezetben az új fejlesztési munkában, és tervezze meg a jelenleg használt alkalmazások módosítását.

Az alábbi lehetőségek egyikével minimalizálhatja a zárolási versengést, és megvédheti a tranzakciókat a nem véglegesített adatmódosítások piszkos olvasásától:

  • Az READ COMMITTEDREAD_COMMITTED_SNAPSHOT adatbázis-beállításkészlettel rendelkező elkülönítési szint ON.
  • A SNAPSHOT elkülönítési szintje.

További információ az elkülönítési szintekről: SET TRANSACTION ISOLATION LEVEL.

Note

Ha 601- hibaüzenet jelenik meg READUNCOMMITTED megadásakor, oldja fel a hibát holtpontként (1205-ös hibaüzenet), és próbálkozzon újra az utasítással.

REPEATABLEREAD

Megadja, hogy a vizsgálat ugyanolyan zárolási szemantikával legyen végrehajtva, mint egy REPEATABLE READ elkülönítési szinten futó tranzakció. További információ az elkülönítési szintekről: SET TRANSACTION ISOLATION LEVEL.

ROWLOCK

Azt adja meg, hogy a sorzárolások a lap- vagy táblazárolások során legyenek rögzítve. Ha a SNAPSHOT elkülönítési szinten működő tranzakciókban van megadva, a sorzárolások csak akkor lesznek érvényben, ha ROWLOCK más, zárolást igénylő táblamutatókkal van kombinálva, például UPDLOCK és HOLDLOCK. ROWLOCK nem használható fürtözött oszlopcentrikus indexet tartalmazó táblával. Az alábbi példa 651- hibát ad vissza az alkalmazásnak.

UPDATE [dbo].[FactResellerSalesXL_CCI] WITH (ROWLOCK)
    SET UnitPrice = 50
WHERE ProductKey = 150;

SERIALIZABLE

Egyenértékű HOLDLOCK. A megosztott zárolásokat korlátozóbbá teszi azáltal, hogy a tranzakció befejezéséig tartja őket, ahelyett, hogy azonnal feloldja a megosztott zárolást, amint már nincs szükség a szükséges táblára vagy adatlapra, függetlenül attól, hogy a tranzakció befejeződött-e vagy sem. A vizsgálat ugyanazokkal a szemantikával történik, mint a SERIALIZABLE elkülönítési szinten futó tranzakciók. További információ az elkülönítési szintekről: SET TRANSACTION ISOLATION LEVEL.

SNAPSHOT

: SQL Server 2014 (12.x) és újabb verziók

A memóriaoptimalizált táblázat SNAPSHOT elkülönítéssel érhető el. SNAPSHOT csak memóriaoptimalizált táblákkal használható (lemezalapú táblákkal nem), ahogyan az alábbi példában is látható. További információ: Bevezetés Memory-Optimized táblák.

SELECT *
FROM dbo.Customers AS c WITH (SNAPSHOT)
     LEFT OUTER JOIN dbo.[Order History] AS oh
         ON c.customer_id = oh.customer_id;

SPATIAL_WINDOW_MAX_CELLS = <integer_value>

A következővonatkozik: SQL Server 2012 (11.x) és újabb verziók

Megadja a geometria- vagy földrajzi objektumok kijelöléséhez használandó cellák maximális számát. <integer_value> 1 és 8192 közötti érték.

Ez a beállítás lehetővé teszi a lekérdezések végrehajtási idejének finomhangolását az elsődleges és a másodlagos szűrő végrehajtási idejének módosításával. A nagyobb szám csökkenti a másodlagos szűrő végrehajtási idejét, de növeli az elsődleges végrehajtási szűrő idejét, és kisebb szám csökkenti az elsődleges szűrő végrehajtási idejét, de növeli a másodlagos szűrővégrehajtást. A sűrűbb térbeli adatok esetében a nagyobb számnak gyorsabb végrehajtási időt kell eredményeznie azáltal, hogy jobb közelítést biztosít az elsődleges szűrőhöz, és csökkenti a másodlagos szűrő végrehajtási idejét. A ritkább adatok esetében az alacsonyabb szám csökkenti az elsődleges szűrővégrehajtás idejét.

Ez a beállítás manuális és automatikus rácsos tessellációkhoz is használható.

TABLOCK

Megadja, hogy a rendszer a beszerzett zárolást a tábla szintjén alkalmazza. A beszerzett zárolás típusa a végrehajtott utasítástól függ. Előfordulhat például, hogy egy SELECT utasítás megosztott zárolást szerez be. A TABLOCKmegadásával a rendszer a megosztott zárolást a teljes táblára alkalmazza a sor- vagy oldalszint helyett. Ha HOLDLOCK is meg van adva, a tábla zárolása a tranzakció végéig tart.

Ha adatokat importál egy halomba a INSERT INTO <target_table> SELECT <columns> FROM <source_table> utasítás használatával, a céltábla TABLOCK tippjének megadásával minimális naplózást és optimális zárolást engedélyezhet az utasításhoz. Emellett az adatbázis helyreállítási modelljét egyszerű vagy tömeges naplózásúra kell állítani. A TABLOCK tipp lehetővé teszi a párhuzamos beszúrásokat a halom vagy a fürtözött oszlopcentrikus indexek számára is. További információ: INSERT.

Ha a OPENROWSET tömeges sorhalmaz-szolgáltatóval használja az adatok táblázatba importálásához, TABLOCK lehetővé teszi, hogy több ügyfél egyidejűleg betöltse az adatokat a céltáblába optimalizált naplózással és zárolással. További információ: A tömeges importálásiminimális naplózás előfeltételei.

TABLOCKX

Megadja, hogy a rendszer kizárólagos zárolást rögzítsen a táblán.

UPDLOCK

Megadja, hogy a frissítési zárolásokat a tranzakció befejezéséig kell végrehajtani és tartani. UPDLOCK csak sorszintű vagy oldalszintű olvasási műveletekhez használja a frissítési zárolásokat. Ha UPDLOCKTABLOCKkombinálva van, vagy valamilyen más okból táblaszintű zárolást hoz létre, a rendszer ehelyett kizárólagos (X) zárolást hoz létre.

Ha UPDLOCK van megadva, a rendszer figyelmen kívül hagyja a READCOMMITTED és READCOMMITTEDLOCK elkülönítési szintre vonatkozó tippeket. Ha például a munkamenet elkülönítési szintje SERIALIZABLE van beállítva, és egy lekérdezés (UPDLOCK, READCOMMITTED) adja meg, a rendszer figyelmen kívül hagyja a READCOMMITTED tippet, és a tranzakció a SERIALIZABLE elkülönítési szinttel fut.

XLOCK

Megadja, hogy a kizárólagos zárolásokat a tranzakció befejezéséig kell végrehajtani és tartani. Ha ROWLOCK, PAGLOCKvagy TABLOCKvan megadva, a kizárólagos zárolások a megfelelő részletességi szintre vonatkoznak.

Remarks

A táblamutatók figyelmen kívül lesznek hagyva, ha a lekérdezési terv nem fér hozzá a táblához. Ennek oka lehet, hogy az optimalizáló úgy döntött, hogy egyáltalán nem fér hozzá a táblához, vagy indexelt nézetet használ. Az utóbbi esetben az indexelt nézet elérése megelőzhető a OPTION (EXPAND VIEWS) lekérdezési tipp használatával.

A rendszer minden zárolási tippet propagálja a lekérdezési terv által elért összes táblára és nézetre, beleértve a nézetben hivatkozott táblákat és nézeteket is. Emellett az SQL Server elvégzi a megfelelő zárolási konzisztencia-ellenőrzéseket is.

A sorszintű zárolásokat beszerző ROWLOCK, UPDLOCKés XLOCK zárolási tippeket a tényleges adatsorok helyett az indexkulcsokra helyezheti. Ha például egy tábla nemclustered indexet tartalmaz, és a zárolási tippet használó SELECT utasítást egy fedőindex kezeli, akkor a rendszer nem az alaptábla adatsorán, hanem a fedőindex indexkulcsán rögzíti a zárolást.

Ha egy tábla olyan számított oszlopokat tartalmaz, amelyeket más táblák oszlopaihoz hozzáférő kifejezések vagy függvények számolnak ki, a táblamutatók nem használhatók ezeken a táblákon, és nem propagálja őket. Egy NOLOCK tábla tippje például a lekérdezés egyik tábláján van megadva. Ez a táblázat olyan számított oszlopokat tartalmaz, amelyek egy másik tábla oszlopait elérő kifejezések és függvények kombinációjával vannak kiszámítva. A kifejezések és függvények által hivatkozott táblák nem használják a NOLOCK táblamutatót a hozzáféréskor.

Az SQL Server a FROM záradékban szereplő táblákhoz nem engedélyezi a következő csoportoktól származó több táblázatos tippet:

  • Részletességi tippek: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCKvagy TABLOCKX.
  • Elkülönítési szintekre tipp: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Szűrt indexmutatók

A szűrt index használható táblatippként, de a lekérdezésoptimalizáló 8622-as hibát generál, ha nem fedi le a lekérdezés által kiválasztott összes sort. Az alábbiakban egy érvénytelen szűrt indexmutatót mutatunk be. A példa létrehozza a szűrt indexet FIBillOfMaterialsWithComponentID, majd indexmutatóként használja egy SELECT utasításhoz. A szűrt index predikátum adatsorokat tartalmaz az 533-ra, a 324-re és a 753-ra vonatkozóan. A lekérdezési predikátum adatsorokat is tartalmaz az 533-ban, a 324-ben és a 753-ban lévő ComponentID-khez, de az eredményhalmazt úgy bővíti ki, hogy a 855-ös és a 924-ös componentID-ket is tartalmazza, amelyek nem szerepelnek a szűrt indexben. Ezért a lekérdezésoptimalizáló nem tudja használni a szűrt indexmutatót, és a 8622-s hibát generálja. További információ: Szűrt indexek létrehozása.

IF EXISTS (SELECT name FROM sys.indexes
           WHERE name = N'FIBillOfMaterialsWithComponentID'
                 AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
    DROP INDEX FIBillOfMaterialsWithComponentID
        ON Production.BillOfMaterials;
GO

CREATE NONCLUSTERED INDEX [FIBillOfMaterialsWithComponentID]
    ON Production.BillOfMaterials(ComponentID, StartDate, EndDate)
    WHERE ComponentID IN (533, 324, 753);
GO

SELECT StartDate, ComponentID
FROM Production.BillOfMaterials
WITH (INDEX (FIBillOfMaterialsWithComponentID))
WHERE ComponentID IN (533, 324, 753, 855, 924);
GO

A lekérdezésoptimalizáló nem veszi figyelembe az indexmutatót, ha a SET beállítások nem rendelkeznek a szűrt indexekhez szükséges értékekkel. További információ: CREATE INDEX.

Használd a NOEXPAND

NOEXPAND csak indexelt nézetekre vonatkozik. Az indexelt nézet egy egyedi fürtözött indexet tartalmazó nézet. Ha egy lekérdezés olyan oszlopokra mutató hivatkozásokat tartalmaz, amelyek indexelt nézetben és alaptáblákban is megtalálhatók, és a lekérdezésoptimalizáló megállapítja, hogy az indexelt nézet használata biztosítja a lekérdezés végrehajtásának legjobb módját, a lekérdezésoptimalizáló az indexet használja a nézetben. Ezt a funkciót indexelt nézetnek nevezzük, amely megfelel. Az indexelt nézet lekérdezésoptimalizáló általi automatikus használata csak az SQL Server adott kiadásaiban támogatott. Az Azure SQL Database és a felügyelt Azure SQL-példány az indexelt nézetek automatikus használatát is támogatja a NOEXPAND tipp megadása nélkül.

További információ: lekérdezésfeldolgozási architektúra útmutatója.

Az SQL Server windowsos kiadásai által támogatott funkciók listáját a következő témakörben találja:

Ahhoz azonban, hogy a lekérdezésoptimalizáló az indexelt nézeteket figyelembe vegye az egyezéshez, vagy az NOEXPAND tipptel hivatkozott indexelt nézetet használjon, a következő SET beállításokat ONkell beállítani.

  • ANSI_NULLS
  • ANSI_PADDING
  • ANSI_WARNINGS
  • ARITHABORT 1
  • CONCAT_NULL_YIELDS_NULL
  • QUOTED_IDENTIFIER

1ARITHABORT implicit módon ON értékre van állítva, ha ANSI_WARNINGSON. Ezért nem kell manuálisan módosítania ezt a beállítást.

Emellett a NUMERIC_ROUNDABORT beállítást OFFértékre kell állítani.

Ha azt szeretné, hogy a lekérdezésoptimalizáló indexet használjon indexelt nézethez, adja meg a NOEXPAND beállítást. Ez a tipp csak akkor használható, ha a nézet neve is szerepel a lekérdezésben. Az SQL Server nem ad meg egy tippet arra, hogy egy adott indexelt nézetet használjon olyan lekérdezésben, amely nem nevezi el közvetlenül a nézetet a FROM záradékban. A lekérdezésoptimalizáló azonban úgy véli, hogy indexelt nézeteket használ, még akkor is, ha nem hivatkoznak rájuk közvetlenül a lekérdezésben. Az SQL Server adatbázismotor csak akkor hoz létre automatikusan statisztikákat indexelt nézetben, ha NOEXPAND táblamutatót használ. Ha kihagyja ezt a tippet, végrehajtási terv figyelmeztetéseket kaphat a hiányzó statisztikákról, amelyeket nem lehet manuálisan létrehozni.

A lekérdezésoptimalizálás során az adatbázismotor automatikusan vagy manuálisan létrehozott nézetstatisztikákat használ, amikor a lekérdezés közvetlenül hivatkozik a nézetre, és a NOEXPAND tippet használja.

Táblamutató használata lekérdezési tippként

táblamutatók is megadható lekérdezési tippként a OPTION (TABLE HINT) záradék használatával. Azt javasoljuk, hogy csak egy terv útmutatójánakkontextusában használjon táblamutatót lekérdezési tippként. Alkalmi lekérdezések esetén ezeket a tippeket csak táblázatos tippekként adja meg. További információ: Lekérdezési tippek.

Permissions

A KEEPIDENTITY, IGNORE_CONSTRAINTSés IGNORE_TRIGGERS tippekhez ALTER engedélyre van szükség a táblában.

Examples

A. Zárolási módszer megadása a TABLOCK-tipp használatával

A következő példa azt jelzi, hogy egy közös zárolást vesznek fel az AdventureWorks2025 adatbázis tábláján Production.Product , és az utasítás végéig UPDATE tartják meg.

UPDATE Production.Product WITH (TABLOCK)
    SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO

B. Indexkeresési művelet megadása a FORCESEEK-tipp használatával

A következő példa indexek megadása nélkül használja FORCESEEK a tippet, hogy kényszerítse a lekérdezésoptimalizálót, hogy indexkereső műveletet hajtson végre az Sales.SalesOrderDetail AdventureWorks2025 adatbázis táblázatán.

SELECT *
FROM Sales.SalesOrderHeader AS h
     INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)
         ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
      AND (d.OrderQty > 5
           OR d.LineTotal < 1000.00);
GO

Az alábbi példa a FORCESEEK tippet használja egy index használatával, amely arra kényszeríti a lekérdezésoptimalizálót, hogy egy indexkeresési műveletet hajtson végre a megadott index- és indexoszlopon.

SELECT h.SalesOrderID,
       h.TotalDue,
       d.OrderQty
FROM Sales.SalesOrderHeader AS h
     INNER JOIN Sales.SalesOrderDetail AS d
         WITH (FORCESEEK (PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (SalesOrderID)))
         ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
      AND (d.OrderQty > 5
           OR d.LineTotal < 1000.00);
GO

C. Indexvizsgálati művelet megadása a FORCESCAN-tipp használatával

A következő példa a FORCESCAN tippet használja arra, hogy a lekérdezésoptimalizálót kényszerítse a szkenneli műveletre Sales.SalesOrderDetail az AdventureWorks2025 adatbázis tábláján.

SELECT h.SalesOrderID,
       h.TotalDue,
       d.OrderQty
FROM Sales.SalesOrderHeader AS h
     INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESCAN)
         ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
      AND (d.OrderQty > 5
           OR d.LineTotal < 1000.00);