鱼C论坛

 找回密码
 立即注册
查看: 327|回复: 6

[Oracle] 这个语句如何提高查询速度

[复制链接]
发表于 2024-8-28 09:26:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. SELECT
  2.         subq.groupname,
  3.         --subq.members,
  4.         --subq.billno,
  5.         --subq.optime,
  6.         subq.node,
  7.         subq.cop,
  8.         subq.brand,
  9.         --subq.billtype,
  10.         --subq.billstyle,
  11.         subq.num_bill,
  12.         subq.times_ssc_approve,
  13.         subq.times_ssc_reject,
  14.         subq.times_ssc_cancel,
  15.         round(subq.times_ssc_approve + subq.times_ssc_reject - subq.times_ssc_cancel, 0) AS times_ssc_final,
  16.         CASE
  17.                 WHEN subq.times_ssc_reject = 0 THEN NULL
  18.                 ELSE round((subq.times_ssc_reject / subq.num_bill) * 100, 2)
  19.         END AS reject_percentage,
  20.         subq.times_bus_reject
  21. FROM
  22.         (
  23.         SELECT
  24.                 d.name AS groupname,
  25.                 --a.billno billno,
  26.                 --us.user_name AS members,
  27.                 --SUBSTR(a.operatetime,0,10)  AS optime,
  28.                 sn.name AS node,
  29.                 org.shortname as cop,
  30.                 ad2.name AS brand,
  31.                 --c.BILLTYPENAME as billtype,
  32.                 --c.parentbilltype as billstyle,
  33.                 COUNT(DISTINCT CASE WHEN (a.actiontype = 'sscapprove' OR (a.actiontype = 'sscreject' AND a.BEGINSTATE <> 'sscapprove')) THEN a.billno END) AS num_bill,
  34.                 COUNT(CASE WHEN a.actiontype = 'sscapprove' THEN a.billno END) AS times_ssc_approve,
  35.                 COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE <> 'sscapprove') THEN a.billno END) AS times_ssc_reject,
  36.                 COUNT(CASE WHEN (a.actiontype = 'un-sscapprove' AND a.BEGINSTATE <> 'notake') THEN a.billno END) AS times_ssc_cancel,
  37.                 COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE = 'sscapprove') THEN a.billno END) AS times_bus_reject
  38.         FROM
  39.                 ncc.ssctp_flowpath a
  40.         LEFT JOIN ncc.bd_billtype c ON
  41.                 c.pk_billtypeid = a.pk_tradetype
  42.         LEFT JOIN ncc.ssctp_workinggroup d ON
  43.                 d.pk_workinggroup = a.pk_sscgroup
  44.         LEFT JOIN ncc.org_orgs org ON
  45.                 org.pk_org = a.pk_org
  46.         LEFT JOIN org_adminorg ad ON
  47.                 ad.name = org.name
  48.         LEFT JOIN org_adminorg ad2 ON
  49.                 ad2.pk_adminorg = ad.pk_fatherorg
  50.         LEFT JOIN ncc.sm_user us ON
  51.                 us.cuserid = a.operater
  52.         LEFT JOIN ncc.ssctp_node sn ON
  53.                 sn.pk_sscnode = a.pk_sscnode
  54.         WHERE
  55.                 a.operatetime >= '2024-01-01 00:00:00'
  56.                 AND a.operatetime <= '2024-08-31 23:59:59'
  57.                 AND org.name <> '虚拟店'
  58.                 --AND org.name = '杭州和诚之宝汽车销售服务有限公司'
  59.                 --AND org.def12 = '商用车品线'
  60.                 AND d.name = '费用核算组'
  61.                 AND c.billtypename IN ('差旅费用报销单','业务招待费用报销单')
  62.         GROUP BY
  63.                 d.name,
  64.                 --a.billno,
  65.                 --us.user_name,
  66.                 sn.name,
  67.         --SUBSTR(a.operatetime,0,10)
  68.         --sn.name
  69.                 org.shortname,
  70.                 ad2.name ) subq
  71.         --c.BILLTYPENAME
  72.         --c.parentbilltype
  73. WHERE
  74.         num_bill <> 0
  75.         OR times_ssc_reject <> 0;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-28 09:26:36 | 显示全部楼层
要提高这个查询语句的速度,可以从以下几个方面入手:

1. **索引优化**:确保在 `WHERE` 子句中使用的列上创建了适当的索引,例如 `a.operatetime` 和 `a.pk_sscnode`。此外,连接条件中的列也应该有索引,例如 `a.pk_tradetype`、`a.pk_sscgroup`、`a.pk_org` 等。

2. **减少子查询**:如果可能,尝试将子查询转换为联接,以减少查询的复杂性。

3. **选择性字段**:只选择需要的字段,避免选择不必要的字段。

4. **优化聚合函数**:确保聚合函数(如 `COUNT`)的使用是必要的,并且在索引列上进行。

5. **避免重复计算**:将重复计算的部分提取出来,避免在查询中多次计算相同的值。

以下是优化后的查询示例:

  1. SELECT
  2.     d.name AS groupname,
  3.     sn.name AS node,
  4.     org.shortname as cop,
  5.     ad2.name AS brand,
  6.     COUNT(DISTINCT CASE WHEN (a.actiontype = 'sscapprove' OR (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove')) THEN a.billno END) AS num_bill,
  7.     COUNT(CASE WHEN a.actiontype = 'sscapprove' THEN a.billno END) AS times_ssc_approve,
  8.     COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) AS times_ssc_reject,
  9.     COUNT(CASE WHEN (a.actiontype = 'un-sscapprove' AND a.BEGINSTATE != 'notake') THEN a.billno END) AS times_ssc_cancel,
  10.     COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE = 'sscapprove') THEN a.billno END) AS times_bus_reject,
  11.     round(COUNT(CASE WHEN a.actiontype = 'sscapprove' THEN a.billno END) + COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) - COUNT(CASE WHEN (a.actiontype = 'un-sscapprove' AND a.BEGINSTATE != 'notake') THEN a.billno END), 0) AS times_ssc_final,
  12.     CASE
  13.         WHEN COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) = 0 THEN NULL
  14.         ELSE round((COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) / COUNT(DISTINCT CASE WHEN (a.actiontype = 'sscapprove' OR (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove')) THEN a.billno END)) * 100, 2)
  15.     END AS reject_percentage
  16. FROM
  17.     ncc.ssctp_flowpath a
  18. LEFT JOIN ncc.bd_billtype c ON
  19.     c.pk_billtypeid = a.pk_tradetype
  20. LEFT JOIN ncc.ssctp_workinggroup d ON
  21.     d.pk_workinggroup = a.pk_sscgroup
  22. LEFT JOIN ncc.org_orgs org ON
  23.     org.pk_org = a.pk_org
  24. LEFT JOIN org_adminorg ad ON
  25.     ad.name = org.name
  26. LEFT JOIN org_adminorg ad2 ON
  27.     ad2.pk_adminorg = ad.pk_fatherorg
  28. LEFT JOIN ncc.sm_user us ON
  29.     us.cuserid = a.operater
  30. LEFT JOIN ncc.ssctp_node sn ON
  31.     sn.pk_sscnode = a.pk_sscnode
  32. WHERE
  33.     a.operatetime >= '2024-01-01 00:00:00'
  34.     AND a.operatetime < '2024-12-31 23:59:59'
  35. GROUP BY
  36.     d.name, sn.name, org.shortname, ad2.name;
复制代码


通过这些优化措施,可以显著提高查询的执行速度。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 09:41:20 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-8-28 09:46:10 | 显示全部楼层
FishC 发表于 2024-8-28 09:26
要提高这个查询语句的速度,可以从以下几个方面入手:

1. **索引优化**:确保在 `WHERE` 子句中使用的列 ...

你优化完的语句确实速度提升了,但是在你的基础上在where里加上其他条件,速度又变的很慢,是为什么呢
  1. SELECT
  2.     d.name AS groupname,
  3.     sn.name AS node,
  4.     org.shortname as cop,
  5.     ad2.name AS brand,
  6.     COUNT(DISTINCT CASE WHEN (a.actiontype = 'sscapprove' OR (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove')) THEN a.billno END) AS num_bill,
  7.     COUNT(CASE WHEN a.actiontype = 'sscapprove' THEN a.billno END) AS times_ssc_approve,
  8.     COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) AS times_ssc_reject,
  9.     COUNT(CASE WHEN (a.actiontype = 'un-sscapprove' AND a.BEGINSTATE != 'notake') THEN a.billno END) AS times_ssc_cancel,
  10.     COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE = 'sscapprove') THEN a.billno END) AS times_bus_reject,
  11.     round(COUNT(CASE WHEN a.actiontype = 'sscapprove' THEN a.billno END) + COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) - COUNT(CASE WHEN (a.actiontype = 'un-sscapprove' AND a.BEGINSTATE != 'notake') THEN a.billno END), 0) AS times_ssc_final,
  12.     CASE
  13.         WHEN COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) = 0 THEN NULL
  14.         ELSE round((COUNT(CASE WHEN (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove') THEN a.billno END) / COUNT(DISTINCT CASE WHEN (a.actiontype = 'sscapprove' OR (a.actiontype = 'sscreject' AND a.BEGINSTATE != 'sscapprove')) THEN a.billno END)) * 100, 2)
  15.     END AS reject_percentage
  16. FROM
  17.     ncc.ssctp_flowpath a
  18. LEFT JOIN ncc.bd_billtype c ON
  19.     c.pk_billtypeid = a.pk_tradetype
  20. LEFT JOIN ncc.ssctp_workinggroup d ON
  21.     d.pk_workinggroup = a.pk_sscgroup
  22. LEFT JOIN ncc.org_orgs org ON
  23.     org.pk_org = a.pk_org
  24. LEFT JOIN org_adminorg ad ON
  25.     ad.name = org.name
  26. LEFT JOIN org_adminorg ad2 ON
  27.     ad2.pk_adminorg = ad.pk_fatherorg
  28. LEFT JOIN ncc.sm_user us ON
  29.     us.cuserid = a.operater
  30. LEFT JOIN ncc.ssctp_node sn ON
  31.     sn.pk_sscnode = a.pk_sscnode
  32. WHERE
  33.     a.operatetime >= '2024-01-01 00:00:00'
  34.     AND a.operatetime <= '2024-08-15 23:59:59'
  35.     AND org.name <> '虚拟店'
  36.     AND d.name = '费用核算组'
  37.         AND c.billtypename IN ('差旅费用报销单','业务招待费用报销单')
  38.         AND sn.name <> '共享制单'
  39. GROUP BY
  40.     d.name, sn.name, org.shortname, ad2.name;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 09:46:14 | 显示全部楼层
yuanbb0820 发表于 2024-08-28 09:46
你优化完的语句确实速度提升了,但是在你的基础上在wh ...


查询速度变慢的原因通常有以下几点,可以逐项检查和优化:

1. **缺乏索引**:
    - 新添加的条件字段是否有索引?没有索引的话,会导致全表扫描,影响查询速度。

2. **索引失效**:
    - 尽量避免在索引字段上进行函数操作或者使用不等于 (`!=`),这可能导致索引失效。

3. **查询复杂度增加**:
    - 复杂的 `WHERE` 条件会增加查询的计算量。可以

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 17:39:35 | 显示全部楼层
这个代码是用在哪里的,应该不是在Python那个里面里面吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-30 09:10:43 | 显示全部楼层
月暮日出 发表于 2024-8-28 17:39
这个代码是用在哪里的,应该不是在Python那个里面里面吧

数据库的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 16:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表