欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Unique SQL原理和應用

 更新時間:2021年05月19日 11:45:02   作者:華為云開發(fā)者社區(qū)  
以一定的算法結合解析樹中的各結點,計算出來一個整數(shù)值,用來唯一標識這一類SQL,這個整數(shù)值被稱為Unique SQL ID,Unique SQL ID相同的SQL語句屬于同一個“Unique SQL”。

1、什么是Unique SQL

用戶執(zhí)行SQL語句時,每一個SQL語句文本都會進入解析器(Parser),生成“解析樹”(parse tree)。遍歷解析樹中各個結點,忽略其中的常數(shù)值,以一定的算法結合樹中的各結點,計算出來一個整數(shù)值,用來唯一標識這一類SQL,這個整數(shù)值被稱為Unique SQL ID,Unique SQL ID相同的SQL語句屬于同一個“Unique SQL”。

例如,用戶先后輸入如下兩條SQL語句:

select * from t1 where id = 1;
select * from t1 where id = 2;

這兩條SQL語句除了過濾條件的常數(shù)值不同,其他地方都相同,由此生成的解析樹的拓撲結構完全相同,故Unique SQL ID也相同。因此兩條語句屬于如下同一個Unique SQL:

select * from t1 where id = ?;

GaussDB內核會對所有上面形式的SQL語句匯總統(tǒng)計信息,通過視圖呈現(xiàn)給用戶。通過這種方式,可以排除一些無關的常量值的干擾,獲得某一類SQL語句的統(tǒng)計數(shù)據(jù),為性能分析和問題定位提供數(shù)值依據(jù)。

注意,對于Unique SQL ID的計算,只會排除常數(shù)值,而不會排除其他的差異。例如,SQL語句“select * from t2 where id = 1;” 與上面的SQL不屬于同一個Unique SQL,不同用戶,從不同的CN節(jié)點執(zhí)行的相同的SQL語句也不屬于同一個Unique SQL。

2、Unique SQL如何統(tǒng)計

收到SQL請求后,GaussDB內核首先算出其Unique SQL ID。如果該Unique SQL ID已存在,則直接更新相關的統(tǒng)計信息。如果不存在,首先創(chuàng)建一個Unique SQL,然后再更新統(tǒng)計信息,如下圖所示:

Unique SQL的統(tǒng)計信息包括執(zhí)行次數(shù),響應時間,Cache/IO數(shù)量,行活動和時間分布等信息,可以通過如下兩個視圖查詢:

  • gs_instr_unique_sql
  • pgxc_instr_unique_sql

前者顯示當前CN(Coordinator Node)節(jié)點(執(zhí)行當前SQL命令的節(jié)點)上的Unique SQL信息,后者顯示系統(tǒng)中所有CN節(jié)點上的Unique SQL信息。兩個視圖的格式相同,均由下表中的字段組成:

3、如何使用Unique SQL

使用Unique SQL功能需要打開以下變量開關:

  • enable_resource_check(默認為on)
  • track_counts(默認為on,影響行活動和Cache/IO相關字段)

此外還需要將instr_unique_sql_count設為正整數(shù)。該變量默認為0,且不能在gsql會話中修改,需要通過SIGHUP的方式設置,例如:

gs_guc reload -Z coordinator -D /path/to/coordinator1/ -c "instr_unique_sql_count=20" > /dev/null

instr_unique_sql_count參數(shù)決定了系統(tǒng)收集的unique sql的數(shù)量。當收集的unique數(shù)量達到這個數(shù)后,新的sql不再被收集。如果將該數(shù)值改大,原有的unique sql信息保留,同時開始收集新的unique sql。如果將該數(shù)值改小,則會清空當前CN節(jié)點所有已收集的unique sql信息,然后開始收集新的unique sql。

設置好上述變量后,Unique sql統(tǒng)計視圖可以像普通視圖一樣查詢,例如:

postgres=# select node_name,query,n_calls from pgxc_instr_unique_sql;
  node_name   |                           query                            | n_calls
--------------+------------------------------------------------------------+---------
 coordinator2 | select node_name,query,n_calls from pgxc_instr_unique_sql; |       0
(1 row)

系統(tǒng)函數(shù)reset_instr_unique_sql可以清理unique sql信息,該函數(shù)有3個參數(shù),含義如下:

1. scope:如果為"GLOBAL",則清除所有CN節(jié)點上的數(shù)據(jù);如果為"LOCAL",只清空當前CN上的數(shù)據(jù)。

2. type:如果為“ALL”,則清除所有數(shù)據(jù);如果為"BY_USERID",只清除指定用戶的unique SQL;如果為"BY_CNID",只清除指定CN的unique SQL。

3. value:如果type=“ALL”,該參數(shù)無意義;如果type="BY_USERID",該參數(shù)為指定用戶的ID,如果type="BY_CNID",該參數(shù)為指定CN的ID。

例如:

postgres=# select reset_instr_unique_sql('global','all',0);
 reset_instr_unique_sql
------------------------
 t
(1 row)

此外,如果數(shù)據(jù)庫進程重啟,也會導致之前收集的unique SQL信息被清空。

4、用Unique SQL輔助定位問題

unique sql視圖提供了豐富的信息,用戶可以根據(jù)需要選取對自己有幫助的信息使用。本節(jié)針對客戶在生產(chǎn)環(huán)境中遇到的實際情況,舉例說明幾種該視圖的使用方法,可供性能優(yōu)化參考。

4.1查詢異常的行活動導致的磁盤爭用

異常的行活動可能引起磁盤爭用,導致業(yè)務運行緩慢。通過查看掃描的行數(shù)、返回的函數(shù)、更改的行數(shù)等指標的波動情況,可以發(fā)現(xiàn)異常的行活動,幫助定位原因。

postgres=# select sum(n_returned_rows) n_returned_rows, sum(n_tuples_fetched) n_tuples_fetched,
    sum(n_tuples_returned) n_tuples_returned, sum(n_tuples_inserted) n_tuples_inserted,
    sum(n_tuples_updated) n_tuples_updated, sum(n_tuples_deleted) n_tuples_deleted from pgxc_instr_unique_sql;
 n_returned_rows | n_tuples_fetched | n_tuples_returned | n_tuples_inserted | n_tuples_updated | n_tuples_deleted
-----------------+------------------+-------------------+-------------------+------------------+------------------
             234 |                0 |                 0 |                 0 |                0 |                0
(1 row)

4.2查詢Top SQL對資源的占用情況

可以基于執(zhí)行時間、CPU時間、掃描行數(shù)、物理讀/邏輯讀等指標,對unique SQL視圖中的SQL語句進行排序,找出占用資源最多的那些SQL語句,有針對性地其分析對性能的影響和原因,幫助查找和定位問題。例如,

按SQL執(zhí)行時間順序或倒序排序:

SELECT user_name, unique_sql_id, query, total_elapse_time FROM pgxc_instr_unique_sql ORDER BY total_elapse_time ASC 或 DESC;

按SQL執(zhí)行占用CPU時間進行順序或倒序排序:

SELECT user_name, unique_sql_id, query, cpu_time FROM pgxc_instr_unique_sql ORDER BY cpu_time ASC 或 DESC;

按SQL順序掃描行數(shù)順序或倒序排序:

SELECT user_name, unique_sql_id, query, n_tuples_returned FROM pgxc_instr_unique_sql ORDER BY n_tuples_returned ASC 或 DESC;

按SQL總掃描行進行順序或倒序排序:

SELECT user_name, unique_sql_id, query, n_tuples_fetched + n_tuples_returned FROM pgxc_instr_unique_sql ORDER BY n_tuples_fetched + n_tuples_returned ASC 或 DESC;

按SQL執(zhí)行執(zhí)行器時間進行順序或倒序排序:

SELECT user_name, unique_sql_id, query, execution_time FROM pgxc_instr_unique_sql ORDER BY execution_time ASC 或 DESC;

按SQL執(zhí)行物理讀次數(shù)進行順序或倒序排序:

SELECT user_name, unique_sql_id, query, n_blocks_fetched FROM pgxc_instr_unique_sql ORDER BY n_blocks_fetched ASC 或 DESC;

按SQL執(zhí)行邏輯讀次數(shù)進行順序或倒序排序:

SELECT user_name, unique_sql_id, query, n_blocks_hit FROM pgxc_instr_unique_sql ORDER BY n_blocks_hit ASC 或 DESC;

4.3查詢邏輯讀/物理讀數(shù)量

邏輯讀/物理讀過多可能導致SQL語句占用較多的CPU時間。通過查詢unique SQL視圖可以得到sql語句邏輯/物理讀數(shù)據(jù)塊的數(shù)量,輔助判斷響應過慢的原因:

查詢物理讀塊數(shù)量:

SELECT n_blocks_fetched FROM pgxc_instr_unique_sql;

查詢邏輯讀塊數(shù)量:

SELECT n_blocks_hit FROM pgxc_instr_unique_sql;

4.4診斷內存配額不足導致性能低下

如果數(shù)據(jù)庫緩沖區(qū)設置得太小,會導致每個SQL語句執(zhí)行的結果不能被緩存,當前SQL執(zhí)行完畢如果有其他SQL執(zhí)行就會把內存中上一個或上幾個SQL緩存的執(zhí)行結果擠出去,下一輪如果當前這個SQL再次執(zhí)行時候又需要從磁盤進行物理IO讀取數(shù)據(jù),而不能直接從緩存中獲取數(shù)據(jù),進而導致SQL執(zhí)行性能較差。

緩沖區(qū)配額是否足夠大,可以通過命中率來判斷。緩沖區(qū)命中率=n_blocks_hit/n_blocks_fetched,可以通過查詢unique SQL來診斷是否存在內存配額不足的問題:

SELECT (n_blocks_hit/ n_blocks_fetched) AS hit_ratio from pgxc_instr_unique_sql;

以上就是詳解Unique SQL原理和應用的詳細內容,更多關于Unique SQL原理和應用的資料請關注腳本之家其它相關文章!

相關文章

  • 關于面試中常問的數(shù)據(jù)庫回表問題

    關于面試中常問的數(shù)據(jù)庫回表問題

    這篇文章主要介紹了關于面試中常問的數(shù)據(jù)庫回表問題,回表就是先通過數(shù)據(jù)庫索引掃描出數(shù)據(jù)所在的行,再通過行主鍵id取出索引中未提供的數(shù)據(jù),即基于非主鍵索引的查詢需要多掃描一棵索引樹,需要的朋友可以參考下
    2023-07-07
  • 一文詳解SQL中為什么不要使用1=1

    一文詳解SQL中為什么不要使用1=1

    很多時候使用where 1=1 可以很方便的解決我們的問題,但是這樣很可能會造成非常大的性能損失,這篇文章主要給大家介紹了關于SQL中為什么不要使用1=1的相關資料,需要的朋友可以參考下
    2024-03-03
  • 一步步教你使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫連接

    一步步教你使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫連接

    Navicat是一套快速、可靠并價格相當便宜的數(shù)據(jù)庫管理工具,專為簡化數(shù)據(jù)庫的管理及降低系統(tǒng)管理成本而設,下面這篇文章主要給大家介紹了關于如何使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫連接的相關資料,需要的朋友可以參考下
    2023-03-03
  • 利用Navicat Premium導出數(shù)據(jù)庫表結構信息至Excel的方法

    利用Navicat Premium導出數(shù)據(jù)庫表結構信息至Excel的方法

    這篇文章主要介紹了利用Navicat Premium導出數(shù)據(jù)庫表結構信息至Excel的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Spark SQL操作JSON字段的小技巧

    Spark SQL操作JSON字段的小技巧

    這篇文章主要給大家介紹了關于Spark SQL操作JSON字段的小技巧,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spark sql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • Navicat?Premium自定義?sql?標簽的創(chuàng)建方式

    Navicat?Premium自定義?sql?標簽的創(chuàng)建方式

    Navicat 中可以自定義一下sql語句的標簽,方便開發(fā)者使用,這篇文章主要介紹了Navicat?Premium自定義sql標簽的創(chuàng)建方式,包括自定義標簽創(chuàng)建方式,結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • SQL的各種連接Join案例詳解

    SQL的各種連接Join案例詳解

    SQL JOIN 子句用于把來自兩個或多個表的行結合起來,基于這些表之間的共同字段,下面就為大家分享一下
    2020-09-09
  • 最新Navicat?16??Mac版安裝永久激活教程(親測有效)

    最新Navicat?16??Mac版安裝永久激活教程(親測有效)

    這篇文章主要介紹了最新Navicat?16??Mac版安裝永久激活教程(親測有效),本文通過圖文并茂的形式給大家介紹的非常詳細,對Navicat?16?永久激活教程感興趣的朋友一起看看吧
    2022-08-08
  • IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法

    IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法

    這篇文章主要介紹了IntellJ Idea 2020版添加sqlite數(shù)據(jù)庫的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • SQL嵌套查詢總結

    SQL嵌套查詢總結

    這是我寫的一個結合UINON的嵌套查詢. 將五個方面的報表放到一個臨時表里,再從臨時表里,將所要的數(shù)據(jù)查詢出來.
    2008-10-10

最新評論