优化SQL语句_条件过滤

条件过滤

在联接处理中,前缀行是从联接中的一个表传递到下一个表的那些行。通常,优化程序会尝试在连接顺序的早期放置前缀计数较低的表,以防止行组合的数量迅速增加。在某种程度上,优化器可以使用有关从一个表中选择并传递到下一个表的行的条件的信息,它可以更准确地计算行估计并选择最佳执行计划。

如果不使用条件过滤,则表的前缀行数将WHERE根据优化器选择的访问方法,根据子句选择的估计行数进行计算 。条件过滤使优化器可以WHERE在访问方法未考虑的子句中使用其他相关条件 ,从而改善其前缀行数估计。例如,即使可能存在基于索引的访问方法,该方法可用于从联接中的当前表中选择行,但对于表中的表,也可能存在其他条件。WHERE 子句可以过滤(进一步限制)传递给下一张表的合格行的估计值。

仅在以下情况下,条件才有助于过滤估计:

  • 它引用当前表。
  • 它取决于连接序列中一个或多个常量值。
  • 访问方法尚未考虑它。

EXPLAIN输出中,该 rows列指示所选访问方法的行估计,该filtered 列反映条件过滤的效果。 filtered值以百分比表示。最大值为100,这表示未过滤行。值从100减小表示过滤量增加。

前缀行数(估计从当前表通过联接传递到下一个表的行数)是rowsfiltered值的乘积。即,前缀行数是估计的行数,该估计的行数由于估计的滤波效果而减少。例如,如果rows为1000且filtered为20%,则条件过滤会将估算的行数1000减少为前缀行数1000×20%= 1000×.2 = 200。

考虑以下查询:

SELECT *
  FROM employee JOIN department ON employee.dept_no 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]: 目录中提到了一些SQL优化的技巧,但没有具体提到HAVING优化。HAVING子句用于在GROUP BY语句中对分组后的结果进行过滤。在优化HAVING子句时,可以考虑以下几点: 1. 尽量避免在HAVING子句中使用复杂的表达式或函数,因为这会增加查询的计算量。 2. 如果可能的话,将HAVING子句中的条件转移到WHERE子句中进行过滤,这样可以减少分组的数据量。 3. 确保在HAVING子句中使用的列上有适当的索引,以提高查询的性能。 4. 如果HAVING子句中使用的列是聚合函数的结果,可以考虑将这些聚合函数的结果存储在临时表中,以减少计算量。 引用\[3\]: 另外,使用EXPLAIN分析SQL执行计划也是优化SQL语句的一种常用方法。EXPLAIN可以帮助我们了解查询的执行顺序、使用的索引以及可能存在的性能问题。通过分析EXPLAIN的结果,我们可以对SQL语句进行调整和优化,以提高查询的效率。 综上所述,优化HAVING子句可以通过简化表达式、转移条件到WHERE子句、使用适当的索引以及使用EXPLAIN分析SQL执行计划等方法来实现。 #### 引用[.reference_title] - *1* *2* *3* [SQL语句优化方法](https://blog.csdn.net/Boy_Martin/article/details/126866798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值