日期:2014-05-17  浏览次数:20454 次

表记录被锁住,,,
本帖最后由 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分钟

应该是查询执行时,有数据被更新等导致的排他锁存在。
------解决方案--------------------
引用:
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.
------解决方案--------------------