日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Hint

描述

為了增強SQL的可定制性,TuringSQL現已支持了Hint語義。

?

支持版本

>= Ha3 3.7.3

?

語法格式

Select:
  SELECT [/*+ HintName(params)  */]
    { * | projectItem [, projectItem ]* }
  FROM tableExpression [/*+ HintName(params)  */]
  
HintName: [a-zA-Z][a-zA-Z_]*
Params:
                                 Identifier[, Identifier]
      |
              Identifier=Identifier[, Identifier=Identifier]
Identifier: [a-zA-Z_][a-zA-Z_0-9]*        

內置Hint

目前TuringSQL內置了如下四種Hint:

Hint名字

含義

語法

HASH_JOIN

1) 本Hint作用于Table上

2) 附帶本Hint的Table參與Join時優先采用HashJoin,并且本Table優先為內層build表

HASH_JOIN(tableName1, tableName2,...)

LOOKUP_JOIN

1) 本Hint作用于Table上

2) 附帶本Hint的Table參與Join時優先采用LookupJoin,并且本Table優先為內層build表

LOOKUP_JOIN(tableName1, tableName2,...)

NORMAL_AGG

1) 指示Hint作用的Aggregate優先采用一階段執行

NORMAL_AGG(

distributionCheck='false' | 'true',

propScope='all'

)

distributionCheck:是否檢查當前分布,如果distributionCheck=’true‘, 但是Agg的Group Key不是分列字段,那么當前Hint失效。

propScope:是否將當前Hint向下傳播到其他的Agg節點。如果propSCope='all', 代表將傳播到當前及其以下的agg節點。如果不填,那么代表當前Hint只作用在最近的Agg節點。

NO_INDEX

1) 指示Hint作用的字段在Filter時優先不開啟索引優化

NO_INDEX(

tableName='t1',

fields='a, b, c'

)

tableName:用來制定表名。

fields: 用來制定不使用索引優化的字段列表。

示例

HASH_JOIN

SELECT
    /*+ HASH_JOIN(tj_relation)*/
    *
FROM
    (
        SELECT
            /*+ HASH_JOIN(tj_item_raw)*/
            *
        FROM
            (
                SELECT
                    sum(tj_item.id) as sum0
                FROM
                    tj_item
                GROUP BY
                    tj_item.id
            ) B
            JOIN tj_item_raw on B.sum0 = tj_item_raw.id   --> (1)
    ) D
    JOIN tj_relation on D.sum0 = tj_relation.item_id    --> (2)
    
(1)(2)兩個join會被優化為HashJoin    

LOOKUP_JOIN

SELECT
    /*+ LOOKUP_JOIN(tj_relation)*/
    *
FROM
    (
        SELECT
            /*+ LOOKUP_JOIN(tj_item_raw)*/
            *
        FROM
            (
                SELECT
                    sum(tj_item.id) as sum0
                FROM
                    tj_item
                GROUP BY
                    tj_item.id
            ) B
            JOIN tj_item_raw on B.sum0 = tj_item_raw.id  ---> (1)
    ) D
    JOIN tj_relation on D.sum0 = tj_relation.item_id   ---> (2)
    
(1)(2)兩個join均為LookupJoin    

NORMAL_AGG

SELECT
    /*+ LOOKUP_JOIN(tj_relation), NORMAL_AGG(distributionCheck='false', propScope='all')*/
    tj_relation.price
FROM
    (
        SELECT
            *
        FROM
            (
                SELECT
                    sum(tj_item.id) as sum0
                FROM
                    tj_item
                GROUP BY              ----> (1)
                    tj_item.id
            ) B
            JOIN tj_item_raw ON B.sum0 = tj_item_raw.id
    ) D
    JOIN tj_relation ON D.sum0 = tj_relation.item_id
GROUP BY                             ----> (2)
    tj_relation.price
    
(1)(2)兩個Agg均為NormalAgg(不拆分兩個階段)

NO_INDEX

SELECT
    /*+ LOOKUP_JOIN(tj_relation), NO_INDEX(tableName='tj_relation', fields='pk') */
    *
FROM
    (
        SELECT
            /*+ NO_INDEX(tableName='tj_item', fields='shop_id, reserve_price') */
            *
        FROM
            (
                SELECT
                    SUM(tj_item.id) as sum0
                FROM
                    tj_item
                    /*+ NO_INDEX(tableName='tj_item', fields='shop_id') */
                WHERE
                        tj_item.id = 100       
                    AND
                        tj_item.shop_id = 500   ---> (2)
                GROUP BY
                    tj_item.id
            ) B
            JOIN tj_item_raw on B.sum0 = tj_item_raw.id
    ) D
    JOIN tj_relation /*+ NO_INDEX(tableName='tj_relation', fields='item_id') */  on D.sum0 = tj_relation.item_id
WHERE
    tj_relation.item_id = 900 AND tj_relation.pk = 100   ---> (1)
    
(1)中的pk和item_id不是用索引
(2)中shop_id不是用索引

內置ATTR HINT

attr hint是為加速查詢處理提供給op的一些輔助信息,主要用于查詢的截斷,批量的大小等設置,在多列的場景下比較有用。目前支持3種attribute hint

SCAN_ATTR

為scan op傳遞信息,目前支持三個參數:

  • localLimit:scan輸出多少條停止。

  • batchSize:scan每批次輸出條數,一般與localLimit一起使用。默認是輸出全部結果,batchSize由表大小自動計算。

  • nestTableJoinType:nest table的join type,可選模式為 {'inner', 'left'} 兩種,默認為left join模式。

SELECT /*+ SCAN_ATTR(localLimit='3',batchSize='2',nestTableJoinType='inner')*/ 
    company_id, company_name 
FROM
          company

SCAN_ATTR也可寫在表名之后(推薦方式)

SELECT 
    company_id, company_name 
FROM 
    company /*+ SCAN_ATTR(localLimit='3',batchSize='2',nestTableJoinType='inner')*/

此外,scan attr還支持按partition查詢的功能,注意此功能是調試功能,不要依賴于此功能來做分列查詢。

  • hashValues: 根據hash values列表計算查詢的partition

  • partitionIds: 只查partitionIds列表中的partition, -1為訪問全部partition

指定hash值查,查詢a1, a2,會根據表配置的hash func計算出查詢的partition id.

SELECT /*+ SCAN_ATTR(hashValues='a1,a2')*/ company_id, company_name 
FROM company

指定列查,只查詢第1,2兩列

SELECT /*+ SCAN_ATTR(partitionIds='1,2')*/ company_id, company_name 
FROM company

AGG_ATTR

為agg op傳遞信息,目前支持groupKeyLimit與stopExceedLimit兩參數,分別是agg key的個數限制與達到限制后是否查詢報錯。默認key limit是20萬,超過key limit查詢自動報錯。AGG_ATTR只允許出現在select之后。

AGG_ATTR也支持propScope參數用于表示傳播范圍,默認只作用于當前節點。

SELECT /*+ AGG_ATTR(groupKeyLimit='3',stopExceedLimit='false')*/ 
    company_id, company_name 
FROM 
    company 
group by 
    company_id, company_name

JOIN_ATTR

以下只支持 lookup join, 用于lookup join的截斷。

lookupTurncateThreshold是當lookup inner join成功的key數量達到這個值后join就結束。使用的場景如下:lookup join的input有序,只需要返加top k個有inner join結果的查詢。

lookupBatchSize 每批參與lookup join的行數,默認為500。

JOIN_ATTR也支持propScope參數用于表示傳播范圍,默認只作用于當前節點。

SELECT /*+ JOIN_ATTR(lookupTurncateThreshold='30', lookupBatchSize='50')*/ 
    id, daogou.company_id, company_name 
FROM daogou 
      JOIN company 
      ON daogou.id = company.company_id

join_attr與scan_attr是可以一起使用的

SELECT /*+ JOIN_ATTR(lookupTurncateThreshold='3', lookupBatchSize='2')*/ 
    id, daogou.company_id, company_name 
FROM 
    daogou /*+ SCAN_ATTR(localLimit='5',batchSize='1')*/ 
    JOIN 
        company 
    ON 
        daogou.id = company.company_id

left outer join默認值

當左表無法join到右表數據時,右表字段會填默認值,join attr 支持修改默認值,每種類型支持一個默認值

SELECT /*+ JOIN_ATTR(defaultValue='INTEGER:10,VARCHAR:aa')*/ 
    id, daogou.company_id, company_name 
FROM daogou 
      JOIN company 
      ON daogou.id = company.company_id

單機并發(>=Ha3 3.8.0)

目前支持在searcher上開啟多路并行優化。LOCAL_PARALLEL Hint作用在Table上,會自動向上推導可以并發的算子,支持不同的Table開啟不同的并發數;

LOCAL_PARALLEL Hint支持的屬性:

  • tableName: 指定需要并發的表名,格式為catalogName.dbName.tableName,catalgName和dbName不指定時會使用默認值

  • parallelNum: 并發數

SELECT i1
FROM t1 /*+ LOCAL_PARALLEL(tableName='t1', parallelNum='2') */

SELECT i1, COUNT(*)
FROM t1 /*+ LOCAL_PARALLEL(tableName='t1', parallelNum='2') */
GROUP BY i1

SELECT t1.id, t2.id
FROM tj_item /*+ LOCAL_PARALLEL(tableName='tj_item', parallelNum='2') */ AS t1
JOIN tj_shop AS t2
ON t1.id = t2.id

說明:開啟單機并發后不一定會有明顯性能提升,需要配合trace和plan確定瓶頸在哪個算子

注意:與老的方式不兼容,不能同時開啟

沖突解決

  • 如果當前節點存在多個同類Hint,則傳播路徑最短的Hint生效;如果存在多個傳播路徑一樣的Hint,則Hint失效;

  • 如果當前節點存在多個不同類但沖突的Hint,則Hint失效;

  • 如果Hint會使優化器產出錯誤計劃,則Hint失效;

  • 建議有問題時查看生成的計劃,確定Hint是否生效;