繁体   English   中英

我的 CTE SQL 查询运行时间过长......我该如何优化?

[英]My CTE SQL Query is running for too long....How can I optimize?

我正在寻找优化查询性能的方法,但我不确定我的选择是什么。 我希望有人可以指导我。 这是我的 CTE 查询:

    WITH Sales AS 

     (
        SELECT
        DISTINCT s.id,
        o.item,
        o.sku
        FROM sales s
        LEFT JOIN orders o
        ON s.id = o.id
        WHERE
        o.item LIKE 'iphone%'
        AND SUBSTRING(o.item, 1, 4) = 'iphone'
        ORDER BY s.id ASC, o.item DESC
        )

        SELECT
        COUNT(DISTINCT Sales.id) AS this,
        m.date,
        COUNT(DISTINCT m.z)
        FROM Sales
        LEFT JOIN master m
        ON Sales.id = m.id
        WHERE
        LOWERCASE(m.id) LIKE '%ipad%'
        AND LOWERCASE(Sales.id) NOT LIKE '%pod%'
        GROUP BY m.date
        HAVING
        m.date > date_start AND m.date < date_end
        ORDER BY this ASC
        LIMIT 10

设置条件

m.date > date_start AND m.date < date_end

从 have 到 where 子句...

如果可能,请尝试删除 where 子句中列中的强制转换 LOWERCASE 并将表/列设置为不区分大小写的排序规则

SUBSTRING(o.item, 1, 4) = 'iphone'

总是会失败。 也许你的意思是6?

    WHERE  LOWERCASE(m.id) LIKE '%ipad%'
      AND  LOWERCASE(Sales.id) NOT LIKE '%pod%'

建议您了解FULLTEXT索引和使用

   WHERE MATCH(m.id) AGAINST("+ipad" IN BOOLEAN MODE)

id真的是这样的字符串吗? (约定是id是定义行的唯一编号。)

    HAVING  m.date > date_start
       AND  m.date < date_end

似乎应该在WHERE子句中。 在这一点上LEFT没有意义。

  ON Sales.id = m.id

为什么要在WHERE分别测试每个? 如果它们相同,您可以测试一个。

清理那些东西; 然后我们可以讨论索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM