在日常的数据库开发和维护中,关联子查询常被用于实现基于主查询条件的动态过滤逻辑。然而,尽管其语法直观易懂,若未妥善优化,关联子查询极易导致性能问题,尤其是在处理大数据量时。本文将深入探讨如何通过通用表表达式(CTE)对这类查询进行重构,将嵌套逻辑提取为独立可复用的中间结果,以降低查询的执行次数,进而实现显著的性能提升。
CTE 允许您创建临时结果集,可在查询中多次引用。将关联子查询的结果存储在 CTE 中,以避免多次计算,并使查询更具可读性。
适用于需要多次引用相同子查询结果的情况,以提高可读性和代码复用性。CTE 并不总是导致性能提升,但可以改善查询的可维护性。
原始关联子查询 SQL 语句及性能情况请参考关联子查询 SQL 示例。
WITH CustomerSales AS (
SELECT
ss.ss_customer_sk,
SUM(ss.ss_ext_sales_price) as total_sales
FROM store_sales ss
GROUP BY ss.ss_customer_sk
HAVING total_sales > 10000
)
SELECT c.c_customer_id
FROM customer c
JOIN CustomerSales cs ON c.c_customer_sk = cs.ss_customer_sk
ORDER BY c.c_customer_id
LIMIT 10;
使用通用表表达式(CTE)的 with 子句将关联子查询保存为一个表达式,在与著查询进行连接,减少了子查询的执行次数。
使用 CTE 优化之后的执行时间为 8.1s,对于原始关联子查询语句优化了约 2.4 倍。
在日常的数据库开发和维护中,关联子查询常被用于实现基于主查询条件的动态过滤逻辑。然而,尽管其语法直观易懂,若未妥善优化,关联子查询极易导致性能问题,尤其是在处理大数据量时。本文将深入探讨如何通过通用表表达式(CTE)对这类查询进行重构,将嵌套逻辑提取为独立可复用的中间结果,以降低查询的执行次数,进而实现显著的性能提升。
CTE 允许您创建临时结果集,可在查询中多次引用。将关联子查询的结果存储在 CTE 中,以避免多次计算,并使查询更具可读性。
适用于需要多次引用相同子查询结果的情况,以提高可读性和代码复用性。CTE 并不总是导致性能提升,但可以改善查询的可维护性。
原始关联子查询 SQL 语句及性能情况请参考关联子查询 SQL 示例。
WITH CustomerSales AS (
SELECT
ss.ss_customer_sk,
SUM(ss.ss_ext_sales_price) as total_sales
FROM store_sales ss
GROUP BY ss.ss_customer_sk
HAVING total_sales > 10000
)
SELECT c.c_customer_id
FROM customer c
JOIN CustomerSales cs ON c.c_customer_sk = cs.ss_customer_sk
ORDER BY c.c_customer_id
LIMIT 10;
使用通用表表达式(CTE)的 with 子句将关联子查询保存为一个表达式,在与著查询进行连接,减少了子查询的执行次数。
使用 CTE 优化之后的执行时间为 8.1s,对于原始关联子查询语句优化了约 2.4 倍。