首页 新闻 会员 周边

sql 语句优化

0
悬赏园豆:50 [已解决问题] 解决于 2012-11-17 11:38

select t.IndClassCode,g.RecordId,c.IndName from tcIndClass c
inner join xylg_SCJGJ_TdBase t  on t.IndClassCode=c.Code
inner join (select aicEntCode,RecordID from xylg_YJJ_GSPCog where uDate between '2008-11-05' and '2012-11-14') g on t.EntId=g.aicEntCode

此语句执行一次要3分钟左右。麻烦哪位大神帮我优化下,谢谢。。。目的:提出数据,取出码表中数据替换码值。(tcIndClass)码表,和码表关联前必须和xylg_SCJGJ_TdBase关联,xylg_SCJGJ_TdBase大约200万数据左右。

问题补充:

对数据查询量比较多的地方都有加索引。比如查询时间段,以及二个表相关联的外键。

-----的主页 ----- | 初学一级 | 园豆:99
提问于:2012-11-16 11:08
< >
分享
最佳答案
0

可以把查询计划贴一下吗?

收获园豆:13
飞来飞去 | 老鸟四级 |园豆:2057 | 2012-11-16 11:19

每个表的数据量是多少?查询结果一般数据量是多少?

你给的条件太少,从你现在给出的条件太难优化了.

飞来飞去 | 园豆:2057 (老鸟四级) | 2012-11-16 13:36

谢谢啊,我把执行计划拿出来看下,发现在entid上用了太多的时间,然后我把聚焦索引建到了entid这列上,直接秒杀,谢谢你的提醒。

----- | 园豆:99 (初学一级) | 2012-11-17 11:41
其他回答(11)
0

收获园豆:2
ms_water | 园豆:510 (小虾三级) | 2012-11-16 11:14
0

这是最标准的三表连查了  最简单的写法了也是 还有什么优化的地方? 那成存储过程吧 估计差不多效果

收获园豆:2
oppoic | 园豆:770 (小虾三级) | 2012-11-16 11:16
0

给xylg_SCJGJ_TdBase 加索引试试

收获园豆:2
死白的man | 园豆:2135 (老鸟四级) | 2012-11-16 11:20

xylg_SCJGJ_TdBase的entid有加索引,但它的数据有可能为空,我把为空的加一测试数据,速度还是上不去。

支持(0) 反对(0) ----- | 园豆:99 (初学一级) | 2012-11-16 11:21

@-----: 你查询出来的数据有几条?

支持(0) 反对(0) 死白的man | 园豆:2135 (老鸟四级) | 2012-11-16 12:01
0

select t.IndClassCode,g.RecordId,c.IndName from tcIndClass c 
inner join xylg_SCJGJ_TdBase t  on t.IndClassCode=c.Code
inner join xylg_YJJ_GSPCog  g on t.EntId=g.aicEntCode and g.uDate between '2008-11-05' and '2012-11-14'

试试,那个g.uDate加了索引了吗,可以执行的你的sql的时候,可以看下 执行计划 ,看看那个地方最耗时间

收获园豆:3
chenping2008 | 园豆:9836 (大侠五级) | 2012-11-16 11:23
0

EntId,uDate加索引

把你认为导致效率低下的字段加索引

收获园豆:2
田林九村 | 园豆:2367 (老鸟四级) | 2012-11-16 11:50
0

把t.IndClassCode 和 C.Code 换个位置:

select t.IndClassCode,g.RecordId,c.IndName from tcIndClass c
inner join xylg_SCJGJ_TdBase t  on c.Code=t.IndClassCode inner join (select aicEntCode,RecordID from xylg_YJJ_GSPCog where uDate between '2008-11-05' and '2012-11-14') g on t.EntId=g.aicEntCode。

另外必须一次性查询这么多数据吗?不可以分批处理吗?

欢迎讨论!

收获园豆:5
jone_e | 园豆:1410 (小虾三级) | 2012-11-16 13:03

我是根据时间段取数据做统计。

支持(0) 反对(0) ----- | 园豆:99 (初学一级) | 2012-11-16 13:07

@-----: 你最好把表结构,涉及到的表的数据量的大小说一下,这些都是SQL查询要考虑的问题。

支持(0) 反对(0) jone_e | 园豆:1410 (小虾三级) | 2012-11-16 13:24
0

 把 查询计划贴一下上来啊

收获园豆:10
世界万物 | 园豆:276 (菜鸟二级) | 2012-11-16 13:23
0

xylg_SCJGJ_TdBase这个表的所有数据都要join吗?可否先挑选生成临时表再连接?http://wenku.baidu.com/view/ee4cf3b665ce050876321333.html,这里有个优化文档, 第29页应该有你要的答案

 

不知道你看上述连接了没, 你的xylg_SCJGJ_TdBase join的时候用时太多, 你应该在这个表的join的字段上加索引, 即 t.IndClassCode、c.Code 这两个字段加索引。确认在join的字段上加索引。

收获园豆:5
ssun | 园豆:225 (菜鸟二级) | 2012-11-16 13:52
0

select t.IndClassCode,g.RecordId,c.IndName from
(select aicEntCode,RecordID from xylg_YJJ_GSPCog where uDate between '2008-11-05' and '2012-11-14') g
inner join xylg_SCJGJ_TdBase t on t.EntId=g.aicEntCode
inner join tcIndClass c on t.IndClassCode=c.Code

收获园豆:2
jingjunfeng | 园豆:873 (小虾三级) | 2012-11-16 14:11
0

哈哈, 老问题, 时间列是么?

因为是时间的between, 所以每次都要全表扫一次。

你做几个冗余列好了, 比如年, 

这样每次查询之前首先用年那一列过滤一下,然后再时间上的between。

据说会快很多, 因为不用全表扫了。

 

不过我没实际试过,因为我手头一直没有大数据量的数据库来试验。

你可以试试, 然后看结果。

收获园豆:2
undefined | 园豆:898 (小虾三级) | 2012-11-16 16:02

如果单独查询select aicEntCode,RecordID from xylg_YJJ_GSPCog where uDate between '2008-11-05' and '2012-11-14',不到一秒,问题是在和xylg_SCJGJ_TdBase关联时用了太多时间。

支持(0) 反对(0) ----- | 园豆:99 (初学一级) | 2012-11-16 16:04

@-----: 不知道你看上述连接了没, 你的xylg_SCJGJ_TdBase join的时候用时太多, 你应该在这个表的join的字段上加索引, 即 t.IndClassCode、c.Code 这两个字段加索引。确认在join的字段上加索引。

支持(0) 反对(0) ssun | 园豆:225 (菜鸟二级) | 2012-11-16 17:29

@ssun: 加了,查询量较大的和外键都有加索引

支持(0) 反对(0) ----- | 园豆:99 (初学一级) | 2012-11-16 17:30

@-----: 索引不是越多越好

支持(0) 反对(0) ssun | 园豆:225 (菜鸟二级) | 2012-11-16 18:08
0

加上where条件,减少查询数据,应该有点效果

但是建议的做法是从业务上来根除这种数据库设计

收获园豆:2
az235 | 园豆:8483 (大侠五级) | 2012-11-16 20:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册