因为数据比较多,所以,把数据按月建表存放,比如2月份的放在一张表Table2中,3月份的放在表Table3中.
问题出来了,如以下两种情况:
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.而且那个时候也有实时数据向这个表中,写入.不知道问题在哪儿?纳闷呀,数据库方面接触也比较久了,从来没有碰到过这样的问题.还请高人指点.
问题出来了,如以下两种情况:
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.而且那个时候也有实时数据向这个表中,写入.不知道问题在哪儿?纳闷呀,数据库方面接触也比较久了,从来没有碰到过这样的问题.还请高人指点.
3月1-10日数据量呢,而且表上的索引有重建吗
你查询时加上锁试试
C2那种查询是在Table3中查询的(刚才打字打错了),Table2中,存放2月份的数据,大概150万条,Table3中存放3月份的数据,(1号-9号)大概50万条.
索引是使用标识ID建立的,因为这两个表都要求实时的数据插入(1天大概插入5万条),所以没有建立其它索引.
重建指定数据库的一个或多个索引
* DBCC INDEXDEFRAG
对表或视图上的索引和非聚集索引进行碎片整理
TO:zsforever.在Table3后面加上with(nolock)了,还是一样,没有效果.现在的疑惑椒,Table2和Table3联合起来查询,没有问题,挺快的.就是单独查询Table3的数据非常慢....
3月份的只在Table3中,没有使用联合.
另外查询的时候要用
where 日期字段 >= '2010-02-01'
and 日期字段<'2010-03-10'
不要用datediff,dateadd,datepart等函数
刚才我让写Table3的进程停止了,没有数据写入了.
做上面的查询,还是比较慢,情况没有任何好转.
但是,我把Table3的数据导入到另外的表中(tempTable),再做上面的查询.速度就很快,秒杀(不到1秒钟).怎么办,怎么办?难道是表出来问题了?
但是,我把Table2与Table3UNION查询的时候,速度也很快,如果是表Table3出现了问题,那这个又做何解释?
查3月的 为什么要查table2?
请看前面三楼最开始打错了,但是CSDN不允许编辑....
--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
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' )
这段速度如何
没有得说.快.
上面两个SQL语句,第一个执行很快,而且包含了第二个,如果第二个因为SQL语句执行有问题的,那第一个也解释不通.PS:如果两个表一起查询的时候,速度很快,但是如果单独查询Table3的时候,第二个SQL语句中的Group BY语句,会使得查询变的很慢.但是第一个SQL语句中同样也有Group By,而且一样包含Table3的数据.却没有这样的问题.