T-SQL:在第二个会话中填充时查询 table
T-SQL: querying table while populating it in a second session
有个table:
CREATE TABLE T1 (
id int NOT NULL PRIMARY KEY CLUSTERED
, some_column varchar(10)
, some_other_column datetime
, yet_another_one bigint
, bazillion_other_columns_goes_here ...
);
现在,我在 SSMS 中执行:
BULK INSERT T1 FROM 'E:\blahblahblah.dat';
blahblahblah.dat比较大; BULK INSERT 需要 40 多分钟才能完成。
当 BULK INSERT 仍在 运行ning 时,我打开第二个会话到同一个 server.database 然后去:
SELECT * FROM T1;
不出所料,我在输出中没有得到任何行。
那我试试:
SELECT * FROM T1 WITH(NOLOCK);
这次我得到了到目前为止导入的完整行集,也符合预期。
然而,当我运行:
SELECT id FROM t1 WITH(NOLOCK);
...我没有行。
如果我 select 除了 id 之外的任何列,我会得到部分结果。但是当我 select id only 时,我什么也得不到。当然,除非 BULK INSERT 完成并且一切恢复正常。
知道为什么会这样吗?为什么 SELECT * return 行而 SELECT id 没有?
Any ideas why this is happening?
因为您正在使用 NOLOCK。所以绝对不能保证你会得到什么。也许索引的非叶级还没有建立。但谁知道呢。结果未记录在案,随时可能更改。
有个table:
CREATE TABLE T1 (
id int NOT NULL PRIMARY KEY CLUSTERED
, some_column varchar(10)
, some_other_column datetime
, yet_another_one bigint
, bazillion_other_columns_goes_here ...
);
现在,我在 SSMS 中执行:
BULK INSERT T1 FROM 'E:\blahblahblah.dat';
blahblahblah.dat比较大; BULK INSERT 需要 40 多分钟才能完成。
当 BULK INSERT 仍在 运行ning 时,我打开第二个会话到同一个 server.database 然后去:
SELECT * FROM T1;
不出所料,我在输出中没有得到任何行。
那我试试:
SELECT * FROM T1 WITH(NOLOCK);
这次我得到了到目前为止导入的完整行集,也符合预期。
然而,当我运行:
SELECT id FROM t1 WITH(NOLOCK);
...我没有行。
如果我 select 除了 id 之外的任何列,我会得到部分结果。但是当我 select id only 时,我什么也得不到。当然,除非 BULK INSERT 完成并且一切恢复正常。
知道为什么会这样吗?为什么 SELECT * return 行而 SELECT id 没有?
Any ideas why this is happening?
因为您正在使用 NOLOCK。所以绝对不能保证你会得到什么。也许索引的非叶级还没有建立。但谁知道呢。结果未记录在案,随时可能更改。