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万数据左右。
对数据查询量比较多的地方都有加索引。比如查询时间段,以及二个表相关联的外键。
可以把查询计划贴一下吗?
每个表的数据量是多少?查询结果一般数据量是多少?
你给的条件太少,从你现在给出的条件太难优化了.
谢谢啊,我把执行计划拿出来看下,发现在entid上用了太多的时间,然后我把聚焦索引建到了entid这列上,直接秒杀,谢谢你的提醒。
顶
这是最标准的三表连查了 最简单的写法了也是 还有什么优化的地方? 那成存储过程吧 估计差不多效果
给xylg_SCJGJ_TdBase 加索引试试
xylg_SCJGJ_TdBase的entid有加索引,但它的数据有可能为空,我把为空的加一测试数据,速度还是上不去。
@-----: 你查询出来的数据有几条?
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的时候,可以看下 执行计划 ,看看那个地方最耗时间
EntId,uDate加索引
把你认为导致效率低下的字段加索引
把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。
另外必须一次性查询这么多数据吗?不可以分批处理吗?
欢迎讨论!
我是根据时间段取数据做统计。
@-----: 你最好把表结构,涉及到的表的数据量的大小说一下,这些都是SQL查询要考虑的问题。
把 查询计划贴一下上来啊
xylg_SCJGJ_TdBase这个表的所有数据都要join吗?可否先挑选生成临时表再连接?http://wenku.baidu.com/view/ee4cf3b665ce050876321333.html,这里有个优化文档, 第29页应该有你要的答案
不知道你看上述连接了没, 你的xylg_SCJGJ_TdBase join的时候用时太多, 你应该在这个表的join的字段上加索引, 即 t.IndClassCode、c.Code 这两个字段加索引。确认在join的字段上加索引。
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
哈哈, 老问题, 时间列是么?
因为是时间的between, 所以每次都要全表扫一次。
你做几个冗余列好了, 比如年,
这样每次查询之前首先用年那一列过滤一下,然后再时间上的between。
据说会快很多, 因为不用全表扫了。
不过我没实际试过,因为我手头一直没有大数据量的数据库来试验。
你可以试试, 然后看结果。
如果单独查询select aicEntCode,RecordID from xylg_YJJ_GSPCog where uDate between '2008-11-05' and '2012-11-14',不到一秒,问题是在和xylg_SCJGJ_TdBase关联时用了太多时间。
@-----: 不知道你看上述连接了没, 你的xylg_SCJGJ_TdBase join的时候用时太多, 你应该在这个表的join的字段上加索引, 即 t.IndClassCode、c.Code 这两个字段加索引。确认在join的字段上加索引。
@ssun: 加了,查询量较大的和外键都有加索引
@-----: 索引不是越多越好
加上where条件,减少查询数据,应该有点效果
但是建议的做法是从业务上来根除这种数据库设计