此文章主要講述的是最大限度地利用DB2 SQL編碼以獲得最佳性能的實際操作步驟,在實際操作中當要保證用 IBM DB2® Universal Database™(DB2 UDB)與 Borland® 工具(如 Delphi™、C++Builder™ 或 Kylix™)構建的企業應用程序擁有最優性能時。
程序員可以利用 DB2 優化器的能力來處理即使是“難以處理的”SQL 語句並給出有效的存取路徑。盡管如此,拙劣編碼的 SQL 和應用程序代碼仍可能給您帶來性能問題,通過學習幾條基本准則可以輕易地避免這些問題。‘
我將向您演示 DB2 優化器的工作方式,並提供編寫能發揮優化器最大效率的 SQL 的准則。但即使擁有了 DB2 的優化能力,編寫有效的 SQL 語句仍可能是一件復雜的事情。如果程序員和開發人員還不熟悉關DB2數據庫環境,這件事就尤其顯得棘手。因此,在我們深入研究編碼 SQL 以獲得最佳性能的細節之前,先花一些時間來回顧 SQL 基礎知識。
基礎知識
由於 SQL 與過程化語言不同,它提供了更高的抽象級別,因此它可以讓程序員把精力集中到他們需要 什麼樣的數據,而不是 如何檢索數據。您不必使用嵌入式數據導航指令來編碼 SQL。DB2 會分析 SQL,並“在幕後”制定數據導航指令。這些數據導航指令叫作 存取路徑。
讓 DBMS 確定到數據的最優存取路徑解除了程序員肩上沉重的負擔。此外,DB2數據庫可以更好地理解它存儲的數據的狀態,從而可以生成到數據的更有效和動態的存取路徑。其結果就是適當使用的 SQL 可以用於更快的應用程序開發。
另一個 SQL 特性是它不僅僅是一種查詢語言。您還可以使用它來定義數據結構;控制對數據的訪問;以及插入、修改和刪除數據的發生。通過提供一種公共語言,SQL 簡化了 DBA、系統程序員、應用程序員、系統分析員和最終用戶之間的通信。當項目的所有參與者都使用同一種語言時,他們之間所建立起來的協作就可以減少整體系統開發時間。
歷史證明,保證 SQL 成功的最重要的一個特性就是它使用類似英語的語法輕松地檢索數據的能力。理解這種語言比理解數據頁面的結構和程序源代碼要容易得多:
- SELECT LASTNAME
- FROM EMP
- WHERE EMPNO = '000010';
想想看:當訪問文件中的數據時,程序員必須編碼指令來打開文件、開始一個循環、讀取記錄、檢查 EMPNO 字段是否等於適當的值、檢查文件結尾、回到循環的開頭等。
SQL 本來就是非常靈活的。它使用自由格式的結構,該結構可以讓用戶開發 SQL 語句來適合他們的需要。DBMS 在執行之前會分析每個 SQL 請求,以檢查語法是否正確和優化該請求。SQL 語句不需要從任何給定的列中開始,您可以將它們串在一行中,或者把它們拆成幾行。例如,以下這條單行的 SQL 語句與我前面使用的三行示例等價:
- SELECT LASTNAME FROM EMP WHERE EMPNO = '000010';
SQL 的另一個靈活特性是您可以用許多形式不同但功能等價的方法來制定一個請求。例如:SQL 可以連接表或嵌套查詢。您始終可以將嵌套查詢轉換成等價的連接。您可以在大量的函數和謂詞中看到這一靈活性的其它示例。具有等價功能的特性的示例包括:
- BETWEEN vs <= / >=
IN vs 一系列和 OR 配合的謂詞
INNER JOIN vs FROM 子句中串在一起並用逗號分隔的表
OUTER JOIN vs 帶有 UNION 的簡單 SELECT 和相關的子查詢
CASE 表達式 vs 復雜的 UNION ALL 語句
SQL 展示的這一靈活性並不總是稱心的,因為形式不同但功能等價的 SQL 公式可以提供非常不同的性能。我將在本文的以後部分討論該靈活性所造成的結果,並提供開發有效的 SQL 的准則。
如我所說的,SQL 指定了要檢索或操作什麼數據,但沒有指定DB2數據庫如何完成這些任務。這就使 SQL 本身變得很簡單。如果您能夠記得關系數據庫的一次處理一個集合(set-at-a-time)的特點,您就開始掌握 SQL 的本質和性質了。一條 SQL 語句可以作用於多行。作用於一組數據而不需要建立如何檢索和操作數據的能力將 SQL 定義成非過程化語言
因為 SQL 是一種非過程化語言,所以一條語句可以代替一系列過程。同樣,由於 SQL 使用集合級別的處理以及 DB2 優化查詢來確定數據導航邏輯,所以這是可能的。有時,如果不使用 SQL 語句,一條或兩條 SQL 語句可以完成的任務就需要完整的過程化程序來完成。