I’m currently running the following statement
select * into adhoc..san_savedi from dps_san..savedi_record
It’s taking a painfully long time and I’d like to see how far along it is so I ran this:
select count(*) from adhoc..san_savedi with (nolock)
That didn’t return anything in a timely manner so for the heck of it I did this:
select top 1 * from adhoc..san_savedi with (nolock)
Even that seems to run indefinitely. I could understand if there are millions of records that the count(*) could take a long time, but I don’t understand why selecting the top 1 record wouldn’t come back pretty much immediately considering I specified nolock.
In the name of full disclosure, dps_san is a view that pulls from an odbc connection via linked server. I don’t think that’d be affecting why I can’t return the top row but just throwing it out there in case I’m wrong.
So I want to know what is keeping that statement from running?
EDIT:
As I mentioned above, yes dps_san..savedi_record is a view. Here’s what it does:
select * from DPS_SAN..root.SAVEDI_RECORD
It’s nothing more than an alias and does no grouping/sorting/etc so I don’t think the problem lies here, but please enlighten me if I’m wrong about that.
SELECTqueries withNOLOCKdon’t actually take no locks, they still need aSCH-S(schema stability) lock on the table (and as it is a heap it will also take ahobtlock).Additionally before the
SELECTcan even begin SQL Server must compile a plan for the statement, which also requires it to take aSCH-Slock out on the table.As your long running transaction creates the table via
SELECT ... INTOit holds an incompatibleSCH-Mlock on it until the statement completes.You can verify this by looking in
sys.dm_os_waiting_taskswhilstwhileduring the period of blocking.When I tried the following in one connection
And then executing (or just simply trying to view the estimated execution plan)
in a second the reading query was blocked.
Shows the wait type is indeed
SCH_Sand the blocking resourceSCH-M