登录 | 注册
首页
方案案例
技术社区
资源中心
培训体系
服务合作
关于我们
SUNDB数据库语句优化的几点思路(下)
浅谈SQL优化流程
DB性能侠
专栏:数据库性能调优坊 2024-07-26 9 0
分享到:

书接上回,接着聊聊SQL优化流程中需要注意的那些部分


四、收集表统计信息


  • 收集表的统计信息

ANALYZE TABLE table_name;


  • 使用抽样建立统计信息

ANALYZE TABLE table_name ESTIMATE STATISTICS SAMPLE 10 PERCENT;


  • 仅对主要column与索引建立统计信息

ANALYZE TABLE table_name COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;

ANALYZE TABLE table_name COMPUTE STATISTICS FOR ALL INDEXES;



五、SQL改写,创建索引


image.png


image.png

创建合适的索引:


创建索引的目的是改变访问路径,减少访问路径上花费的成本。

适合建索引的列需满足下列条件:

1,WHERE条件中的列

2,列上数据选择性好,选择性可以用不重复值的数量/总行数来表示,比值越接近于1,选择性越好。



六、使用Hint选择执行计划:


1.常用Hint——访问路径


FULL( table_name )

当指定了FULL( table_name ) Hint时,优化器对指定的表进行全表扫描;只能指定一个表。


INDEX( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

优化器对指定的表进行索引扫描,可以指定索引或不指定索引,可以指定多个索引;

当指定多个索引时,优化器根据统计信息选择成本最低的索引;


不指定索引时,优化器评估该表上的所有索引,然后选择成本最低的索引。

INDEX_ASC( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

按照顺序扫描索引,如果创建索引时选择的是顺序索引,则扫描结果是顺序的;

如果创建索引时选择的时逆序索引,则扫描结果是逆序的。

INDEX_DESC( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

与INDEX_ASC相反。


INDEX_COMBINE( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

优化器对指定的表的OR语句进行切分,分别执行索引扫描然后合并结果。


IN_KEY_RANGE( table_name [ , ] [ index_name [ [ , ] index_name ] ] ) 使用In Key Range扫描,需要有IN 子句。

ROWID( table_name ) 使用ROWID访问路径,需要有ROWID的等值条件。



2.常用Hint——关联顺序 


  • ORDERED

优化器选择关联顺序时,与SQL语句中表的关联顺序一致。


  • ORDERING( table_name [ , table_name [ , table_name [ LEFT | RIGHT ] ] ] )

优化器选择关联顺序时,按照Hint中提示的表顺序进行关联。

第一个表和第二个表不能选择表位置选项,从第三个表开始可以选择表关联时的位置。

关联位置包括LEFT和RIGHT,LEFT将表置于关联的左边节点(Outer node);

RIGHT将表置于关联的右边节点(Inner node)。

不指定位置信息时,按照估算成本最低选择。


  • LEADING( table_name [ [ , ] table_name ] )

与ORDERING类似,但不能指定关联位置,只能指定关联顺序


3.常用Hint——关联方法


  • USE_HASH( table_name [ [ , ] table_name ] )

在指定的表进行关联时,优化器会选择HASH JOIN;

至少需要指定一个表,同一个表不能重复出现;

进行关联的两个表各自用Hint指定了不同的关联方法时,依据表的关联顺序,选择右节点(Inner node)的关联方法。


  • USE_HASH_IN( alias )

在对指定的别名执行关联时,优化器选择HASH JOIN;aliase做右节点(Inner node)。

alias可以是表、表别名、视图、视图别名、关联子查询别名等。


  • USE_HASH_OUT( alias )

在对指定的别名执行关联时,优化器选择HASH JOIN,并且让alias做左节点(Outer node)。


USE_MERGE( table_name [ [ , ] table_name ] )

USE_MERGE_IN( alias )

USE_MERGE_OUT( alias )


USE_NL( table_name [ [ , ] table_name ] )

USE_NL_IN( alias )

USE_NL_OUT( alias )










0
评论

登录后发表回复

暂无评论
专栏作者
DB性能侠

实战技巧,解锁数据库性能瓶颈

  • 文章

    4
  • 阅读量

    39
  • 获赞

    4
实战技巧,解锁数据库性能瓶颈

SUNDB

常见问题集锦

SUNDB

免费试用

回复