我如何调整这个选择语句以防止它多次从同一个表中选择?

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 子句。

【讨论】:

以上是关于我如何调整这个选择语句以防止它多次从同一个表中选择?的主要内容,如果未能解决你的问题,请参考以下文章

SELECT 语句从不同的表中获取所有列

如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?

如何防止 UIDatePicker 被多次初始化

为啥 select 语句没有从数据库表中选择所有行?它每次都忽略第一个条目

从具有三个外键的表中选择一个表[关闭]

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?