Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Co blokuje Wybierz top 1 * z TableName z (nolock) przed zwróceniem wyniku?

SELECT zapytania z NOLOCK tak naprawdę nie przyjmują żadnych zamków, nadal potrzebują SCH-S (stabilność schematu) blokada stołu (i jak to jest sterta zajmie również hobt blokada ).

Dodatkowo przed SELECT może nawet zacząć SQL Server musi skompilować plan dla instrukcji, co również wymaga przyjęcia SCH-S zablokować na stole.

Ponieważ twoja długo trwająca transakcja tworzy tabelę za pomocą SELECT ... INTO zawiera niezgodny SCH-M zablokuj go, dopóki oświadczenie się nie zakończy.

Możesz to sprawdzić, zaglądając do sys.dm_os_waiting_tasks podczas podczas w okresie blokowania.

Kiedy próbowałem następujących w jednym połączeniu

BEGIN TRAN

SELECT *
INTO NewT
FROM master..spt_values

/*Remember to rollback/commit this later*/

A potem wykonanie (lub po prostu próba wyświetlenia szacunkowego planu wykonania)

SELECT *
FROM NewT
WITH (NOLOCK)

w ciągu sekundy zapytanie odczytu zostało zablokowane.

SELECT wait_type,
       resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>

Pokazuje, że typ oczekiwania to rzeczywiście SCH_S i blokujący zasób SCH-M

wait_type        resource_description
---------------- -------------------------------------------------------------------------------------------------------------------------------
LCK_M_SCH_S      objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czytasz dokument XML przechowywany w SQL Server z tekstowym typem danych?

  2. Dołącz wyniki z dwóch zapytań i wyprowadź jako pojedynczą tabelę

  3. SSMS wersja 18 – brak diagramów bazy danych

  4. Błąd konwersji podczas konwersji „nvarchar” na „datetime” w serwerze sql

  5. Jak zmienić model odzyskiwania bazy danych SQL Server za pomocą T-SQL