Hint的错误、冲突及告警

    Hint中的错误不会影响语句的执行,只是不能生效,该错误会根据语句类型以不同方式提示用户。对于explain语句,hint的错误会以warning形式显示在界面上,对于非explain语句,会以debug1级别日志显示在日志中,关键字为PLANHINT。

    hint的错误分为以下类型:

    • 语法错误

      语法规则树归约失败,会报错,指出出错的位置。

      例如:hint关键字错误,leading hint或join hint指定2个表以下,其它hint未指定表等。一旦发现语法错误,则立即终止hint的解析,所以此时只有错误前面的解析完的hint有效。

      nestloop(t1)存在语法错误,则终止解析,可用hint只有之前解析的leading((t1 t2))。

    • 语义错误

      • 表不存在,存在多个,或在leading或join中出现多次,均会报语义错误。
      • scanhint中的index不存在,会报语义错误。
      • 另外,如果子查询提升后,同一层出现多个名称相同的表,且其中某个表需要被hint,hint会存在歧义,无法使用,需要为相同表增加别名规避。
    • 子链接提升后hint失效

      子链接提升后的hint失效,会给出提示。通常出现在子链接中存在多个表连接的场景。提升后,子链接中的多个表不再作为一个整体出现在join中。

    • hint未被使用

      • 非等值join使用hashjoin hint或mergejoin hint。
      • 通常只有在索引列上使用过滤条件才会生成相应的索引路径,全表扫描将不会使用索引,因此使用indexscan hint或indexonlyscan hint将不会使用。
      • indexonlyscan只有输出和谓词条件列仅包含索引列才会使用,否则指定时hint不会被使用。
      • 多个表存在等值连接时,仅尝试有等值连接条件的表的连接,此时没有关联条件的表之间的路径将不会生成,所以指定相应的leading,join,rows hint将不使用,例如:t1 t2 t3表join,t1和t2, t2和t3有等值连接条件,则t1和t3不会优先连接,leading(t1 t3)不会被使用。
      • 如果子链接未被提升,则blockname hint不会被使用。
      • 对于skew hint,hint未被使用可能由于:
        • 倾斜优化的GUC参数处于关闭状态。