数据库关联查询六月或六月之前数据可行,查询七月或八月数据非常慢

GaraMaps 2017-08-21 11:53:50
select c_name,c_bank,c_account,c_tag,(
select sum(rr_fee) from Sys_ReplenishRecord where Sys_ReplenishRecord.c_code in
(select c_code from sys_ct where sys_ct.opt_id=com.opt_id) and rr_time >= '2017-7-1 00:00:00' and rr_time <='2017-7-31 23:59:59' and rr_state<>'-2'
) fee,(
select sum(cz_times) from Sys_ReplenishRecord where Sys_ReplenishRecord.c_code in
(select c_code from sys_ct where sys_ct.opt_id=com.opt_id) and rr_time >= '2017-7-1 00:00:00' and rr_time <='2017-7-31 23:59:59' and rr_state<>'-2'
) times,com.opt_id from sys_company com
where c_companytype = 1

不知道为什么,在做一个关联查询时,按照时间查询今年六月份或六月份之前的数据,查询速度正常,但是查询七月份和现在八月份的数据时异常的慢,导致程序超时,当时想是不是后台代码的问题,测试sql语句时发现在数据库中查询速度也是非常慢,
六月份和六月份之前的每月数据量与七八月份的每月数据量差不多,到底是什么问题呢?

编程新人,分数不多,求大神慷慨相助,感激不尽。
...全文
240 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-08-21
  • 打赏
  • 举报
回复
引用 7 楼 yenange 的回复:
[quote=引用 6 楼 sinat_28984567 的回复:] [quote=引用 3楼我是你的主体 的回复:]谢谢2楼,CSDN没法回复别人的吗,好尴尬
点击引用就是回复了 我那个就是对楼主的语句优化了一下,结果对不对需要楼主验证…[/quote] 感觉你的写法有问题,你的写法如果有一对多, 或者有记录没有对应的就跟原来的逻辑对不上了。 [/quote] 恩是存在这种问题,我是按照最理想的情况写的,如果不对还得调整,所以让楼主验证是否正确。 一对多应该没问题吧,是按分组统计的,当然如果主表本身就有重复数据并且是合理的,那也有问题。 没有对应上的改成left join应该就可以。 情况确实很多,这样写的也确实不如你写的那个健壮性强
GaraMaps 2017-08-21
  • 打赏
  • 举报
回复
引用 7 楼 yenange 的回复:
[quote=引用 6 楼 sinat_28984567 的回复:] [quote=引用 3楼我是你的主体 的回复:]谢谢2楼,CSDN没法回复别人的吗,好尴尬
点击引用就是回复了 我那个就是对楼主的语句优化了一下,结果对不对需要楼主验证…[/quote] 感觉你的写法有问题,你的写法如果有一对多, 或者有记录没有对应的就跟原来的逻辑对不上了。 [/quote]二楼也是可以的,就是数据不全,需要更改一下字段,谢谢两位大神
吉普赛的歌 2017-08-21
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 3楼我是你的主体 的回复:]谢谢2楼,CSDN没法回复别人的吗,好尴尬
点击引用就是回复了 我那个就是对楼主的语句优化了一下,结果对不对需要楼主验证…[/quote] 感觉你的写法有问题,你的写法如果有一对多, 或者有记录没有对应的就跟原来的逻辑对不上了。
二月十六 2017-08-21
  • 打赏
  • 举报
回复
引用 3楼我是你的主体 的回复:
谢谢2楼,CSDN没法回复别人的吗,好尴尬
点击引用就是回复了 我那个就是对楼主的语句优化了一下,结果对不对需要楼主验证…
吉普赛的歌 2017-08-21
  • 打赏
  • 举报
回复
引用 3 楼 GaraMaps 的回复:
谢谢2楼,CSDN没法回复别人的吗,好尴尬
点右下角的引用。 其实基本上是尽量减少表的多次访问。 临时表缓存一次数据, 相当于降低了复杂度。
GaraMaps 2017-08-21
  • 打赏
  • 举报
回复
请问2和3楼,用了你们的方法,查询速度变得很快,到底是什么原因呢
GaraMaps 2017-08-21
  • 打赏
  • 举报
回复
谢谢2楼,CSDN没法回复别人的吗,好尴尬
吉普赛的歌 2017-08-21
  • 打赏
  • 举报
回复
--缓存数据到临时表
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL 
	DROP TABLE #tmp
SELECT rr_fee, cz_times, c_code
INTO #tmp
FROM Sys_ReplenishRecord 
WHERE 1=1 
	AND rr_time >= '2017-7-1 00:00:00'
    AND rr_time <= '2017-7-31 23:59:59'
    AND rr_state <> '-2'
CREATE CLUSTERED INDEX ix_tmp_code ON #tmp( c_code )
--查询
SELECT c_name,
       c_bank,
       c_account,
       c_tag,
       (
           SELECT SUM(rr_fee)
           FROM   #tmp t
           WHERE  t.c_code IN (SELECT c_code
                                FROM   sys_ct
                                WHERE  sys_ct.opt_id = com.opt_id)
       ) fee,
       (
           SELECT SUM(cz_times)
           FROM   #tmp t
           WHERE  t.c_code IN (SELECT c_code
                                FROM   sys_ct
                                WHERE  sys_ct.opt_id = com.opt_id)
       ) times,
       com.opt_id
FROM   sys_company     com
WHERE  c_companytype = 1
--清除临时表
DROP TABLE #tmp
看下是否能快一点?
二月十六 2017-08-21
  • 打赏
  • 举报
回复
试试这个:
SELECT  c_name ,
c_bank ,
c_account ,
c_tag ,
SUM(rr_fee) fee ,
SUM(cz_times) times ,
com.opt_id
FROM sys_company com
JOIN sys_ct ON sys_ct.opt_id = com.opt_id
JOIN Sys_ReplenishRecord ON Sys_ReplenishRecord.c_code = sys_ct.c_code
WHERE c_companytype = 1
AND rr_time >= '2017-7-1 00:00:00'
AND rr_time <= '2017-7-31 23:59:59'
AND rr_state <> '-2'
GROUP BY c_name ,
c_bank ,
c_account ,
c_tag ,
com.opt_id


另外楼主可以看看执行计划,两次查询一样吗

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧