db2巢狀查詢效率 DB2資料庫SQL優化方法一列

2021-10-12 22:59:09 字數 1909 閱讀 2980

optimize for 子句宣告只想檢索部分結果或者優先檢索前幾行,優化器可以選擇能夠將檢索前幾行所需的響應時間縮至最短的訪問方案。此外,作為單個塊傳送到客戶機的行數由 n 的值限制。因此,optimize for 子句既影響伺服器從資料庫檢索合格行的方式,又影響將那些行返回給客戶機的方式.

例如,假定您定期查詢 employee 表以確定哪些職員的薪水最高:

select lastname, firstnme, empno, salary     from employee     order by salary desc

雖然您先前已對 salary 列定義了乙個降序索引,但因為職員按職員編號排序,所以此索引的集群度可能不佳。為了盡量避免許多隨機的同步 i/o,優化器將可能選擇列表預取訪問方法,此方法要求對所有合格行的行標識進行排序。此排序可能會導致在將前幾個合格行返回給應用程式之前發生延遲。為了防止此延遲,請在語句中新增 optimize for 子句,如下所示:

select lastname, firstnme, empno, salary     from employee     order by salary desc     optimize for 20 rows

在這種情況下,優化器可能選擇直接使用 salary 索引,這是因為只檢索薪水最高的 20 位職員。無論可以對多少行進行分塊,都只將包含 20 行的行塊返回給客戶機。

使用 optimize for 子句,優化器優先選擇能夠避免大批操作或流中斷(例如排序操作所引起的情況)的訪問方案。您最有可能使用 optimize for 1 row 子句來影響訪問路徑。使用此子句有下列作用:

降低了連線序列包含組合內錶的可能性,這是因為它們需要臨時表。

連線方法可能會有所更改。最有可能的選項是巢狀迴圈連線,這是因為它的開銷成本較低,並且在檢索少量行時通常更有效率。

1.更有可能存在與 order by 子句匹配的索引,這是因為 order by 不要求進行排序。

2.降低了列表預取的可能性,這是因為此訪問方法要求進行排序。

3.降低了順序預取的可能性,這是因為只需要少量的幾行。

4.在連線查詢中,有可能將包含 order by 子句中的列的表選作外表,前提是該外表的某個索引提供了 order by 子句所需的排序。

雖然 optimize for 子句適用於所有優化級別,但它在優化類 3 和更高優化類下工作得最好,這是因為低於 3 的優化類使用寬限連線列舉搜尋策略。此方法有時會產生無法使它們自己快速檢索前幾行的多表連線訪問方案。如果已打包的應用程式使用呼叫級介面(db2 cli 或 odbc),那麼可以在 db2cli.ini 配置檔案中使用 optimizefornrows 關鍵字,讓 db2 cli 在每個查詢語句的末尾自動追加 optimize for 子句。

從暱稱選擇資料時,結果可能隨資料來源支援的不同而有所變化。如果暱稱所引用的資料來源支援 optimize for 子句,並且 db2 優化器將整個查詢下推至資料來源,那麼將在傳送到資料來源的遠端 sql 中生成該子句。如果資料來源不支援此子句,或者優化器確定最低成本方案是本地執行,那麼將在本地應用 optimize for 子句。在這種情況下,db2 優化器將優先選擇能夠最大程度縮短檢索某個查詢前幾行的響應時間的訪問方案,但可供優化器用於生成方案的選項略微受限,並且 optimize for 子句對效能的改善幅度可能微不足道。

如果同時指定 optimize for 子句和 fetch first 子句,那麼兩個 n 值中的較小者將影響通訊緩衝區大小。為了進行優化,這兩個值被視為互不相關。

fetch first n rows only 子句

fetch first n rows only 子句設定可檢索的最大行數。將結果表限制為只包含前幾行有助於提高效能。無論結果集可能另外包含多少行,也只檢索 n 行。

如果同時指定 fetch first 子句和 optimize for 子句,那麼兩個 n 值中的較小者將影響通訊緩衝區大小。為了進行優化,這兩個值被視為互不相關。

DB2巢狀游標

p1 begin declare v did varchar 10 declare v dname varchar 10 declare v tid varchar 10 declare v tname varchar 10 declare i seq integer default 0 decla...

查詢DB2資料庫約束

近期在做乙個功能測試時,需要往db2資料庫中插入一條資料,插入時,一直報 sqlerrmc wcsadmin.manifest.f 428,錯誤,通過dbvisualizer personal工具檢視該錶,顯示有乙個 f 428外來鍵約束,但是無奈,就是不知道具體是哪一列 或哪幾列,本人對這個系統整...

db2與mysql編目 DB2 資料庫編目

方法一 命令執行方法 db2 catalog tcpip node node name remote server ip server server port l node name 所要編目的節點名,任意起。節點名在一台機器上必須是唯一的,不能跟已有的節點名重複。可通過db2 list node ...