1. 程式人生 > 其它 >第八章 解釋SQL查詢計劃(一)

第八章 解釋SQL查詢計劃(一)

文章目錄

第八章 解釋SQL查詢計劃(一)

SQL語句

這個SQL語句列表為每個表提供了SQL查詢和其他操作的記錄,包括插入、更新和刪除。
這些SQL語句連結到一個查詢計劃,該連結提供凍結該查詢計劃的選項。

系統為每個SQL DML操作建立一條SQL語句。
這提供了一個按表、檢視或過程名稱列出的SQL操作列表。
如果更改表定義,可以使用此SQL Statements列表來確定每個SQL操作的查詢計劃是否會受到此DDL更改的影響,以及/或是否需要修改某個SQL操作。

然後,可以:

  • 確定每個SQL操作使用哪個查詢計劃。
    可以決定使用反映對錶定義所做更改的修改後的查詢計劃。
    或者可以凍結當前查詢計劃,保留在更改表定義之前生成的查詢計劃。
  • 根據對錶定義所做的更改,確定是否對對該表執行SQL操作的例程進行程式碼更改。

注意:SQL語句是一個SQL例程列表,它們可能會受到表定義更改的影響。
它不應該用作表定義或表資料更改的歷史記錄。

建立SQL語句操作

下面的SQL操作會建立相應的SQL語句:

資料管理(DML)操作包括對錶的查詢、插入、更新和刪除操作。
每個資料管理(DML)操作(動態SQL和嵌入式SQL)在執行時都會建立一個SQL語句。

  • 動態SQL SELECT
    命令在準備查詢時建立SQL語句。
    此外,在管理門戶快取查詢列表中建立了一個條目。
  • 嵌入式SQL基於指標的SELECT命令在OPEN命令呼叫宣告的查詢時建立SQL語句。管理門戶快取查詢列表中不會建立單獨的條目。

如果查詢引用多個表,則在名稱空間的SQL語句中建立一條SQL語句,該語句列出表/檢視/過程名列中的所有被引用表,並且對於每個單獨的被引用表,該表的SQL語句列表都包含該查詢的條目。

SQL語句是在第一次準備查詢時建立的。如果多個客戶端發出相同的查詢,則只記錄第一次準備。例如,如果JDBC發出一個查詢,然後ODBC發出一個相同的查詢,那麼SQL語句索引將只有關於第一個JDBC客戶端的資訊,而不是關於ODBC客戶端的資訊。

大多數SQL語句都有關聯的查詢計劃。
建立該查詢計劃時,將解凍該查詢計劃;
可以隨後將該查詢計劃指定為凍結計劃。
帶有查詢計劃的SQL語句包括涉及SELECT操作的DML命令。
下面的“計劃狀態”部分列出了沒有查詢計劃的SQL語句。

注意:SQL語句只列出SQL操作的最新版本。
除非凍結SQL語句,否則InterSystems IRIS®資料平臺將用下一個版本替換它。
因此,在例程中重寫和呼叫SQL程式碼將導致舊的SQL程式碼從SQL語句中消失。

其他SQL語句操作

下面的SQL命令執行更復雜的SQL語句操作:

  • CREATE TRIGGER: 在定義觸發器的表中,無論是在定義觸發器還是在提取觸發器時,都不會建立SQL語句。
    但是,如果觸發器對另一個表執行DML操作,那麼定義觸發器將在被觸發器程式碼修改過的表中建立一個SQL語句。
    Location指定在其中定義觸發器的表。
    在定義觸發器時定義SQL語句;
    刪除觸發器將刪除SQL語句。
    觸發觸發器不會建立SQL語句。
  • CREATE VIEW 不建立SQL語句,因為沒有編譯任何內容。
    它也不會更改源表的SQL語句的Plan Timestamp。
    然而,為檢視編譯DML命令會為該檢視建立一個SQL語句。

List SQL語句

本節介紹使用Management Portal介面列出SQL語句的詳細資訊。
也可以使用^rINDEXSQL全域性返回SQL語句的索引列表。
注意,這個SQL語句List可能包含過時的(不再有效的)List

從Management Portal SQL介面可以列出如下SQL語句:

  • SQL語句選項卡:此選項卡列出名稱空間中的所有SQL語句,先按模式排序,然後按每個模式中的表名/檢視名排序。此列表僅包括當前使用者擁有許可權的那些表/檢視。如果SQL語句引用多個表,則表/檢視/過程名列將按字母順序列出所有被引用的表。
  • 通過單擊列標題,可以按表/檢視/過程名、計劃狀態、位置、SQL語句文字或列表中的任何其他列對SQL語句列表進行排序。這些可排序列使能夠快速查詢,例如,所有凍結計劃(計劃狀態)、所有快取查詢(位置)或最慢的查詢(平均時間)。
  • 可以使用此選項卡提供的Filter選項將列出的SQL語句縮小到指定的子集。
    指定的篩選器字串篩選SQL語句列表中的所有資料,最有用的是模式或模式。
    表名、例程位置或SQL語句文字中找到的子字串。
    過濾字串不區分大小寫,但必須緊跟語句文字標點空格(name , age, not name,age)
    如果查詢引用了多個表,如果它選擇了表/檢視/過程名稱列中的任何引用表,則Filter包括SQL語句。
    過濾選項是使用者自定義的。
  • 最大行選項預設為1,000
    最大值為10,000
    最小值為10
    要列出超過10,000條SQL語句,請使用INFORMATION_SCHEMA.STATEMENTS
    頁面大小和最大行選項是使用者自定義的。
  • Catalog Details選項卡:選擇一個表並顯示其Catalog詳細資訊。
    此選項卡提供了一個表的SQL語句按鈕,用於顯示與該表關聯的SQL語句。
    注意,如果一個SQL語句引用了多個表,那麼它將在表的SQL語句列表中列出每個被引用的表,但只有當前選擇的表在表名列中列出。

通過單擊列標題,可以根據列表的任何列對錶的SQL語句列表進行排序。

可以使用SQLTableStatements()目錄查詢或INFORMATION_SCHEMA
語句,列出根據各種條件選擇的SQL語句,如下面的查詢SQL語句中所述。

列表列

SQL語句選項卡列出名稱空間中的所有SQL語句。目錄詳細資訊選項卡表的SQL語句按鈕列出了所選表的SQL語句。這兩個列表都包含以下列標題:

  • #:列表行的順序編號。這些數字與特定的SQL語句沒有關聯。
  • 表/檢視/過程名:限定的SQL表(或檢視或過程)名:schema.name。如果SQL語句查詢引用了多個表或檢視,則所有這些表或檢視都會在此處列出。
  • 計劃狀態:請參閱下面的計劃狀態。
  • 新計劃:見“凍結計劃”一章中不同的新計劃。
  • 自然查詢:請參閱下面的語句詳細資訊部分。
  • 計數:請參閱下面的效能統計資料。
  • 平均計數:請參閱下面的效能統計資料。
  • 總時間:請參閱下面的效能統計資料。
  • 平均時間:請參閱下面的效能統計資料。
  • 標準開發人員:請參閱下面的效能統計資料。
  • Location(S):編譯查詢的位置,例程名稱(對於嵌入式SQL)或快取查詢名稱(對於動態SQL)。如果包名為%sqlcq,則SQL語句為快取查詢。
  • SQL語句文字:規範化格式的SQL語句文字(截斷為128個字元),可能與以下SQL語句文字中指定的命令文字不同。

計劃狀態

計劃狀態列出以下內容之一:

  • 解凍Unfrozen:未凍結,可凍結。
  • 解凍/平行Unfrozen/Parallel::未凍結,不能凍結。
  • 凍結/顯式Frozen/Explicit:由使用者動作凍結,可以解凍。
  • Frozen/Upgrade:被InterSystems IRIS版本升級凍結,可以解凍。
  • blank:沒有關聯的查詢計劃:
    • INSERT... VALUES() 命令建立的SQL語句沒有關聯的查詢計劃,因此無法解凍或凍結(計劃狀態列為空)。儘管此SQL命令不會生成查詢計劃,但它在SQL語句中的列表仍然很有用,因為它允許快速定位針對該表的所有SQL操作。例如,如果向表中新增一列,則可能需要找出該表的所有SQL插入的位置,以便可以更新這些命令以包括此新列。
    • 基於遊標的UPDATEDELETE命令沒有關聯的查詢計劃,因此不能解凍或凍結(“計劃狀態”列為空)。對已宣告的遊標執行OPEN命令會生成一條帶有關聯查詢計劃的SQL語句。使用該遊標的嵌入式SQL語句(FETCH cursor, UPDATE...WHERE CURRENT OF cursor, DELETE...WHERE CURRENT OF cursor, and CLOSE cursor)不生成單獨的SQL語句。即使基於遊標的UPDATEDELETE不會產生查詢計劃,但SQL語句中列出的查詢計劃仍然很有用,因為它允許快速定位針對該表的所有SQL操作。

SQL語句文字

SQL語句文字通常不同於SQL命令,因為SQL語句生成規範化了字母和空格。
其他差異如下:

如果從Management Portal介面或SQL Shell介面發出查詢,所得到的SQL語句與在SELECT語句前面加上DECLARE QRS CURSOR FOR(其中“QRS”可以是各種生成的遊標名稱)的查詢不同。
這允許語句文字與Dynamic SQL快取的查詢相匹配。

如果SQL命令指定了一個非限定的表或檢視名,那麼生成的SQL語句將使用模式搜尋路徑(如果提供了DML)或預設模式名來提供模式。

SQL語句文字在1024個字元之後被截斷。
要檢視完整的SQL語句文字,請顯示SQL語句詳細資訊。

一個SQL命令可能會產生多個SQL語句。
例如,如果一個查詢引用一個檢視,SQL Statements將顯示兩個語句文字,一個列在檢視名稱下,另一個列在基礎表名稱下。
凍結任意一條語句都會導致兩個語句的Plan State為Frozen。

當通過xDBC準備SQL語句時,如果需要這些選項來生成語句索引雜湊,則SQL語句生成會向語句文字新增SQL Comment Options (# Options)。
如下面的例子所示:

DECLARE C CURSOR FOR SELECT * INTO :%col(1) , :%col(2) , :%col(3) , :%col(4) , :%col(5) FROM SAMPLE . COMPANY /*#OPTIONS {"xDBCIsoLevel":0} */ 

陳舊的SQL語句

刪除與SQL語句關聯的例程或類時,不會自動刪除SQL語句列表。這種型別的SQL語句列表稱為陳舊。由於訪問此歷史資訊以及與SQL語句相關聯的效能統計資訊通常很有用,因此這些過時的條目將保留在管理門戶SQL語句列表中。

可以使用Clean Stale(清除陳舊)按鈕刪除這些陳舊條目。清除陳舊刪除關聯例程或類(表)不再存在或不再包含SQL語句查詢的所有非凍結SQL語句。清除陳舊不會刪除凍結的SQL語句。

可以使用$SYSTEM.SQL.Statement.Clean()方法執行相同的清除陳舊操作。

如果刪除與SQL語句關聯的表(持久化類),則會修改表/檢視/過程名稱列,如下例所示:SAMPLE.MYTESTTABLE - Deleted??; ;已刪除表的名稱將轉換為全部大寫字母,並標記為“DELETED??”。或者,如果SQL語句引用了多個表:SAMPLE.MYTESTTABLE - Deleted?? Sample.Person.

  • 對於動態SQL查詢,刪除表時Location列為空,因為與該表關聯的所有快取查詢都已自動清除。CLEAN STALE刪除SQL語句。
  • 對於嵌入式SQL查詢,Location列包含用於執行查詢的例程的名稱。當更改例程使其不再執行原始查詢時,位置列為空。CLEAN STALE刪除SQL語句。刪除查詢使用的表時,該表被標記“Deleted??”;Clean Stale不會刪除SQL語句。

注:系統任務在所有名稱空間中每小時自動執行一次,以清除任何可能過時或具有過時例程引用的SQL語句的索引。執行此操作是為了維護系統性能。此內部清理不會反映在管理門戶SQL語句列表中。可以使用管理門戶監視此每小時一次的清理或強制其立即執行。要檢視此任務上次完成和下次排程的時間,請依次選擇系統操作、工作管理員、任務排程,然後檢視清理SQL語句索引任務。可以單擊任務名稱檢視任務詳細資訊。在Task Details(任務詳細資訊)顯示中,可以使用Run(執行)按鈕強制立即執行任務。請注意,這些操作不會更改SQL語句清單;必須使用Clean Stale來更新SQL語句清單。

資料管理(DML)SQL語句

建立SQL語句的資料管理語言(DML)命令包括:INSERTUPDATEINSERTUPDATEDELETETRUNCATE TABLESELECTOPEN CURSOR(用於宣告的基於遊標的SELECT)。可以使用動態SQL或嵌入式SQL來呼叫DML命令。可以為表或檢視呼叫DML命令,InterSystems IRIS將建立相應的SQL語句。

注意:系統在準備動態SQL或開啟嵌入式SQL遊標時(而不是在執行DML命令時)建立SQL語句。SQL語句時間戳記錄此SQL程式碼呼叫的時間,而不是查詢執行的時間(或是否)。因此,SQL語句可能表示從未實際執行的表資料更改。

準備動態SQL DML命令將建立相應的SQL語句。與此SQL語句關聯的位置是快取查詢。動態SQL是在從管理門戶SQL介面、SQL Shell介面執行SQL或從.txt檔案匯入時準備的。清除未凍結的快取查詢會將相應的SQL語句標記為清除陳舊刪除。清除凍結的快取查詢會刪除相應SQL語句的位置值。解凍SQL語句會將其標記為Clean Stale刪除。

執行非遊標嵌入式SQL資料管理語言(DML)命令將建立相應的SQL語句。每個嵌入式SQL DML命令都會建立相應的SQL語句。如果一個例程包含多個嵌入式SQL命令,則每個嵌入式SQL命令都會建立一個單獨的SQL語句。(某些嵌入式SQL命令會建立多條SQL語句。)。SQL語句清單的Location列指定包含嵌入式SQL的例程。通過這種方式,SQL語句維護每個嵌入式SQL DML命令的記錄。

開啟基於遊標的嵌入式SQL資料管理語言(DML)例程將建立帶有查詢計劃的SQL語句。
關聯的嵌入式SQL語句(FETCH遊標、CLOSE遊標)不會生成單獨的SQL語句。
在FETCH遊標之後,一個關聯的UPDATE table WHERE CURRENT OF cursor 或DELETE FROM table WHERE CURRENT OF cursor會生成一個單獨的SQL語句,但不會生成單獨的Query Plan

插入文字值的INSERT命令將建立一個“計劃狀態”列為空的SQL語句。
由於該命令不會建立查詢計劃,因此無法凍結SQL語句。

select命令

呼叫查詢將建立相應的SQL語句。
它可以是一個簡單的SELECT操作,也可以是一個基於指標的SELECT/FETCH操作。
可以對錶或檢視發出查詢。

  • 包含JOIN的查詢為每個表建立相同的SQL語句。
    Location是清單中儲存的每個表的相同查詢。
    如SQL語句詳細資訊例程和關係部分所述,該語句使用以下關係列出所有表。
  • 包含選擇項子查詢的查詢為每個表建立相同的SQL語句。
    Location是清單中儲存的每個表的相同查詢。
    如SQL語句詳細資訊例程和關係部分所述,該語句使用以下關係列出所有表。
  • 引用外部(連結)表的查詢不能被凍結。
  • 一個包含FROM子句%PARALLEL關鍵字的查詢可以建立多個SQL語句。
    你可以通過呼叫來顯示這些生成的SQL語句:

在這裡插入圖片描述

這將顯示包含原始查詢的語句雜湊的Statement列和包含生成的查詢版本的語句雜湊的ParentHash列。

%PARALLEL查詢的SQL語句的計劃狀態為“未凍結/並行”,不能被凍結。

  • 不包含FROM子句(因此不引用任何表)的查詢仍然建立SQL語句。
    例如:SELECT $LENGTH('this string')建立一個SQL語句,表列值%TSQL_sys.snf