成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL過程的性能:提示和技巧

數據庫
有關如何調優數據庫系統和應用程序的可用建議來源有很多。諸如 OLTP 應用程序的 DB2 調優技巧之類的文章通過使用事務和數據并行性以及分析查詢方案,給出了從表空間和索引設計到緩沖池的內存分配等方面的建議。

SQL過程的性能是大家使用數據庫必須要掌握的,可見SQL過程的性能是數據庫中比較重要的知識點,下文中將為大家帶來SQL過程的性能,提示技巧,希望對大家能夠有所幫助。

但是,有關如何組織存儲過程自身中的邏輯并著眼于其性能的專門建議卻并不多見。本文就提供了這樣一種建議。盡管本文著重于介紹 SQL 過程,但是這里所提供的大多數信息同樣適用于用其它語言編寫的在應用程序中或存儲過程中嵌入的 SQL 邏輯。

背景知識和術語

在深入研究詳細問題之前,讓我們先回顧 DB2 中有關過程化 SQL 的一些基本術語和概念。過程化 SQL 構造(例如標量變量、IF 語句和 WHILE 循環)是在 DB2 Universal Database™ (UDB) V7 發行版中引入 DB2 的。以前的 DB2 發行版支持 C 和 Java™ 作為存儲過程的語言。V7 引入了 SQL 存儲過程,以及其它許多可以促進 OLTP 應用程序開發的特性(例如臨時表、應用程序保存點和標識列)。

當創建 SQL 過程時,DB2 將過程主體中的 SQL 查詢與過程邏輯區分開來。為了使性能最優,SQL 查詢被靜態地編譯成包中的節。(對于靜態編譯的查詢而言,節主要是由 DB2 優化器為該查詢選擇的存取方案構成的。包是節的集合。有關包和節的更多信息,請參閱 DB2 SQL 參考大全,第 1 卷。)另一方面,過程邏輯被編譯成 DLL(動態鏈接庫)。

在過程的執行期間,每當控制從過程邏輯流向 SQL 語句時,在 DLL 和 DB2 引擎之間就存在“上下文切換”。(在 DB2 V8 中,SQL 過程是在“不受保護的方式”下運行的,即與 DB2 引擎在相同的尋址空間中。因此我們這里談及的上下文切換并不是操作系統級別上的完全的上下文切換,而是指 DB2 中層的更換。)減少頻繁調用的過程(例如 OLTP 應用程序中的過程)或者處理大量行的過程(例如執行數據清理的過程)中的上下文切換次數,對它們的性能有顯著的影響。本文中的幾個技巧恰好旨在減少這些上下文切換。

剛開始的時候(DB2 通用數據庫 V7 GA),只允許在 SQL 過程中使用 SQL 過程語言(通常稱為 SQL PL)。后來(在 DB2 UDB V7.2 中),在 SQL 函數和觸發器主體中開始支持該語言的子集。SQL PL 的這個子集即所謂的 內聯(inline)SQL PL。“內聯”一詞突出顯示了它與完整語言的重要區別。SQL PL 過程是通過將其單獨的 SQL 查詢靜態地編譯成包中的節實現的,而內聯 SQL PL 函數就象其名稱所展示的,是通過將函數主體內聯到使用它的查詢中實現的。稍后我們將再看一下內聯 SQL PL 及其用法的一些示例。

現在,讓我們研究在使用 SQL 過程語言時可用來提高性能的一些具體工作。

在只使用一條語句即可做到時避免使用多條語句

讓我們從一個簡單的編碼技巧開始。

如下所示的單個 INSERT 行序列:

INSERT INTO tab_comp VALUES (item1, price1, qty1);

INSERT INTO tab_comp VALUES (item2, price2, qty2);

 

INSERT INTO tab_comp VALUES (item3, price3, qty3);

 

可以改寫成:

INSERT INTO tab_comp VALUES  (item1, price1, qty1),

(item2, price2, qty2),

 

(item3, price3, qty3);

 

執行這個多行 INSERT 語句所需時間大約是執行原來三條語句的三分之一。孤立地看,這一改進看起來似乎是微乎其微的,但是,如果這一代碼段是重復執行的(例如該代碼段位于循環體或觸發器體中),那么改進是非常顯著的。

類似地,如下所示的 SET 語句序列:

SET A = expr1;

SET B = expr2;

 

SET C = expr3;

 

可以寫成一條 VALUES 語句:

VALUES expr1, expr2, expr3 INTO A, B, C;

如果任何兩條語句之間都沒有相關性,那么這一轉換保留了原始序列的語義。為了說明這一點,請考慮:

SET A = monthly_avg * 12;

SET B = (A / 2) * correction_factor;

 

將上面兩條語句轉換成:

VALUES (monthly_avg * 12, (A / 2) * correction_factor) INTO A, B;

不會保留原始的語義,因為是以“并行”方式對 INTO 關鍵字之前的表達式進行求值的。這意味著賦給 B 的值并不以賦給 A 的值為基礎,這是原始語句預期的語義。

從多個 SQL 語句到一個 SQL 表達式

跟其它編程語言一樣,SQL 語言提供了兩類條件構造:過程型(IF 和 CASE 語句)和函數型(CASE 表達式)。在大多數環境中,可使用任何一種構造來表達計算,到底使用哪一種只是喜好問題。但是,使用 CASE 表達式編寫的邏輯不但比使用 CASE 或 IF 語句編寫的邏輯更緊湊,而且更有效。

請考慮下面的 SQL PL 代碼片段:

IF (Price <= MaxPrice) THEN

INSERT INTO tab_comp(Id, Val) VALUES(Oid, Price);

 

ELSE

 

INSERT INTO tab_comp(Id, Val) VALUES(Oid, MaxPrice);

 

END IF;

 

IF 子句中的條件僅用于決定將什么值插入 tab_comp.Val 列中。為了避免過程層和數據流層之間的上下文切換,可利用 CASE 表達式將相同的邏輯表示成一個 INSERT 語句:

INSERT INTO tab_comp(Id, Val)

VALUES(Oid,

 

CASE

 

WHEN (Price <= MaxPrice) THEN Price

 

ELSE MaxPrice

 

END);

 

值得注意的是,CASE 表達式可在任何希望有標量值的上下文中使用。特別地,可在賦值符號的右邊使用它們。例如:

IF (Name IS NOT NULL) THEN

SET ProdName = Name;

 

ELSEIF (NameStr IS NOT NULL) THEN

 

SET ProdName = NameStr;

 

ELSE

 

SET ProdName = DefaultName;

 

END IF;

 

可以改寫成:

SET ProdName = (CASE

WHEN (Name IS NOT NULL) THEN Name

 

WHEN (NameStr IS NOT NULL) THEN NameStr

 

ELSE DefaultName

 

END);

 

實際上,這個特殊的示例有一個更好的解決方案:

SET ProdName = COALESCE(Name, NameStr, DefaultName);

到這里關于SQL過程的性能提示和技巧的知識就為大家講解完了,相信大家通過上文的學習,現在對 SQL過程的性能有所了解,希望大家都能夠從文中有所收獲。

 

責任編輯:迎迎 來源: 電腦初學網
相關推薦

2021-10-14 07:55:17

提示技巧C#

2016-11-25 14:03:03

Python

2016-11-28 09:02:23

Python內存技巧

2013-04-16 14:42:47

增強iOS應用程序性能

2013-04-16 14:56:54

增強iOS應用程序性能

2013-04-16 13:51:23

增強iOS應用程序性能

2020-05-15 10:26:36

終端macOSHomeBrew

2010-09-25 16:00:38

sql存儲過程

2011-09-02 14:05:25

SQL Server性能調優

2010-07-06 14:55:33

SQL Server磁

2024-01-02 18:01:12

SQLSELECT查詢

2016-10-21 16:05:44

SQLSQL SERVER技巧

2011-11-24 21:05:44

ibmdw

2023-03-30 14:10:30

2024-09-26 08:36:11

JavaScript性能優化

2023-09-25 13:15:50

SQL數據庫

2011-03-31 10:38:28

SQL Server編寫優化

2019-08-21 10:53:29

.NET性能優化

2009-03-10 09:08:06

DB2存儲過程實施

2010-09-07 11:41:24

SQL語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产农村一级片 | 欧美三级在线 | 国产成人精品久久 | 国产精品成人一区二区三区夜夜夜 | 国产成人自拍一区 | 在线观看国产视频 | 最新日韩在线 | 色又黄又爽网站www久久 | 亚洲国产一区在线 | 日韩黄色av | 婷婷综合激情 | 91.色| 奇色影视| 欧美一级免费黄色片 | 一区二区三区四区不卡视频 | 欧美综合久久 | 成人av影院| 一区二区三区视频在线 | 国产欧美一区二区精品久导航 | 奇米影视首页 | 一区二区三区在线播放视频 | 欧美一区二区三区在线播放 | 久草免费在线视频 | 视频一区 亚洲 | 欧美在线色 | 亚洲精色 | 综合婷婷 | 久久久精| 日日夜夜免费精品视频 | 一级毛毛片 | 日本三级全黄三级a | 日韩免费网站 | 狠狠的干狠狠的操 | 亚洲国产高清高潮精品美女 | av中文在线观看 | 97精品国产一区二区三区 | 亚洲精品视频在线观看视频 | 国产视频精品免费 | 日韩毛片 | 蜜桃传媒av | 亚洲在线|