有一张桌子:
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仍在运行时,我打开第二个会话到同一个server.database并继续:
SELECT * FROM T1;
正如预期的那样,输出中没有任何行。
然后我尝试:
SELECT * FROM T1 WITH(NOLOCK);
这次我得到了一整套导入的行,这也是预期的。
然而,当我跑步时:
SELECT id FROM t1 WITH(NOLOCK);
......我没有行。
如果我选择除id之外的任何列,我会得到部分结果。但是当我选择id 时,我什么也得不到。除非BULK INSERT完成,一切都恢复正常。
为什么会发生这种情况?为什么SELECT *返回行而SELECT id没有?
答案 0 :(得分:2)
为什么会发生这种情况?
因为你正在使用NOLOCK。所以你绝对不能保证得到什么。也许索引的非叶级别尚未建立。但谁知道呢。结果没有记录,可能随时改变。