首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

表记要被锁住,

2013-01-05 
表记录被锁住,,,本帖最后由 Newlychen 于 2012-12-05 08:05:16 编辑1、select * from A where ccdate betwe

表记录被锁住,,,
本帖最后由 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.
------解决方案--------------------


先运行set statistics io on 和set statistics time on

再显示实际执行计划

再运行

然后把消息帖上来,计划截图发上来


单看两句语句能看出啥

这帖子推荐。。。。
[解决办法]
自己不明白原因的话,至少可以多跑几次,在不同时间段跑,把表中记录插入临时表再用同样条件查询,很多方法可以查出问题。
[解决办法]
路过,学习学习表记要被锁住,
[解决办法]
不知道每次都是这样的,还是偶然现象


[解决办法]

引用:
本帖最后由 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 '201……


先從執行計劃分析,看兩條語句的執行計劃成本,是否應用索引?
如果table A沒有聚集索引,在ccdate列上也沒有建索引,再加上table A數據量大,就會table scan ,那麼兩條查詢的時間自然會有很大的差異。

如果執行上面的2條查詢時候,還有其他的應用程序在對表A進行更新操作,同樣就會導致表鎖,自然查詢時間會有大差異。

热点排行