SQL Server选择查询锁定插入。为什么?

3
我有两个在SQL Server 2008 R2上执行的SQL查询,没有显式的事务。
查询1:
SELECT * 
FROM MyTable 
WHERE Field1 = 'XXX' AND Field2 = 'YYY'

查询2:
SELECT * 
FROM MyTable 
WHERE Field1 = N'XXX' AND Field2 = N'YYY'

"查询2"比"查询1"更快,但在"查询2"运行期间,我无法向"MyTable"中写入(INSERT)新记录..."MyTable"似乎被锁定了。而在"查询1"运行时,我可以安静地添加新记录。
注意:"MyTable"具有聚集的复合键(两列)和其他索引。
您能解释一下这种行为的原因吗?
谢谢。

1
你的默认隔离级别是什么?DBCC useroptions; - Shaneis
这是"读已提交"。 - Luca Petrini
查询1和查询2返回的行数是否相同? - domenicr
@RuslanK。我正在调查……问题的原因是索引的存在。如果我删除它们,我就不再有这个问题,但性能会下降。我还测试了Pouria Sharif发布的解决方案,但仍然没有得到结果。 - Luca Petrini
最后,我通过使用一个"Read Uncommitted"事务读取数据来解决了这个问题(在我的情况下不应该是问题)。无论如何,问题发生在一个特定的索引存在的情况下(请注意:该表有超过1000万条记录);移除该索引会改变执行计划并且插入不会被阻塞(但查询速度会变慢)。 - Luca Petrini
显示剩余3条评论
1个回答

1
使用 ALTER/CREATE INDEX 的 ALLOW_PAGE_LOCKS 子句:
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);

我测试了你的解决方案,但没有任何结果...无论如何,原因是索引的存在...如果我删除它们,我就不再有这个问题,但性能会下降。我正在调查。 - Luca Petrini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接