簡介
當要保證用 IBM DB2® Universal Database™(DB2 UDB)和 Borland® 工具(如 Delphi™、C++Builder™ 或 Kylix™)構建的公司專屬應用程式程式擁有最優效能時,程式員可以利用 DB2 最佳化器的能力來處理即使是“難以處理的”SQL 陳述式並給出有效存取路徑。儘管如此,拙劣編碼的 SQL 和應用程式代碼仍可能給您帶來效能問題,通過學習幾條基本準則可以輕易地避免這些問題。我將向您示範 DB2 最佳化器的工作方式,並提供編寫能發揮最佳化器最大效率的 SQL 的準則。但即使擁有了 DB2 的最佳化能力,編寫有效 SQL 陳述式仍可能是一件複雜的事情。如果程式員和開發人員還不熟悉關聯式資料庫環境,這件事就尤其顯得棘手。因此,在我們深入研究編碼 SQL 以獲得最佳效能的細節之前,先花一些時間來回顧 SQL 基礎知識。
基礎知識
由於 SQL 與過程化語言不同,它提供了更高的抽象層級,因此它可以讓程式員把精力集中到他們需要 什麼樣的資料,而不是 如何檢索資料。您不必使用嵌入式資料導航指令來編碼 SQL。DB2 會分析 SQL,並“在幕後”制定資料導航指令。這些資料導航指令叫作 存取路徑。讓 DBMS 確定到資料的最優存取路徑解除了程式員肩上沉重的負擔。此外,資料庫可以更好地理解它儲存的資料的狀態,從而可以產生到資料的更有效和動態存取路徑。其結果就是適當使用的 SQL 可以用於更快的應用程式開發。
另一個 SQL 特性是它不僅僅是一種查詢語言。您還可以使用它來定義資料結構;控制對資料的訪問;以及插入、修改和刪除資料的發生。通過提供一種公用語言,SQL 簡化了 DBA、系統程式員、應用程式員、系統分析員和終端使用者之間的通訊。當項目的所有參與者都使用同一種語言時,他們之間所建立起來的協作就可以減少整體系統開發時間。
曆史證明,保證 SQL 成功的最重要的一個特性就是它使用類似英語的文法輕鬆地檢索資料的能力。理解這種語言比理解資料頁面的結構和程式原始碼要容易得多:
SELECT LASTNAMEFROM EMPWHERE 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 的準則。