问题出来了,如以下两种情况:
C1:当我查询2月1号到3月10号的数据是,需要把Table2和Table3使用UNION ALL联合起来,速度还可以,加在一起大概200万条数据,1~2秒钟就出来了.
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
刚开始想到可能是3月份没有数据,但是两次查找结果都显示3月份有要查找的数据,而且两种情况下,查询结果都是正确的.
Table2与Table3 不同的是,Table2存放2月份的数据,现在是3月份,因此,不会向Table2表再写入数据,而是会根据情况,实时的向
Table3写数据.
我把Table3导出到另外的服务器上,只查询(没有程序对它做写入操作)再执行C2的时候,速度就很快了.
但是C1情况下,也查询了Table3.而且那个时候也有实时数据向这个表中,写入.
不知道问题在哪儿?
纳闷呀,数据库方面接触也比较久了,从来没有碰到过这样的问题.
还请高人指点.
38 个解决方案
#1
更正,上面C2情况:是只用到了"Table3表",而不是"只用到了Table2表".而且到现在,Table3表中的数据也只有50万条.
#2
更正,上面C2情况:是 只用到了 Table3表 ,而不是 只用到了Table2表 而且到现在,Table3表中的数据也只有50万条.
#3
C1:当我查询2月1号到3月10号的数据是,需要把Table2和Table3使用UNION ALL联合起来,速度还可以,加在一起大概200万条数据,1~2秒钟就出来了.
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
3月1-10日数据量呢,而且表上的索引有重建吗
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
3月1-10日数据量呢,而且表上的索引有重建吗
#4
数据量差别太。过滤条件不同造成的。
索引问题。
帮顶一下。
索引问题。
帮顶一下。
#5
谢谢.
不过,问题是查询多的数据比较快,查询少的数据,反而比较慢了.
#6
你不是说还有写的其他操作吗,
我把Table3导出到另外的服务器上,只查询(没有程序对它做写入操作)再执行C2的时候,速度就很快了.
你查询时加上锁试试
#7
C2那种查询是在Table3中查询的(刚才打字打错了),Table2中,存放2月份的数据,大概150万条,Table3中存放3月份的数据,(1号-9号)大概50万条.
索引是使用标识ID建立的,因为这两个表都要求实时的数据插入(1天大概插入5万条),所以没有建立其它索引.
#8
自己看一下2次的执行计划,应该是索引的问题。
#9
用事件探查器追踪一下
#10
应该和数据更新有关,加上with(nolock)试验下
#11
C1所查询的数据,包括Table2和Table3,而C2所查询的数据,只有Table3.
TO:SQL77 至于加锁机制,我有两个问题:1,会不会导致实时数据无法写入?2,C1查询用到的数据,完全包含了C2,但是C1没有加锁,情况很好,效率比较好.
TO:ldslove:至于索引,两个表的索引是一样,只建立了标识ID索引.
TO:fredrickhu:也使用事件探测器了,不过,我的查询语句只执行了一次,更多的是UPDATE和INSERT语句(实时数据上传写入到数据库).
感谢几位大牛能亲临指点....能不能再给点想法....
TO:SQL77 至于加锁机制,我有两个问题:1,会不会导致实时数据无法写入?2,C1查询用到的数据,完全包含了C2,但是C1没有加锁,情况很好,效率比较好.
TO:ldslove:至于索引,两个表的索引是一样,只建立了标识ID索引.
TO:fredrickhu:也使用事件探测器了,不过,我的查询语句只执行了一次,更多的是UPDATE和INSERT语句(实时数据上传写入到数据库).
感谢几位大牛能亲临指点....能不能再给点想法....
#12
DBCC REINDEX 重新建立索引试试
#13
支持。。。。。。。。。。。
#14
* DBCC DBREINDEX
重建指定数据库的一个或多个索引
* DBCC INDEXDEFRAG
对表或视图上的索引和非聚集索引进行碎片整理
#15
TO:fredrickhu.索引重新整理了.没有效果.
TO:zsforever.在Table3后面加上with(nolock)了,还是一样,没有效果.
现在的疑惑椒,Table2和Table3联合起来查询,没有问题,挺快的.就是单独查询Table3的数据非常慢....
TO:zsforever.在Table3后面加上with(nolock)了,还是一样,没有效果.
现在的疑惑椒,Table2和Table3联合起来查询,没有问题,挺快的.就是单独查询Table3的数据非常慢....
#16
SELECT * FROM TABLE3 WITH(TABLOCK)
你查一下执行计划是哪的问题,
#17
联合起来查询的语句是怎样的?
是用视图?那是不是视图有索引?
查3月数据怎么查询的,也是联合起来?
是用视图?那是不是视图有索引?
查3月数据怎么查询的,也是联合起来?
#18
使用它查询的时候,会不会影响数据的插入?是延迟插入?还是直接让插入进程牺牲掉?
#19
就是使用的UNION ALL,直接在SQL语句查询的.
3月份的只在Table3中,没有使用联合.
#20
表示热烈关注
UP
第三行
UP
第三行
#21
和你的索引有关。 .
#22
没有呀,两个表建立了同样的索引,都只是标识ID为索引...
刚刚 删除重新建立了也不行.
然后是删除所有的索引,效果还是一样.
#23
那在两个表的日期字段建立索引试下
另外查询的时候要用
where 日期字段 >= '2010-02-01'
and 日期字段<'2010-03-10'
不要用datediff,dateadd,datepart等函数
#24
也试了.还是不管用.
不知道大家对我的问题有什么疑惑,或是没有说清楚的地方没有.
现在的确没有什么其它想法了.
就希望有以前碰到过同样情况的高人,能说说解决办法....以做参考.
#25
因为Table3,有数据实时写入(每天大概4-5万条).
刚才我让写Table3的进程停止了,没有数据写入了.
做上面的查询,还是比较慢,情况没有任何好转.
但是,我把Table3的数据导入到另外的表中(tempTable),再做上面的查询.速度就很快,秒杀(不到1秒钟).
怎么办,怎么办?难道是表出来问题了?
但是,我把Table2与Table3UNION查询的时候,速度也很快,如果是表Table3出现了问题,那这个又做何解释?
刚才我让写Table3的进程停止了,没有数据写入了.
做上面的查询,还是比较慢,情况没有任何好转.
但是,我把Table3的数据导入到另外的表中(tempTable),再做上面的查询.速度就很快,秒杀(不到1秒钟).
怎么办,怎么办?难道是表出来问题了?
但是,我把Table2与Table3UNION查询的时候,速度也很快,如果是表Table3出现了问题,那这个又做何解释?
#26
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
查3月的 为什么要查table2?
查3月的 为什么要查table2?
#27
请看前面三楼
最开始打错了,但是CSDN不允许编辑....
#28
2次查询的sql贴出来看看
#29
--C1:第一种情况,选择2月份和3月分的数据
--Table2数据在150万左右,Table3在40万左右,此情况执行耗费在1秒钟左右.
SELECT b.MID ,--M编号
b.PID ,--P编号
COUNT(*) AS deltaCount ,--次数
SUM(deltaTime) AS deltaTime--总时间
FROM (
SELECT
MID ,
PID ,
maxValue ,--最值
DATEDIFF(second, beginTime, endTime) AS deltaTime--时间差
FROM Table2
WHERE ( beginTime BETWEEN '2010-02-01 00:00:00'
AND '2010-03-09 00:00:00' )
UNION ALL
SELECT MID ,
PID ,
maxValue ,
DATEDIFF(second, beginTime, endTime) AS deltaTime
FROM Table3
WHERE ( beginTime BETWEEN '2010-02-01 00:00:00'
AND '2010-03-09 00:00:00' )
) AS a
RIGHT JOIN TableGASP AS b ON a.MID = b.MID
AND a.PID = b.PID
LEFT JOIN TableGAS AS c ON b.gradealarmid = c.id
WHERE a.maxValue >= c.oneLevel --maxValue在[oneLevel,twoLevel),之间
AND a.maxValue < c.twoLevel
GROUP BY b.MID ,
b.PID
-------------------------------------------------------------
--C2:只选择3月份的数据.
--此情况,耗费1分钟左右.
SELECT b.MID ,
b.PID ,
COUNT(*) AS deltaCount ,
SUM(deltaTime) AS deltaTime
FROM (
SELECT MID ,
PID ,
maxValue ,
DATEDIFF(second, beginTime, endTime) AS deltaTime
FROM Table3
WHERE ( beginTime BETWEEN '2010-03-01 00:00:00'
AND '2010-03-09 00:00:00' )
) AS a
RIGHT JOIN TableGASP AS b ON a.MID = b.MID
AND a.PID = b.PID
LEFT JOIN TableGAS AS c ON b.gradealarmid = c.id
WHERE a.maxValue >= c.oneLevel
AND a.maxValue < c.twoLevel
GROUP BY b.MID ,
b.PID
#30
请求大家再给予指点..
#31
你查一下执行计划看看,哪里消耗比较多,那些优化的牛人还没帮你看呢,呵呵
#32
大家好,感谢您在百忙之中给予我的关注,谢谢!
由于我最近需要搞一个设计,题目就是 《多平台异构数据库复制技术研究》 我在网上找了很多资料,找到的都只有论文,基本上没有关于这设计的源代码,所以我来到这里请大家帮忙, 如果有那位高手有或者会写关于我这个题目的源代码请联系我! 也可以直接加QQ493991609再详谈! 代价好说!
由于我最近需要搞一个设计,题目就是 《多平台异构数据库复制技术研究》 我在网上找了很多资料,找到的都只有论文,基本上没有关于这设计的源代码,所以我来到这里请大家帮忙, 如果有那位高手有或者会写关于我这个题目的源代码请联系我! 也可以直接加QQ493991609再详谈! 代价好说!
#33
SELECT MID ,
PID ,
maxValue ,
DATEDIFF(second, beginTime, endTime) AS deltaTime
FROM Table3
WHERE ( beginTime BETWEEN '2010-03-01 00:00:00'
AND '2010-03-09 00:00:00' )
这段速度如何
#34
没有得说.快.
上面两个SQL语句,第一个执行很快,而且包含了第二个,如果第二个因为SQL语句执行有问题的,那第一个也解释不通.
PS:如果两个表一起查询的时候,速度很快,但是如果单独查询Table3的时候,第二个SQL语句中的Group BY语句,会使得查询变的很慢.但是第一个SQL语句中同样也有Group By,而且一样包含Table3的数据.却没有这样的问题.
#35
在查询分析器里面显示预计的执行计划
看看资源在哪被消耗了!
看看资源在哪被消耗了!
#36
执行了,只是预计的,不是实际的....
谢谢.
#37
结贴,我们头通过重新建索引,把问题解决了.
不过,具体的原因还是没有搞懂.
问题解决了,是件好事.谢谢各位也谢谢我们头.
不过,具体的原因还是没有搞懂.
问题解决了,是件好事.谢谢各位也谢谢我们头.
#38
强制索引就可以了,或着手动的更新索引的统计信息。
因为重建索引会更新索引统计信息,所以会解决你的问题。
一般的作法是强制索引.
因为重建索引会更新索引统计信息,所以会解决你的问题。
一般的作法是强制索引.
#1
更正,上面C2情况:是只用到了"Table3表",而不是"只用到了Table2表".而且到现在,Table3表中的数据也只有50万条.
#2
更正,上面C2情况:是 只用到了 Table3表 ,而不是 只用到了Table2表 而且到现在,Table3表中的数据也只有50万条.
#3
C1:当我查询2月1号到3月10号的数据是,需要把Table2和Table3使用UNION ALL联合起来,速度还可以,加在一起大概200万条数据,1~2秒钟就出来了.
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
3月1-10日数据量呢,而且表上的索引有重建吗
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
3月1-10日数据量呢,而且表上的索引有重建吗
#4
数据量差别太。过滤条件不同造成的。
索引问题。
帮顶一下。
索引问题。
帮顶一下。
#5
谢谢.
不过,问题是查询多的数据比较快,查询少的数据,反而比较慢了.
#6
你不是说还有写的其他操作吗,
我把Table3导出到另外的服务器上,只查询(没有程序对它做写入操作)再执行C2的时候,速度就很快了.
你查询时加上锁试试
#7
C2那种查询是在Table3中查询的(刚才打字打错了),Table2中,存放2月份的数据,大概150万条,Table3中存放3月份的数据,(1号-9号)大概50万条.
索引是使用标识ID建立的,因为这两个表都要求实时的数据插入(1天大概插入5万条),所以没有建立其它索引.
#8
自己看一下2次的执行计划,应该是索引的问题。
#9
用事件探查器追踪一下
#10
应该和数据更新有关,加上with(nolock)试验下
#11
C1所查询的数据,包括Table2和Table3,而C2所查询的数据,只有Table3.
TO:SQL77 至于加锁机制,我有两个问题:1,会不会导致实时数据无法写入?2,C1查询用到的数据,完全包含了C2,但是C1没有加锁,情况很好,效率比较好.
TO:ldslove:至于索引,两个表的索引是一样,只建立了标识ID索引.
TO:fredrickhu:也使用事件探测器了,不过,我的查询语句只执行了一次,更多的是UPDATE和INSERT语句(实时数据上传写入到数据库).
感谢几位大牛能亲临指点....能不能再给点想法....
TO:SQL77 至于加锁机制,我有两个问题:1,会不会导致实时数据无法写入?2,C1查询用到的数据,完全包含了C2,但是C1没有加锁,情况很好,效率比较好.
TO:ldslove:至于索引,两个表的索引是一样,只建立了标识ID索引.
TO:fredrickhu:也使用事件探测器了,不过,我的查询语句只执行了一次,更多的是UPDATE和INSERT语句(实时数据上传写入到数据库).
感谢几位大牛能亲临指点....能不能再给点想法....
#12
DBCC REINDEX 重新建立索引试试
#13
支持。。。。。。。。。。。
#14
* DBCC DBREINDEX
重建指定数据库的一个或多个索引
* DBCC INDEXDEFRAG
对表或视图上的索引和非聚集索引进行碎片整理
#15
TO:fredrickhu.索引重新整理了.没有效果.
TO:zsforever.在Table3后面加上with(nolock)了,还是一样,没有效果.
现在的疑惑椒,Table2和Table3联合起来查询,没有问题,挺快的.就是单独查询Table3的数据非常慢....
TO:zsforever.在Table3后面加上with(nolock)了,还是一样,没有效果.
现在的疑惑椒,Table2和Table3联合起来查询,没有问题,挺快的.就是单独查询Table3的数据非常慢....
#16
SELECT * FROM TABLE3 WITH(TABLOCK)
你查一下执行计划是哪的问题,
#17
联合起来查询的语句是怎样的?
是用视图?那是不是视图有索引?
查3月数据怎么查询的,也是联合起来?
是用视图?那是不是视图有索引?
查3月数据怎么查询的,也是联合起来?
#18
使用它查询的时候,会不会影响数据的插入?是延迟插入?还是直接让插入进程牺牲掉?
#19
就是使用的UNION ALL,直接在SQL语句查询的.
3月份的只在Table3中,没有使用联合.
#20
表示热烈关注
UP
第三行
UP
第三行
#21
和你的索引有关。 .
#22
没有呀,两个表建立了同样的索引,都只是标识ID为索引...
刚刚 删除重新建立了也不行.
然后是删除所有的索引,效果还是一样.
#23
那在两个表的日期字段建立索引试下
另外查询的时候要用
where 日期字段 >= '2010-02-01'
and 日期字段<'2010-03-10'
不要用datediff,dateadd,datepart等函数
#24
也试了.还是不管用.
不知道大家对我的问题有什么疑惑,或是没有说清楚的地方没有.
现在的确没有什么其它想法了.
就希望有以前碰到过同样情况的高人,能说说解决办法....以做参考.
#25
因为Table3,有数据实时写入(每天大概4-5万条).
刚才我让写Table3的进程停止了,没有数据写入了.
做上面的查询,还是比较慢,情况没有任何好转.
但是,我把Table3的数据导入到另外的表中(tempTable),再做上面的查询.速度就很快,秒杀(不到1秒钟).
怎么办,怎么办?难道是表出来问题了?
但是,我把Table2与Table3UNION查询的时候,速度也很快,如果是表Table3出现了问题,那这个又做何解释?
刚才我让写Table3的进程停止了,没有数据写入了.
做上面的查询,还是比较慢,情况没有任何好转.
但是,我把Table3的数据导入到另外的表中(tempTable),再做上面的查询.速度就很快,秒杀(不到1秒钟).
怎么办,怎么办?难道是表出来问题了?
但是,我把Table2与Table3UNION查询的时候,速度也很快,如果是表Table3出现了问题,那这个又做何解释?
#26
C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
查3月的 为什么要查table2?
查3月的 为什么要查table2?
#27
请看前面三楼
最开始打错了,但是CSDN不允许编辑....
#28
2次查询的sql贴出来看看
#29
--C1:第一种情况,选择2月份和3月分的数据
--Table2数据在150万左右,Table3在40万左右,此情况执行耗费在1秒钟左右.
SELECT b.MID ,--M编号
b.PID ,--P编号
COUNT(*) AS deltaCount ,--次数
SUM(deltaTime) AS deltaTime--总时间
FROM (
SELECT
MID ,
PID ,
maxValue ,--最值
DATEDIFF(second, beginTime, endTime) AS deltaTime--时间差
FROM Table2
WHERE ( beginTime BETWEEN '2010-02-01 00:00:00'
AND '2010-03-09 00:00:00' )
UNION ALL
SELECT MID ,
PID ,
maxValue ,
DATEDIFF(second, beginTime, endTime) AS deltaTime
FROM Table3
WHERE ( beginTime BETWEEN '2010-02-01 00:00:00'
AND '2010-03-09 00:00:00' )
) AS a
RIGHT JOIN TableGASP AS b ON a.MID = b.MID
AND a.PID = b.PID
LEFT JOIN TableGAS AS c ON b.gradealarmid = c.id
WHERE a.maxValue >= c.oneLevel --maxValue在[oneLevel,twoLevel),之间
AND a.maxValue < c.twoLevel
GROUP BY b.MID ,
b.PID
-------------------------------------------------------------
--C2:只选择3月份的数据.
--此情况,耗费1分钟左右.
SELECT b.MID ,
b.PID ,
COUNT(*) AS deltaCount ,
SUM(deltaTime) AS deltaTime
FROM (
SELECT MID ,
PID ,
maxValue ,
DATEDIFF(second, beginTime, endTime) AS deltaTime
FROM Table3
WHERE ( beginTime BETWEEN '2010-03-01 00:00:00'
AND '2010-03-09 00:00:00' )
) AS a
RIGHT JOIN TableGASP AS b ON a.MID = b.MID
AND a.PID = b.PID
LEFT JOIN TableGAS AS c ON b.gradealarmid = c.id
WHERE a.maxValue >= c.oneLevel
AND a.maxValue < c.twoLevel
GROUP BY b.MID ,
b.PID
#30
请求大家再给予指点..
#31
你查一下执行计划看看,哪里消耗比较多,那些优化的牛人还没帮你看呢,呵呵
#32
大家好,感谢您在百忙之中给予我的关注,谢谢!
由于我最近需要搞一个设计,题目就是 《多平台异构数据库复制技术研究》 我在网上找了很多资料,找到的都只有论文,基本上没有关于这设计的源代码,所以我来到这里请大家帮忙, 如果有那位高手有或者会写关于我这个题目的源代码请联系我! 也可以直接加QQ493991609再详谈! 代价好说!
由于我最近需要搞一个设计,题目就是 《多平台异构数据库复制技术研究》 我在网上找了很多资料,找到的都只有论文,基本上没有关于这设计的源代码,所以我来到这里请大家帮忙, 如果有那位高手有或者会写关于我这个题目的源代码请联系我! 也可以直接加QQ493991609再详谈! 代价好说!
#33
SELECT MID ,
PID ,
maxValue ,
DATEDIFF(second, beginTime, endTime) AS deltaTime
FROM Table3
WHERE ( beginTime BETWEEN '2010-03-01 00:00:00'
AND '2010-03-09 00:00:00' )
这段速度如何
#34
没有得说.快.
上面两个SQL语句,第一个执行很快,而且包含了第二个,如果第二个因为SQL语句执行有问题的,那第一个也解释不通.
PS:如果两个表一起查询的时候,速度很快,但是如果单独查询Table3的时候,第二个SQL语句中的Group BY语句,会使得查询变的很慢.但是第一个SQL语句中同样也有Group By,而且一样包含Table3的数据.却没有这样的问题.
#35
在查询分析器里面显示预计的执行计划
看看资源在哪被消耗了!
看看资源在哪被消耗了!
#36
执行了,只是预计的,不是实际的....
谢谢.
#37
结贴,我们头通过重新建索引,把问题解决了.
不过,具体的原因还是没有搞懂.
问题解决了,是件好事.谢谢各位也谢谢我们头.
不过,具体的原因还是没有搞懂.
问题解决了,是件好事.谢谢各位也谢谢我们头.
#38
强制索引就可以了,或着手动的更新索引的统计信息。
因为重建索引会更新索引统计信息,所以会解决你的问题。
一般的作法是强制索引.
因为重建索引会更新索引统计信息,所以会解决你的问题。
一般的作法是强制索引.