表记录被锁住,,,
本帖最后由 Newlychen 于 2012-12-05 08:05:16 编辑
1、select * from A where ccdate
between '2011-01-01' and '2011-12-31'--记录11000,耗时31秒
2、select * from A where ccdate
between '2012-01-01' and '2012-03-31'--记录880,耗时55分钟
请问是否有什么东东锁住了between '2012-01-01' and '2012-03-31' 这段时间的数据?
------解决方案--------------------不是数据被锁,应该是没索引,表扫描了
你对 ccdate 建个索引看看.
------解决方案--------------------ccdate字段加索引
语句修改为
select * from A where ccdate>='2011-01-01' and ccdate<='2011-12-31'
试试
另外这个还与结果集有关系。
------解决方案--------------------
try:
create nonclustered index ccdate_idx on tb(ccdate asc)
go
select * from tb where between '2011-01-01' and '2011-12-31'
go
------解决方案--------------------如果你的这段时间内的数据量在表里的所有数据中比例比较大 索引就没多大作用了
------解决方案--------------------1、对ccdate建立索引
CREATE CLUSTERED INDEX mycol_ccdate_index ON A(ccdate)
2、查询select后面*换成较少的需要的字段试试
select col1,col2 from A where ccdate>'2012-01-01' and ccdate<='2012-03-31'
------解决方案--------------------具体要看执行计划和阻塞情况:
看阻塞:select * from sys.sysprocesses where blocked<>0
执行计划贴出来
------解决方案--------------------select * from A where ccdate between '2012-01-01' and '2012-03-31'--记录880,耗时55分钟
应该是查询执行时,有数据被更新等导致的排他锁存在。
------解决方案--------------------
可能性不大。因为耗时55分钟。这个时间太长。修改一条数据不可能几十分钟.不过楼主可以先检查锁.
------解决方案--------------------问一下你的表没分区或者A不是视图吧?
------解决方案--------------------ccdate 上建聚集索引会提高SELECT 速度
1、select * from A where ccdate with (nolock) between '2011-01-01' and '2011-12-31'--记录11000,耗时31秒
2、select * from A where ccdate with (nolock) between '2012-01-01' and '2012-03-31'--记录880,耗时55分钟
--加上nolock再测测
加上快照隔离或脏读
通过sp_lock/sys.dm_tran_locks查看锁信息
------解决方案--------------------楼上 with (nolock) 要加在表后面
------解决方案--------------------进来学习,高手真多
------解决方案--------------------这个问题值得探讨一下,推荐一下
------解决方案--------------------learning.
------解决方案--------------------