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

nolock w tabeli tymczasowej w SQL Server 2008

Możesz użyć flagi śledzenia 1200 (na maszynie programistycznej, ponieważ myślę, że jest to globalna), aby zobaczyć, jakie blokady zostały zdjęte dla siebie

SET NOCOUNT ON;

CREATE TABLE ##T
(
X INT
)

INSERT INTO ##T 
SELECT number
FROM master..spt_values

CREATE TABLE #T
(
X INT
)
INSERT INTO #T
SELECT *
FROM ##T

/*Run the commands first with the trace flag off so the locking
info is less full of irrelevant stuff about plan compilation 
*/
GO

PRINT '##T Read Committed'
SELECT COUNT(*) FROM ##T
PRINT '##T NOLOCK'
SELECT COUNT(*) FROM ##T WITH (NOLOCK)
PRINT '##T Finished'

GO

PRINT '#T Read Committed'
SELECT COUNT(*) FROM #T
PRINT '#T NOLOCK'
SELECT COUNT(*) FROM #T WITH (NOLOCK)
PRINT '#T Finished'

GO

DBCC TRACEON(-1,3604)
DBCC TRACEON(-1,1200)

GO

PRINT '##T Read Committed'
SELECT COUNT(*) FROM ##T
PRINT '##T NOLOCK'
SELECT COUNT(*) FROM ##T WITH (NOLOCK)
PRINT '##T Finished'

GO

PRINT '#T Read Committed'
SELECT COUNT(*) FROM #T
PRINT '#T NOLOCK'
SELECT COUNT(*) FROM #T WITH (NOLOCK)
PRINT '#T Finished'

GO

DBCC TRACEOFF(-1,3604)
DBCC TRACEOFF(-1,1200)

DROP TABLE ##T
DROP TABLE #T

W przypadku globalnej tabeli tymczasowej, jak można się spodziewać, robi to większą różnicę.

Nadal istnieje niewielka różnica w typie zamka dla lokalnego #temp jednak tabele. Odtwarzam tę część wyników poniżej

#T Read Committed
Process 56 acquiring IS lock on OBJECT: 2:301244128:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on OBJECT: 2:301244128:0  (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 2:301244128:0 

#T NOLOCK
Process 56 acquiring Sch-S lock on OBJECT: 2:301244128:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 2:9079256880114171904 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 2:301244128:0 

Edytuj: Powyższe wyniki dotyczą kupy. W przypadku tabel tymczasowych z indeksem klastrowym wyniki znajdują się poniżej.

#T Read Committed
Process 55 acquiring IS lock on OBJECT: 2:1790629422:0  (class bit0 ref1) result: OK

Process 55 acquiring S lock on OBJECT: 2:1790629422:0  (class bit0 ref1) result: OK

Process 55 releasing lock on OBJECT: 2:1790629422:0 

#T NOLOCK
Process 55 acquiring Sch-S lock on OBJECT: 2:1790629422:0  (class bit0 ref1) result: OK

Process 55 releasing lock on OBJECT: 2:1790629422:0 

#T Finished

Powód BULK_OPERATION Wersja blokady na stercie jest wyjaśniona tutaj . Ale widać, że narzut blokowania jest dość minimalny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd:typ kolumny DOB jest w konflikcie z typem innych kolumn określonych na liście UNPIVOT

  2. Błędnie obliczona liczba tygodni i częściowych tygodni między dwoma dniami

  3. Zaktualizuj rekordy w tabeli z CTE

  4. Znaleźć prawdziwą nazwę kolumny aliasu używanego w widoku?

  5. Zapytanie rekurencyjne, w którym kotwica i element członkowski mają związki