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