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

Eskalace uzamčení - Co se tady děje?

"Uzamknout eskalaci " je způsob, jakým SQL zpracovává zamykání pro velké aktualizace. Když SQL změní mnoho řádků, je pro databázový stroj efektivnější vzít méně větších zámků (např. celou tabulku) namísto zamykání mnoha menších věcí (např. zámků řádků)

To však může být problematické, když máte velký stůl, protože uzamknutí celého stolu může na dlouhou dobu zablokovat další dotazy. To je kompromis:mnoho zámků s malou zrnitostí je pomalejších než méně (nebo jeden) hrubozrnných zámků a vícenásobné dotazy zamykající různé části tabulky vytváří možnost uváznutí, pokud jeden proces čeká na druhý.

Existuje možnost na úrovni tabulky, LOCK_ESCALATION , novinka v SQL 2008, která umožňuje ovládání eskalace zámků. Výchozí hodnota „TABLE“ umožňuje eskalaci zámků až na úroveň tabulky. DISABLE ve většině případů zabrání eskalaci zámku na celou tabulku. AUTO povoluje zámky tabulky s výjimkou případů, kdy je tabulka rozdělena na oddíly, v takovém případě se zámky vytvářejí pouze na úrovni oddílu. Viz tento příspěvek na blogu pro více informací.

Mám podezření, že IDE přidává toto nastavení při opětovném vytváření tabulky, protože TABLE je výchozí v SQL 2008. Všimněte si, že LOCK_ESCALATION není podporováno v SQL 2005, takže jej budete muset odstranit, pokud se pokusíte spustit skript na instance z roku 2005. Vzhledem k tomu, že výchozí nastavení je TABLE, můžete tento řádek při opětovném spuštění skriptu bezpečně odstranit.

Všimněte si také, že v SQL 2005, než bylo toto nastavení přítomno, mohly všechny zámky eskalovat na úroveň tabulky – jinými slovy, "TABLE" bylo jediné nastavení v SQL 2005.



  1. Logstash INPUT MySQL

  2. Jak změnit řazení na utf8_bin jedním tahem

  3. Automatický sběr dat změn databázového schématu na MS SQL Server

  4. SQL dotaz pro zobrazení nejbližšího data?