sql - 除了索引之外,如何优化 sql 代码?
问题描述
我写了一个如下的sql代码。后来根据where条件添加了一些索引,但是性能还不够。sql有没有一般的优化规则或者下面的sql有什么建议?如何改进我的 sql 代码?
SELECT COUNT(*) OVER() AS tot_count,
PG.DESCR as partner,
THAF.APPDATA
FROM transhist th,
trans_app thaf,
partnergroup pg,
partnergrpkey pgk
WHERE TH.CreateDt >= to_date('?startdate', 'yyyymmddhh24mi')
AND TH.CreateDt <= to_date('?enddate', 'yyyymmddhh24mi')+1/1440
AND TH.TRANSSET = '820'
AND THAF.TRANSHISTID = th.id
AND THAF.COLUMNID = 74
AND THAF.APPDATA LIKE '%|?acctNo|%'
AND TH.TRNSLTPARTNERKEY = PGK.DOCHISTPARTNERKEY
AND PG.ID = PGK.PARTNERGROUPID
AND pg.ID IN (?tpValues)
ORDER BY TH.ID;
索引如下:
CREATE INDEX TRANS_APP_ALL ON TRANS_APP(TRANSHISTID, COLUMNID, APPDATA);
CREATE INDEX TRANS_CREATEDT ON TRANSHIST(TRANSSET, CREATEDT, TRNSLTPARTNERKEY);
解决方案
首先,使用正确、明确、标准 join
的语法编写查询:
select count(*) over () AS tot_count,
PG.DESCR as partner,
THAF.APPDATA
from transhist th join
partnergrpkey pgk
on TH.TRNSLTPARTNERKEY = PGK.DOCHISTPARTNERKEY join
partnergroup pg
on PG.ID = PGK.PARTNERGROUPID join
trans_app thaf
on THAF.TRANSHISTID = th.id
where TH.CreateDt >= to_date('?startdate', 'yyyymmddhh24mi') and
TH.CreateDt <= to_date('?enddate', 'yyyymmddhh24mi')+1/1440 and
TH.TRANSSET = '820' and
THAF.COLUMNID = 74 and
THAF.APPDATA LIKE '%|?acctNo|%' and
pg.ID IN (?tpValues)
order by TH.ID;
对于此查询,我希望以下索引会有所帮助:
transhist(TRANSSET, CreateDt, TRNSLTPARTNERKEY, id)
partnergrpkey(DOCHISTPARTNERKEY, PARTNERGROUPID)
partnergroup(id)
trans_app(TRANSHISTID, COLUMNID, APPDATA)
这些类似于您拥有的索引。您可能需要检查执行计划以查看索引是否实际被使用。
推荐阅读
- c++ - 元组的可变参数模板被反转
- ssl - 使用 .crt 文件和 ca 签名证书生成 .jks 文件
- java - 如何将图片从imageview发送到gmail?
- laravel - 在 AWS Serverless 平台上部署 Laravel (laravel-mix) 应用程序
- python - 获取用户输入时,我想检查两个值,但是,我使用的代码不断循环
- php - foreach 循环如何在另一个 foreach 循环中工作?
- python - 合并第二个数据帧中只有一个额外列的数据帧
- android-gradle-plugin - 为什么android gradle版本和gradle版本不一样
- c# - 将两个表单中的数据保存到 Winforms 应用程序中的同一个表中
- python - 如何在 pygame 中使用图像进行碰撞检测