首页 新闻 会员 周边 捐助

数据库的with(lock)导致数据的查询变慢?

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-14 09:21

我的数据库的查询,添加,更新  都是采用with(lock)来做的,可是程序杂查询的时候会导致查询的速度变得很慢,而且占用了大量的内存,数据库内才100条的数据,查询top1都要十秒,这是为什么呢?  我该怎么去优化呢(我改怎么办?)------------求帮助

问题补充:
 SQL活动监视器里显示被阻塞的  
排他锁 半天没反应 一直等
.F.的主页 .F. | 初学一级 | 园豆:13
提问于:2013-08-13 12:23
< >
分享
最佳答案
0

为啥每次都要加锁呢?

收获园豆:10
幻天芒 | 高人七级 |园豆:37207 | 2013-08-13 12:58

每次进行的操作都必须保证数据的正确性,不被脏读之类的

.F. | 园豆:13 (初学一级) | 2013-08-13 13:13

@.F.: 并发很多???

幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 15:39

@幻天芒: en   很多个..我发现自己搞不定啊,没学过并发的知识

.F. | 园豆:13 (初学一级) | 2013-08-13 16:50

@.F.: 什么系统啊?需要时刻加锁?表示设计可能有问题~

幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 16:58

@幻天芒: 就是群发短信的系统...对于未处理的短信进行逐个处理(发送)

.F. | 园豆:13 (初学一级) | 2013-08-13 17:03

@.F.: 我觉得这用不着加锁吧...

幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 17:17

@幻天芒: 那要怎么控制1条短信正在处理的时候,不会被另一个客户端捕获到进行处理呢(两个以上的客户端同时运行)

.F. | 园豆:13 (初学一级) | 2013-08-13 17:20

@.F.: 时间戳...这样要多加一个字段控制。对于你的客户端来说,应该是多台短信猫或者多个短信网关吧。这种情况下,可以按照id啥的特点进行分开处理,比如,2个网关,那么网关1,id为单数的,网关2,id为双数的。这种..有点分表的味道。

幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 17:33

@幻天芒: 多加一个字段显得比较麻烦...因为数据库里已经有很多数据了,所以说  还是加锁比较好。但是我又不怎么会用...有关于加锁之类的教程么?

.F. | 园豆:13 (初学一级) | 2013-08-13 17:39
幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 17:46

@幻天芒: 嗯  谢谢啦...话说  还没用过查找功能..

.F. | 园豆:13 (初学一级) | 2013-08-14 09:21
其他回答(1)
0

如果方便的话,建议把这条查询的执行计划贴出来

dudu | 园豆:30778 (高人七级) | 2013-08-13 13:06
    sqlstr = "select TOP 1 tempID,SendPhone,text  from " + tablename 
                    + " WITH (XLOCK) where states = 0 and (SendTime between '2000-1-1 00:00:00' and getdate())";
   sqlstr = "Update " + tablename + " with(XLOCK) set states = 2 where tempID = " + dt.Rows[0][0].ToString();
      splittext = text.Substring(i * contentsplitlength, contentsplitlength);
                            sqlstr = "insert into " + tablename + " with(XLOCK) (SendPhone,text)  Values('" +
                            dt.Rows[0][1].ToString() + "','" + splittext + "')"; 
支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 13:12

@.F.: 是执行计划,不是SQL语句

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2013-08-13 13:13

@dudu: 他们没给我...是不是with(XLOCK)这个语句没问题,只是执行计划的内容出问题了,比如说是死锁之类的?

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 14:04

@.F.: 为什么要加with(XLOCK)?

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2013-08-13 14:36

@.F.: 建议查询时使用with(NOLOCK)

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2013-08-13 14:41

@dudu: 因为在查询操作之后会有后续的连续操作,避免数据在同一时刻被更改

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 14:42

@.F.: 

SQL活动监视器里显示被阻塞的  
 
支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 14:42

@.F.: 建议先去掉with(XLOCK)看一下是否还是这么慢

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2013-08-13 14:46

@dudu: 嗯  好的

我去试试

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 14:48

@dudu: dudu园长...去掉的话 (开两个程序的时候)会导致同一条数据被抓取多次啊,这要怎么解决呢?

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 14:51

@.F.: 去掉主要是排除一下是不是with(XLOCK)引起的

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2013-08-13 14:56

@dudu: 是的   如果不用xlock的话  速度就和平常一样了

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2013-08-13 15:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册