我如何调整这个选择语句以防止它多次从同一个表中选择?
Posted
技术标签:
【中文标题】我如何调整这个选择语句以防止它多次从同一个表中选择?【英文标题】:How can i tune this select statement to prevent it from having select from same table many times? 【发布时间】:2019-08-14 09:08:40 【问题描述】:我需要对开发者提供的这条sql语句进行调优,如何加快速度并防止HAVING
部分多次从同一个用户表中选择?
SELECT *
FROM (
SELECT t.*, ROWNUM pageination__row__123__
FROM (
SELECT *
FROM (
SELECT SUM(rcm) sum_rcm, SUM(real_amount) sum_ra, MIN(min_share) min_share, MAX(max_share) max_share, SUM(DECODE(rcm_flag, 'Y', 0, rcm)) rcm_n, b.parentid
FROM bet_total b
WHERE draw_date BETWEEN :1 AND :2
GROUP BY parentid
HAVING (
parentid
IN (
SELECT id FROM users u2,
(
SELECT u3.path
FROM users u3
WHERE u3.type = 2 AND u3.lv = 1 AND u3.tesing = 0 AND u3.user_key = :3
) q
WHERE u2.path BETWEEN q.path AND q.path || chr(to_number('FFFFFFFF', 'xxxxxxxx')) AND u2.type = 2
) AND SUM(rcm) > :4
)
) b1, users u5
WHERE (b1.parentid = u5.id AND rcm_n > 0 )
ORDER BY u5.path
) t
) t
WHERE t.pageination__row__123__ <= :5;
SQL 执行计划
Bet_total 表索引
表用户索引
【问题讨论】:
欢迎来到 ***!有没有办法在不改变其基本功能的情况下在代码中放置换行符/缩进? @Onana 。 . .提供示例数据、期望的结果、逻辑解释以及正在使用的表的架构(类型和索引对于优化很重要)。您还应该学习使用正确、明确、标准JOIN
语法。
请将执行计划发布为格式化文本,而不是(难以阅读的)屏幕截图
【参考方案1】:
您可以尝试使用 WITH 子句。
【讨论】:
以上是关于我如何调整这个选择语句以防止它多次从同一个表中选择?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?