SQL优化系列:别让强制类型转换偷走性能

简介:

本次主题:强制类型转换性能的影响
SQL跟踪过程中发现一些表结构的DEFAULT值和SQL语句存在字段类型不一致的现象。
虽然业务逻辑没有出错,但却造成了索引失效或者增加了优化的复杂度。其中表结构DEFAULT值不正确影响更加重大,因为他影响了很多关联的SQL语句,

问题一:表结构DEFAULT值类型错误
尴尬:已有业务数据量很大,是转换表的DEFAULT值呢还是用转换类型的函数索引优化?
示例:同样是CHAR(1)类型,有的DEFAULT值是0,有的是'0'

create table STATUS_NOTE
(
  CONTAINER_ID                 NUMBER not null,
  ……
  IS_PRINT                             CHAR(1) default 0,
  CHECK_RESULT              CHAR(1) default '0',
  DELETED_FLAG                CHAR(1) default 0,
)

分析:此表在DELETED_FLAG上有索引列,但是ORACLE优化器中提示:The predicate TO_NUMBER("CS"."DELETED_FLAG")=0 
used at line ID 6 of the execution plan contains an implicit data type conversion on indexed column "DELETED_FLAG"。
因为在索引列上存在强制类型转换,导致索引失效,某SQL语句在改表上的执行计划的COST达到2023,
而如果该字段类型正确,那么COST值至少将下降到613,如此轻而易举的能够提升几倍性能,何乐而不为。

问题二:SQL语句中字段类型错误
示例:DELETED_FLAG是CHAR类型,但SQL语句确和整型比较
select t.id,t.MSG_TYPE,t.CONTENT,t.MODI_DATE,t.DELETED_FLAG
    from SEND_CONTROL t
    Where (t.state='0' )--Or t.state='2') 
    And FUNC_AVAILABLE_DATE(t.CREATE_DATE,t.TRY_TIMES)<=Sysdate  And t.DELETED_FLAG=0
分析:此表未创建索引,ORACLE优化器提醒Consider running the Access Advisor to improve the physical schema design or creating the recommended index.
SEND_CONTROL("STATE",TO_NUMBER("DELETED_FLAG"))
提示创建("STATE",TO_NUMBER("DELETED_FLAG")索引,显然,由于SQL语句中DELETED_FLAG=0导致了强制类型转换。
如果真如优化器所述创建函数索引,那么其他正确的SQL语句反而又成了强制类型转换,在此情况下需要扭转错误的SQL语句。
优化前语句COST:
SELECT STATEMENT, GOAL = ALL_ROWS    Cost=855     Cardinality=1   Bytes=134
 TABLE ACCESS FULL   Object owner=SUZHOU   Object name=SZ_SEND_CONTROL                   Cost=855         Cardinality=1   Bytes=134
优化后语句COST:
SELECT STATEMENT, GOAL = ALL_ROWS   Cost=2 Cardinality=1         Bytes=134
 TABLE ACCESS BY INDEX ROWID       Object owner=SUZHOU          Object name=SEND_CONTROL  Cost=2 Cardinality=1         Bytes=134
  INDEX RANGE SCAN                  Object owner=SUZHOU          Object name=TEST1                   Cost=1 Cardinality=1         
          
该语句在优化前COST为855,而如果语句字段类型正确,索引生肖,那么COST将降低为2,提升数百倍的性能,何其快哉。


本文转自zylhsy 51CTO博客,原文链接:http://blog.51cto.com/yunlongzheng/419455,如需转载请自行联系原作者

相关文章
|
7月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
3月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
301 1
|
4月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
6月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
7月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
258 9
|
7月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
180 2
|
8月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
9月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
226 11
|
8月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
923 0
|
10月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句