云数据库 GAUSSDB-检查隐式转换的性能问题
检查隐式转换的性能问题
在某些场景下,数据类型的隐式转换可能会导致潜在的性能问题。请看如下场景:
SET enable_fast_query_shipping = off; CREATE TABLE t1(c1 VARCHAR, c2 VARCHAR); CREATE INDEX on t1(c1); EXPLAIN verbose SELECT * FROM t1 WHERE c1 = 10;
上述查询的执行计划如下:
c1的数据类型是varchar,当查询的过滤条件为c1 = 10时,优化器默认将c1隐式转换为bigint类型,导致两个后果:
- 不能进行DN裁剪,计划下发到所有DN上执行。
- 计划中不能使用Index Scan方式扫描数据。
这会引起潜在的性能问题。
当知道了问题原因后,可以做针对性的SQL改写。对于上述场景,只要将过滤条件中的常量显式转换为varchar类型,结果如下:
EXPLAIN verbose SELECT * FROM t1 WHERE c1 = 10::varchar;
为了提前识别隐式类型转换可能带来的性能影响, GaussDB 提供了一个guc option:check_implicit_conversions。打开该参数后,对于查询中出现的隐式类型转换的索引列,在路径生成阶段进行检查,如果发现索引列没有生成候选的索引扫描路径,则会通过报错的形式提示给用户。举例如下:
SET check_implicit_conversions = on; SELECT * FROM t1 WHERE c1 = 10; ERROR: There is no optional index path for index column: "t1"."c1".
- 参数check_implicit_conversions只用于检查隐式类型转换引起的潜在性能问题,在正式生产环境中请关闭该参数(该参数默认关闭)。
- 在将check_implicit_conversions打开时,必须同时关闭enable_fast_query_shipping参数,否则由于后一个参数的作用,无法查看对隐式类型转换修复的结果。
- 一个表的候选路径可能包括seq scan和index scan等多个可能的数据扫描方式,最终执行计划使用的表扫描方式是由执行计划的代价来决定的,因此即使生成了索引扫描的候选路径,也可能生成的最终执行计划中使用其它扫描方式。
- 分布式缓存如何提高系统性能_中间件_系统性能问题-华为云
- GaussDB设置默认值_GaussDB存储过程_高斯数据库设置默认值-华为云
- GaussDB支持的函数_GaussDB函数类型解析_高斯数据库支持的函数-华为云
- GaussDB函数_GaussDB数据库函数_高斯数据库函数_华为云
- GaussDB培训_GaussDB教程_高斯数据库培训-华为云
- 检测APP漏洞安全问题_应用线上安全检查_应用安全-华为云
- GaussDB学习_gaussdb教程_高斯数据库学习_华为云
- 图片文字识别转换_图片识别转换文字_文字语音转换
- 应用性能管理定位请求异常原因_云应用性能问题诊断_ 应用性能管理 APM-华为云
- 安全云脑-基线检查_什么是基线检查_基线检查检查哪些内容