Locking database on SELECT INTO

人盡茶涼 提交于 2019-12-11 03:19:59

问题


I have a query that return a huge number of rows and I am using SELECT INTO (instead of INSERT INTO) to avoid having problems with transaction log.

The problem is: while this query is running, I can read objects but not showing them in object explorer. When I try to expand the tables item, for example, I receive the message bellow:

Is there a way to avoid this problem?


回答1:


Now here is a Test for you which will give answer to your question...

Open a Query window in SSMS. Write any query which will return any number or rows, could be only one row or maybe 10. and do as follows

Query window 1

BEGIN TRANSACTION;

SELECT *  
   INTO NEW_Test_TABLE
FROM TABLE_NAME

Query Window 2

Now Open another window and write a SELECT statement against this NEW_Test_TABLE.

SELECT * FROM NEW_Test_TABLE

Your Query will never finish executing,,, no results will be returned (At this time NEW_Test_TABLE only exists in buffer chache). Unless you go back to your 1st Query Window and commit the transaction, And if you goto query window 1 and ROLLBACK TRANSACTION NEW_Test_TABLE would have existed once in buffer chache and no longer exist anywhere.

Similarly when your Select into statement in being executed nothing is committed to disk, therefore SSMS cannot see it neither can show you any information about it via Object explorer.

So the answer is while the query is being executed be patient and let SQL Server Commit the SELECT INTO transaction to disk and you will be able to access it VIA querying it or via Object explorer.




回答2:


As M.Ali explained, SELECT INTO has a table lock on your new table, which is also locking the schema objects that SSMS is trying to query in order to build the tree browser.

I would suggest tuning the query so that the statement can run faster. Since this is inserting into a Heap with no indexes and has the tablock, it will be minimally logged as you stated. So it is likely the SELECT part of the statement that is causing things to be slow. See if that query can be optimized or broken into smaller pieces so that the statement does not run so long.

Alternatively, perform the insert in smaller batches using INSERT INTO (and not specifying the tablock hint)



来源:https://stackoverflow.com/questions/25272245/locking-database-on-select-into

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!