DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 123glimmer
今日帖子: 19
在线用户: 17
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 xbbtzhao (itv) ★☆☆☆☆ -
盒子活跃会员
2020/10/23 21:57:16
标题:
请帮忙优化一下SQL查询语句,表数据量大 浏览:720
加入我的收藏
楼主: GrList 基础表 Grclass、Grcode
Glog2 ,Gdcode、Gdclass、Gdate  记录表,数据量大,可能上百万。
以GrList 为基础查询关联Glog2 最近一次记录
我要写法如下, 还有什么提高效率的不???
select a.* from Glog2 a inner join (select Gdclass,Gdcode,MAX(Gdate) 'Gdate'  from Glog2  GROUP BY Gdclass,Gdcode) b 
on a.Gdclass=b.Gdclass and a.Gdcode=b.Gdcode and a.Gdate=b.Gdate left join GrList gl ON a.Gdcode=gl.Grcode and a.Gdclass=gl.Grclass where gl.Grgroup='G02'
----------------------------------------------
free
作者:
男 a5824 (Return) ▲▲▲▲▲ -
注册会员
2020/10/24 15:22:31
1楼: 百万没什么压力的,自己多看看执行计划
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2020/10/24 16:26:02
2楼: select a.*,l.Gdate
 from GrList a cross apply (select max(Gdate) as Gdate from GLog2 where Gdclass=a.Gdclass and Gdcode=a.Gdcode) l;

在Glog2上建索引 Gdclass+Gdcode+Gdate 索引
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 mike1234567890 (Mike) ★☆☆☆☆ -
普通会员
2020/10/24 16:30:06
1楼: 你看查询计划呢,索引加了没有,是否可以考滤使用临时表
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2020/10/24 17:33:46
3楼: 对glog2分组开窗取max(Gdate)= Gdate的那一行。 不需要做第一次的inner join
----------------------------------------------
-
作者:
男 xbbtzhao (itv) ★☆☆☆☆ -
盒子活跃会员
2020/10/26 18:34:36
4楼: 多谢,
----------------------------------------------
free
作者:
男 xbbtzhao (itv) ★☆☆☆☆ -
盒子活跃会员
2020/10/26 18:35:04
5楼: 我可能几秒种就执行一次
----------------------------------------------
free
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2020/10/27 18:01:54
6楼: 做个glo2的触发器,把最新的那条数据写到一个只用来保存最新数据的表里面。
感觉你的需求就是取最新数据,把最新数据另存一张表就好了。然后再分组。
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲△△△△ -
注册会员
2020/10/28 21:41:46
7楼: 首先,确保Glog2表和GrList表有对Gdclass,Gdcode做索引,如果没有的话先做索引:
  CREATE INDEX Index_Gdclass_Gdcode_Gdate ON Glog2  (Gdclass, Gdcode, Gdate);
  CREATE INDEX Index_Gdclass_Gdcode ON GrList (Gdclass, Gdcode);

然后执行下列语句组:
  然后执行下列语句组:
  SELECT Gdclass, Gdcode, MAX(Gdate) AS Gdate INTO #tmp FROM Glog2 GROUP BY Gdclass, Gdcode;
  CREATE CLUSTERED INDEX Index_Gdclass_Gdcode_Gdate ON #tmp (Gdclass, Gdcode, Gdate);
  SELECT a.* FROM GrList g
    JOIN #tmp   t ON t.Gdclass=g.Gdclass and t.Gdcode=g.Gdcode AND t.Gdate=g.Gdate
    JOIN Glog2  a ON a.Gdclass=g.Gdclass and a.Gdcode=g.Gdcode
    WHERE g.Grgroup='G02';
  DROP TABLE #tmp;

  对于百万行级别的表,上述查询消耗的时间应该低于0.1秒才合理。
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲△△△△ -
注册会员
2020/10/28 22:49:25
8楼: 首先,确保Glog2表和GrList表有对Gdclass,Gdcode做索引,如果没有的话先做索引:
  CREATE INDEX Index_Gdclass_Gdcode_Gdate ON Glog2  (Gdclass, Gdcode, Gdate);
  CREATE INDEX Index_Gdclass_Gdcode ON GrList (Gdclass, Gdcode);

然后执行下列语句组:
  然后执行下列语句组:
  SELECT Gdclass, Gdcode, MAX(Gdate) AS Gdate INTO #tmp FROM Glog2 GROUP BY Gdclass, Gdcode;
  CREATE CLUSTERED INDEX Index_Gdclass_Gdcode_Gdate ON #tmp (Gdclass, Gdcode, Gdate);
  SELECT a.* FROM GrList g
    JOIN #tmp   t ON t.Gdclass=g.Gdclass and t.Gdcode=g.Gdcode
    JOIN Glog2  a ON a.Gdclass=t.Gdclass and a.Gdcode=t.Gdcode AND a.Gdate=t.Gdate  --更正
    WHERE g.Grgroup='G02';
  DROP TABLE #tmp;

  对于百万行级别的表,上述查询消耗的时间应该低于0.1秒才合理。
----------------------------------------------
-
作者:
男 chonghai (DBlue) ★☆☆☆☆ -
盒子活跃会员
2020/10/28 23:09:24
7楼: 如果是SQL SERVER的话,里面有个跟踪调试功能,可以看看哪些语句花费了更长的时间。然后再分别优化。
----------------------------------------------
喜欢Delphi,关注Delphi,愿和广大爱好者交朋友。
作者:
男 inbreak (入侵) ★☆☆☆☆ -
盒子活跃会员
2020/10/28 23:18:25
9楼: 这个嵌套的SQL语句,想快,挺难的。

给你两个建议吧;

1、没有索引就创建相应的索引;
2、使用存储过程吧,把嵌套的语句独立出来,不然的话,单条SQL语句的话就需要嵌套什么的,效率挺低的。(在嵌套的效率上,SQL2000效率高于MSSQL2005+(这是我不解的地方))
-----
3、专门创建一个保存最后一次记录的表,在前台创建这个记录时就将该条数据顺便update到这个表中(或是使用触发器作这个动作)。

然后你的你的主表就 inner join 这个表就好了。
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
作者:
男 xbbtzhao (itv) ★☆☆☆☆ -
盒子活跃会员
2020/10/30 13:04:51
10楼: 感谢楼上的。
----------------------------------------------
free
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行15.625毫秒 RSS