VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

使用Plan Hint进行调优

Plan Hint为用户提供了直接影响执行计划生成的手段,用户可以通过指定join顺序,join、scan方法,指定结果行数,等多个手段来进行执行计划的调优,以提升查询的性能。

功能描述

Plan Hint仅支持在SELECT关键字后通过如下形式指定:

/*+ <plan hint>*/

可以同时指定多个hint,之间使用空格分隔。hint只能hint当前层的计划,对于子查询计划的hint,需要在子查询的select关键字后指定hint。

例如:

select /*+ <plan_hint1> <plan_hint2> */ * from t1, (select /*+ <plan_hint3> */ from t2) where 1=1;

其中为外层查询的hint,为内层子查询的hint。


如果在视图定义(CREATE VIEW)时指定hint,则在该视图每次被应用时会使用该hint。
当使用random plan功能(参数plan_mode_seed不为0)时,查询指定的plan hint不会被使用。

支持范围

当前版本Plan Hint支持的范围如下,后续版本会进行增强。

  • 指定Join顺序的Hint - leading hint

  • 指定Join方式的Hint,仅支持除semi/anti join,unique plan之外的常用hint。

  • 指定结果集行数的Hint

  • 指定Scan方式的Hint,仅支持常用的tablescan,indexscan和indexonlyscan的hint。

  • 指定子链接块名的Hint

注意事项

不支持Agg、Sort、Setop和Subplan的hint。

示例

本章节使用同一个语句进行示例,便于Plan Hint支持的各方法作对比,示例语句及不带hint的原计划如下所示:

create table store 
( 
    s_store_sk                integer               not null, 
    s_store_id                char(16)              not null, 
    s_rec_start_date          date                          , 
    s_rec_end_date            date                          , 
    s_closed_date_sk          integer                       , 
    s_store_name              varchar(50)                   , 
    s_number_employees        integer                       , 
    s_floor_space             integer                       , 
    s_hours                   char(20)                      , 
    s_manager                 varchar(40)                   , 
    s_market_id               integer                       , 
    s_geography_class         varchar(100)                  , 
    s_market_desc             varchar(100)                  , 
    s_market_manager          varchar(40)                   , 
    s_division_id             integer                       , 
    s_division_name           varchar(50)                   , 
    s_company_id              integer                       , 
    s_company_name            varchar(50)                   , 
    s_street_number           varchar(10)                   , 
    s_street_name             varchar(60)                   , 
    s_street_type             char(15)                      , 
    s_suite_number            char(10)                      , 
    s_city                    varchar(60)                   , 
    s_county                  varchar(30)                   , 
    s_state                   char(2)                       , 
    s_zip                     char(10)                      , 
    s_country                 varchar(20)                   , 
    s_gmt_offset              decimal(5,2)                  , 
    s_tax_precentage          decimal(5,2)                  , 
    primary key (s_store_sk) 
); 
create table store_sales 
( 
    ss_sold_date_sk           integer                       , 
    ss_sold_time_sk           integer                       , 
    ss_item_sk                integer               not null, 
    ss_customer_sk            integer                       , 
    ss_cdemo_sk               integer                       , 
    ss_hdemo_sk               integer                       , 
    ss_addr_sk                integer                       , 
    ss_store_sk               integer                       , 
    ss_promo_sk               integer                       , 
    ss_ticket_number          integer               not null, 
    ss_quantity               integer                       , 
    ss_wholesale_cost         decimal(7,2)                  , 
    ss_list_price             decimal(7,2)                  , 
    ss_sales_price            decimal(7,2)                  , 
    ss_ext_discount_amt       decimal(7,2)                  , 
    ss_ext_sales_price        decimal(7,2)                  , 
    ss_ext_wholesale_cost     decimal(7,2)                  , 
    ss_ext_list_price         decimal(7,2)                  , 
    ss_ext_tax                decimal(7,2)                  , 
    ss_coupon_amt             decimal(7,2)                  , 
    ss_net_paid               decimal(7,2)                  , 
    ss_net_paid_inc_tax       decimal(7,2)                  , 
    ss_net_profit             decimal(7,2)                  , 
    primary key (ss_item_sk, ss_ticket_number) 
); 
create table store_returns 
( 
    sr_returned_date_sk       integer                       , 
    sr_return_time_sk         integer                       , 
    sr_item_sk                integer               not null, 
    sr_customer_sk            integer                       , 
    sr_cdemo_sk               integer                       , 
    sr_hdemo_sk               integer                       , 
    sr_addr_sk                integer                       , 
    sr_store_sk               integer                       , 
    sr_reason_sk              integer                       , 
    sr_ticket_number          integer               not null, 
    sr_return_quantity        integer                       , 
    sr_return_amt             decimal(7,2)                  , 
    sr_return_tax             decimal(7,2)                  , 
    sr_return_amt_inc_tax     decimal(7,2)                  , 
    sr_fee                    decimal(7,2)                  , 
    sr_return_ship_cost       decimal(7,2)                  , 
    sr_refunded_cash          decimal(7,2)                  , 
    sr_reversed_charge        decimal(7,2)                  , 
    sr_store_credit           decimal(7,2)                  , 
    sr_net_loss               decimal(7,2)                  , 
    primary key (sr_item_sk, sr_ticket_number) 
); 
create table customer 
( 
    c_customer_sk             integer               not null, 
    c_customer_id             char(16)              not null, 
    c_current_cdemo_sk        integer                       , 
    c_current_hdemo_sk        integer                       , 
    c_current_addr_sk         integer                       , 
    c_first_shipto_date_sk    integer                       , 
    c_first_sales_date_sk     integer                       , 
    c_salutation              char(10)                      , 
    c_first_name              char(20)                      , 
    c_last_name               char(30)                      , 
    c_preferred_cust_flag     char(1)                       , 
    c_birth_day               integer                       , 
    c_birth_month             integer                       , 
    c_birth_year              integer                       , 
    c_birth_country           varchar(20)                   , 
    c_login                   char(13)                      , 
    c_email_address           char(50)                      , 
    c_last_review_date        char(10)                      , 
    primary key (c_customer_sk) 
); 
create table promotion 
( 
    p_promo_sk                integer               not null, 
    p_promo_id                char(16)              not null, 
    p_start_date_sk           integer                       , 
    p_end_date_sk             integer                       , 
    p_item_sk                 integer                       , 
    p_cost                    decimal(15,2)                 , 
    p_response_target         integer                       , 
    p_promo_name              char(50)                      , 
    p_channel_dmail           char(1)                       , 
    p_channel_email           char(1)                       , 
    p_channel_catalog         char(1)                       , 
    p_channel_tv              char(1)                       , 
    p_channel_radio           char(1)                       , 
    p_channel_press           char(1)                       , 
    p_channel_event           char(1)                       , 
    p_channel_demo            char(1)                       , 
    p_channel_details         varchar(100)                  , 
    p_purpose                 char(15)                      , 
    p_discount_active         char(1)                       , 
    primary key (p_promo_sk) 
); 
create table customer_address 
( 
    ca_address_sk             integer               not null, 
    ca_address_id             char(16)              not null, 
    ca_street_number          char(10)                      , 
    ca_street_name            varchar(60)                   , 
    ca_street_type            char(15)                      , 
    ca_suite_number           char(10)                      , 
    ca_city                   varchar(60)                   , 
    ca_county                 varchar(30)                   , 
    ca_state                  char(2)                       , 
    ca_zip                    char(10)                      , 
    ca_country                varchar(20)                   , 
    ca_gmt_offset             decimal(5,2)                  , 
    ca_location_type          char(20)                      , 
    primary key (ca_address_sk) 
); 
create table item 
( 
    i_item_sk                 integer               not null, 
    i_item_id                 char(16)              not null, 
    i_rec_start_date          date                          , 
    i_rec_end_date            date                          , 
    i_item_desc               varchar(200)                  , 
    i_current_price           decimal(7,2)                  , 
    i_wholesale_cost          decimal(7,2)                  , 
    i_brand_id                integer                       , 
    i_brand                   char(50)                      , 
    i_class_id                integer                       , 
    i_class                   char(50)                      , 
    i_category_id             integer                       , 
    i_category                char(50)                      , 
    i_manufact_id             integer                       , 
    i_manufact                char(50)                      , 
    i_size                    char(20)                      , 
    i_formulation             char(20)                      , 
    i_color                   char(20)                      , 
    i_units                   char(10)                      , 
    i_container               char(10)                      , 
    i_manager_id              integer                       , 
    i_product_name            char(50)                      , 
    primary key (i_item_sk) 
); 
explain 
select i_product_name product_name 
,i_item_sk item_sk 
,s_store_name store_name 
,s_zip store_zip 
,ad2.ca_street_number c_street_number 
,ad2.ca_street_name c_street_name 
,ad2.ca_city c_city 
,ad2.ca_zip c_zip 
,count(*) cnt 
,sum(ss_wholesale_cost) s1 
,sum(ss_list_price) s2 
,sum(ss_coupon_amt) s3 
FROM   store_sales 
,store_returns 
,store 
,customer 
,promotion 
,customer_address ad2 
,item 
WHERE  ss_store_sk = s_store_sk AND 
ss_customer_sk = c_customer_sk AND 
ss_item_sk = i_item_sk and 
ss_item_sk = sr_item_sk and 
ss_ticket_number = sr_ticket_number and 
c_current_addr_sk = ad2.ca_address_sk and 
ss_promo_sk = p_promo_sk and 
i_color in ('maroon','burnished','dim','steel','navajo','chocolate') and 
i_current_price between 35 and 35 + 10 and 
i_current_price between 35 + 1 and 35 + 15 
group by i_product_name 
,i_item_sk 
,s_store_name 
,s_zip 
,ad2.ca_street_number 
,ad2.ca_street_name 
,ad2.ca_city 
,ad2.ca_zip 
;