sql >> Databáze >  >> RDS >> Sqlserver

Co jsou zámky řádků, stránek a tabulek? A kdy jsou pořízeny?

Zámek řádku

Zámek řádku je nejnižší možná úroveň granularity zamykání na serveru SQL Server. To znamená, že jeden nebo více konkrétních řádků bude uzamčeno a sousední řádky jsou stále dostupné pro uzamčení souběžnými dotazy.

Zámek stránky

Zámek stránky v SQL Server uzamkne data v hodnotě 8K, i když váš dotaz potřebuje pouze 10 bajtů ze stránky. Váš dotaz tedy uzamkne další data, která ve svém dotazu nepožadujete.

Hobt Lock

Když je tabulka rozdělena pomocí "rozdělení tabulky serveru SQL na oddíly", je možné, že jeden oddíl bude uzamčen (Hobt znamená Heap nebo B-Strom)

Poznámka: Eskalace zámků na zámky HOBT je ve výchozím nastavení zakázána. spusťte ALTER TABLE MyTable SET (LOCK_ESCALATION = AUTO) pro aktivaci eskalace uzamčení HOBT.

Table Lock

Zámek tabulky uzamkne celou tabulku.

Co jsou datové stránky

Microsoft SQL Server organizuje všechna svá data na „Datových stránkách“, které pojmou data v hodnotě 8K. To znamená, že pro jakýkoli přístup k datům v SQL Server 8K budou načteny informace.

Datové stránky mohou obsahovat pouze informace z jedné tabulky a rozvržení stránky je dobře zdokumentováno na MSDN

Skutečnost, že SQL Server vždy přečte úplnou datovou stránku, vám také dává představu, proč upřednostňuje použití zámků na úrovni stránky. Důsledkem zámků na úrovni stránky je, že můžete uzamknout mnohem více dat, než si myslíte.

Předpokládejme například, že máme tabulku s celkovou velikostí záznamu 1024 bajtů se seskupeným indexem v poli ID . Když spustíme následující dotaz:SELECT * from MyTable (xlock) where ID = 123 nejen tento záznam bude uzamčen, ale (v závislosti na vyplnění stránky) budou uzamčeny také maximálně 3 další záznamy.

Kdy jsou tyto zámky získány

Dotaz bude analyzován správcem dotazu a požadované zámky budou určeny a vyžádány od správce zámků. SQL Server se pokusí vytvořit rovnováhu mezi výkonem a sporem, aby určil strategii uzamčení.

SQL Server se také řídí systémem "eskalace uzamčení", který sníží granularitu zamykání při získávání více než 5000 zámků určitého typu. Další informace naleznete v tomto článku o eskalaci uzamčení.

Toto chování lze vyladit pomocí nápověd pro zamykání s důrazem na nápovědy , v dotazu můžete u každé tabulky určit, jaký typ zámků byste preferovali. SQL Server se pokusí vyhovět vašemu požadavku, ale přesto použije eskalaci uzamčení.




  1. Vytvoření kopie databáze v PostgreSQL

  2. Jak rozdělit hodnotu oddělenou čárkami do sloupců

  3. Uzamknout pro SELECT, aby jiný proces nezískal stará data

  4. Převést objekt SQL Server DateTime na BIGINT (.Net ticks)