sql >> Database >  >> RDS >> Sqlserver

nolock op een tijdelijke tabel in SQL Server 2008

Je kunt traceringsvlag 1200 gebruiken (op een ontwikkelmachine, omdat ik denk dat dit wereldwijd is) om de sloten zelf te zien verwijderen

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

Voor een globale tijdelijke tabel maakt het niet verwonderlijk meer uit.

Er is nog een klein verschil in type slot voor lokale #temp tafels wel. Ik reproduceer dat deel van de uitvoer hieronder

#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 

Bewerken: De bovenstaande resultaten zijn voor een hoop. Voor tijdelijke tabellen met een geclusterde index staan ​​de resultaten hieronder.

#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

De reden voor de BULK_OPERATION lock on the heap-versie wordt hier uitgelegd . Maar het is te zien dat de vergrendeling boven alles vrij minimaal is.



  1. Hoe een Got min één van een leesaanroepfout te benaderen bij het verbinden met een Amazon RDS Oracle-instantie

  2. hoe een vingerafdruksjabloon naar de Oracle-database te verplaatsen

  3. SQL haalt gegevens uit BEGIN; ...; EINDE; blok in python

  4. SQLNonTransientConnectionException Verbinding maken met MySQL in Eclipse