文章詳情頁(yè)
獲得DB2企業(yè)應(yīng)用程序的最佳性能(1)
瀏覽:7日期:2023-11-10 12:00:40
簡(jiǎn)介當(dāng)要保證用 IBM DB2® Universal Database™(DB2 UDB)和 Borland® 工具(如 Delphi™、C++Builder™ 或 Kylix™)構(gòu)建的企業(yè)應(yīng)用程序擁有最優(yōu)性能時(shí),程序員可以利用 DB2 優(yōu)化器的能力來(lái)處理即使是“難以處理的SQL 語(yǔ)句并給出有效的存取路徑。盡管如此,拙劣編碼的 SQL 和應(yīng)用程序代碼仍可能給您帶來(lái)性能問題,通過學(xué)習(xí)幾條基本準(zhǔn)則可以輕易地避免這些問題。我將向您演示 DB2 優(yōu)化器的工作方式,并提供編寫能發(fā)揮優(yōu)化器最大效率的 SQL 的準(zhǔn)則。但即使擁有了 DB2 的優(yōu)化能力,編寫有效的 SQL 語(yǔ)句仍可能是一件復(fù)雜的事情。假如程序員和開發(fā)人員還不熟悉關(guān)系數(shù)據(jù)庫(kù)環(huán)境,這件事就尤其顯得棘手。因此,在我們深入研究編碼 SQL 以獲得最佳性能的細(xì)節(jié)之前,先花一些時(shí)間往返顧 SQL 基礎(chǔ)知識(shí)。基礎(chǔ)知識(shí)由于 SQL 與過程化語(yǔ)言不同,它提供了更高的抽象級(jí)別,因此它可以讓程序員把精力集中到他們需要 什么樣的數(shù)據(jù),而不是 如何檢索數(shù)據(jù)。您不必使用嵌入式數(shù)據(jù)導(dǎo)航指令來(lái)編碼 SQL。DB2 會(huì)分析 SQL,并“在幕后制定數(shù)據(jù)導(dǎo)航指令。這些數(shù)據(jù)導(dǎo)航指令叫作 存取路徑。讓 DBMS 確定到數(shù)據(jù)的最優(yōu)存取路徑解除了程序員肩上沉重的負(fù)擔(dān)。此外,數(shù)據(jù)庫(kù)可以更好地理解它存儲(chǔ)的數(shù)據(jù)的狀態(tài),從而可以生成到數(shù)據(jù)的更有效和動(dòng)態(tài)的存取路徑。其結(jié)果就是適當(dāng)使用的 SQL 可以用于更快的應(yīng)用程序開發(fā)。另一個(gè) SQL 特性是它不僅僅是一種查詢語(yǔ)言。您還可以使用它來(lái)定義數(shù)據(jù)結(jié)構(gòu);控制對(duì)數(shù)據(jù)的訪問;以及插入、修改和刪除數(shù)據(jù)的發(fā)生。通過提供一種公共語(yǔ)言,SQL 簡(jiǎn)化了 DBA、系統(tǒng)程序員、應(yīng)用程序員、系統(tǒng)分析員和最終用戶之間的通信。當(dāng)項(xiàng)目的所有參與者都使用同一種語(yǔ)言時(shí),他們之間所建立起來(lái)的協(xié)作就可以減少整體系統(tǒng)開發(fā)時(shí)間。 12345678下一頁(yè) 歷史證實(shí),保證 SQL 成功的最重要的一個(gè)特性就是它使用類似英語(yǔ)的語(yǔ)法輕松地檢索數(shù)據(jù)的能力。理解這種語(yǔ)言比理解數(shù)據(jù)頁(yè)面的結(jié)構(gòu)和程序源代碼要輕易得多:SELECT LASTNAMEFROMEMPWHERE EMPNO = '000010';想想看:當(dāng)訪問文件中的數(shù)據(jù)時(shí),程序員必須編碼指令來(lái)打開文件、開始一個(gè)循環(huán)、讀取記錄、檢查 EMPNO 字段是否等于適當(dāng)?shù)闹怠z查文件結(jié)尾、回到循環(huán)的開頭等。SQL 本來(lái)就是非常靈活的。它使用自由格式的結(jié)構(gòu),該結(jié)構(gòu)可以讓用戶開發(fā) SQL 語(yǔ)句來(lái)適合他們的需要。DBMS 在執(zhí)行之前會(huì)分析每個(gè) SQL 請(qǐng)求,以檢查語(yǔ)法是否正確和優(yōu)化該請(qǐng)求。SQL 語(yǔ)句不需要從任何給定的列中開始,您可以將它們串在一行中,或者把它們拆成幾行。例如,以下這條單行的 SQL 語(yǔ)句與我前面使用的三行示例等價(jià):SELECT LASTNAME FROM EMP WHERE EMPNO = '000010';SQL 的另一個(gè)靈活特性是您可以用許多形式不同但功能等價(jià)的方法來(lái)制定一個(gè)請(qǐng)求。例如:SQL 可以連接表或嵌套查詢。您始終可以將嵌套查詢轉(zhuǎn)換成等價(jià)的連接。您可以在大量的函數(shù)和謂詞中看到這一靈活性的其它示例。具有等價(jià)功能的特性的示例包括:BETWEEN vs <= / >=IN vs 一系列和 OR 配合的謂詞INNER JOIN vs FROM 子句中串在一起并用逗號(hào)分隔的表OUTER JOIN vs 帶有 UNION 的簡(jiǎn)單 SELECT 和相關(guān)的子查詢CASE 表達(dá)式 vs 復(fù)雜的 UNION ALL 語(yǔ)句SQL 展示的這一靈活性并不總是稱心的,因?yàn)樾问讲煌δ艿葍r(jià)的 SQL 公式可以提供非常不同的性能。我將在本文的以后部分討論該靈活性所造成的結(jié)果,并提供開發(fā)有效的 SQL 的準(zhǔn)則。如我所說(shuō)的,SQL 指定了要檢索或操作什么數(shù)據(jù),但沒有指定數(shù)據(jù)庫(kù)如何完成這些任務(wù)。這就使 SQL 本身變得很簡(jiǎn)單。假如您能夠記得關(guān)系數(shù)據(jù)庫(kù)的一次處理一個(gè)集合(set-at-a-time)的特點(diǎn),您就開始把握 SQL 的本質(zhì)和性質(zhì)了。一條 SQL 語(yǔ)句可以作用于多行。作用于一組數(shù)據(jù)而不需要建立如何檢索和操作數(shù)據(jù)的能力將 SQL 定義成非過程化語(yǔ)言 上一頁(yè)12345678下一頁(yè) 因?yàn)?SQL 是一種非過程化語(yǔ)言,所以一條語(yǔ)句可以代替一系列過程。同樣,由于 SQL 使用集合級(jí)別的處理以及 DB2 優(yōu)化查詢來(lái)確定數(shù)據(jù)導(dǎo)航邏輯,所以這是可能的。有時(shí),假如不使用 SQL 語(yǔ)句,一條或兩條 SQL 語(yǔ)句可以完成的任務(wù)就需要完整的過程化程序來(lái)完成。優(yōu)化器優(yōu)化器是 DB2 的心臟和靈魂。它分析 SQL 語(yǔ)句并確定可以滿足每條語(yǔ)句的最有效的存取路徑(請(qǐng)參閱圖 1)。DB2 UDB 通過解析 SQL 語(yǔ)句來(lái)確定必須訪問哪些表和列,從而完成該操作。DB2 優(yōu)化器然后查詢存儲(chǔ)在 DB2 系統(tǒng)目錄中的系統(tǒng)信息和統(tǒng)計(jì)信息,以確定完成滿足 SQL 請(qǐng)求所必需的任務(wù)的最佳方法。圖 1. 運(yùn)行中的 DB2 優(yōu)化優(yōu)化器在功能上等價(jià)于一個(gè)專家系統(tǒng)。專家系統(tǒng)是一個(gè)標(biāo)準(zhǔn)規(guī)則集合,當(dāng)與情境數(shù)據(jù)組合時(shí),它返回一個(gè)“專家意見。例如,醫(yī)學(xué)專家系統(tǒng)采用一個(gè)規(guī)則集合,用來(lái)確定哪些藥可以用于哪些疾病,將規(guī)則集與描述疾病癥狀的數(shù)據(jù)組合,并將知識(shí)庫(kù)應(yīng)用于輸入癥狀的列表。DB2 優(yōu)化器會(huì)根據(jù)存儲(chǔ)在 DB2 系統(tǒng)目錄中的情境數(shù)據(jù)和 SQL 格式的查詢輸入來(lái)生成對(duì)數(shù)據(jù)檢索方法的專家意見。在 DBMS 中優(yōu)化數(shù)據(jù)訪問的概念是 DB2 最強(qiáng)大的能力之一。請(qǐng)記住,您訪問 DB2 數(shù)據(jù)時(shí)應(yīng)告訴 DB2 要檢索什么,而不是如何檢索。無(wú)論數(shù)據(jù)實(shí)際上是如何存儲(chǔ)和操作的,DB2 和 SQL 都可以訪問該數(shù)據(jù)。從物理存儲(chǔ)特征中分離出訪問標(biāo)準(zhǔn)叫作物理數(shù)據(jù)獨(dú)立性。DB2 的優(yōu)化器是完成該物理數(shù)據(jù)獨(dú)立性的組件。假如您不要索引,DB2 仍然能夠訪問數(shù)據(jù)(盡管效率會(huì)降低)。假如將一列添加到正在被訪問的表中,DB2 仍然可以在不更改程序代碼的情況下操作數(shù)據(jù)。因?yàn)榈?DB2 數(shù)據(jù)的物理存取路徑并不是由程序員在應(yīng)用程序中編碼的,而是由 DB2 生成的,所以這種情況是完全有可能發(fā)生的。 上一頁(yè)12345678下一頁(yè) 這個(gè)特點(diǎn)與非 DBMS 系統(tǒng)非常不同,在那種系統(tǒng)中,程序員必須知道數(shù)據(jù)的物理結(jié)構(gòu)。假如有索引,程序員就必須編寫適當(dāng)?shù)拇a來(lái)使用該索引。假如某人刪除了索引,程序就不能工作,除非程序員進(jìn)行更改。而使用 DB2 和 SQL 就不必如此。這一靈活性完全歸功于 DB2 自動(dòng)優(yōu)化數(shù)據(jù)操作請(qǐng)求的能力。優(yōu)化器根據(jù)許多信息執(zhí)行復(fù)雜的計(jì)算。要使優(yōu)化器的工作方式直觀化,可以將優(yōu)化器想象成執(zhí)行一個(gè)四步驟的過程:接收并驗(yàn)證 SQL 語(yǔ)句的語(yǔ)法。分析環(huán)境并優(yōu)化滿足 SQL 語(yǔ)句的方法。創(chuàng)建計(jì)算機(jī)可讀指令來(lái)執(zhí)行優(yōu)化的 SQL。執(zhí)行指令或存儲(chǔ)它們以便將來(lái)執(zhí)行。這個(gè)過程的第二步是最有趣的。優(yōu)化器怎樣決定如何以它的方式執(zhí)行您可以發(fā)送的大量 SQL 語(yǔ)句??jī)?yōu)化器有許多類型的優(yōu)化 SQL 的策略。它如何選擇在優(yōu)化存取路徑中使用這些策略中的哪一個(gè)?IBM 并沒有發(fā)布優(yōu)化器如何確定最佳存取路徑的真正和深入的具體信息,但優(yōu)化器是一個(gè) 基于成本的優(yōu)化器。這意味著優(yōu)化器將始終嘗試為每個(gè)查詢制定減少總體成本的存取路徑。要實(shí)現(xiàn)這個(gè)目標(biāo),DB2 優(yōu)化器會(huì)應(yīng)用查詢成本公式,該公式對(duì)每條可能的存取路徑的四個(gè)因素進(jìn)行評(píng)估和權(quán)衡:CPU 成本、I/O 成本、DB2 系統(tǒng)目錄中的統(tǒng)計(jì)信息和實(shí)際的 SQL 語(yǔ)句。性能準(zhǔn)則因此,只要記住關(guān)于 DB2 優(yōu)化器的信息,您就可以實(shí)現(xiàn)這些準(zhǔn)則以便獲得更好的 SQL 性能:1) 使 DB2 統(tǒng)計(jì)信息保持最新 :假如沒有存儲(chǔ)在 DB2 系統(tǒng)目錄中的統(tǒng)計(jì)信息,優(yōu)化器在優(yōu)化任何事物時(shí)都會(huì)碰到困難。這些統(tǒng)計(jì)信息向優(yōu)化器提供了與正在被優(yōu)化的 SQL 語(yǔ)句將要訪問的表狀態(tài)相關(guān)的信息。存儲(chǔ)在系統(tǒng)目錄中的統(tǒng)計(jì)信息的類型包括:關(guān)于 表的信息,包括總的行數(shù)、關(guān)于壓縮的信息和總頁(yè)數(shù); 上一頁(yè)12345678下一頁(yè) 關(guān)于 列的信息,包括列的離散值的數(shù)量和存儲(chǔ)在列中的值的分布范圍;關(guān)于 表空間的信息,包括活動(dòng)頁(yè)面的數(shù)量;索引的當(dāng)前狀態(tài),包括是否存在索引、索引的組織(葉子頁(yè)的數(shù)量和級(jí)別的數(shù)量)、索引鍵的離散值的數(shù)量以及是否群集索引;關(guān)于表空間和索引節(jié)點(diǎn)組或分區(qū)的信息。當(dāng)執(zhí)行 RUNSTATS 或 RUN STATISTICS 實(shí)用程序時(shí),統(tǒng)計(jì)信息就會(huì)填充 DB2 系統(tǒng)目錄。您可以從控制中心(Control Center)、批處理作業(yè)或通過使用命令行處理器來(lái)調(diào)用該實(shí)用程序。一定要與您的 DBA 一起工作以確保在適當(dāng)?shù)臅r(shí)候積累統(tǒng)計(jì)信息,尤其是在生產(chǎn)環(huán)境中。2) 構(gòu)建適當(dāng)?shù)乃饕?:也許您為保證最佳 DB2 應(yīng)用程序性能而可以做的最重要的事就是根據(jù)應(yīng)用程序使用的查詢?yōu)槟谋韯?chuàng)建正確的索引。當(dāng)然,說(shuō)總比做更輕易。但我們可以從一些基礎(chǔ)開始。例如,考慮以下這條 SQL 語(yǔ)句:SELECT LASTNAME,SALARY FROM EMP WHERE EMPNO = '000010' AND DEPTNO = 'D01'什么索引會(huì)對(duì)這個(gè)簡(jiǎn)單查詢有作用?首先,考慮您可以創(chuàng)建的所有可能的索引。您的第一個(gè)簡(jiǎn)短列表可能看起來(lái)如下:EMPNO 上的 Index1DEPTNO 上的 Index2EMPNO 和 DEPTNO 上的 Index3這是一個(gè)好的開始,Index3 可能是最好的。它讓 DB2 使用索引來(lái)立即查找滿足 WHERE 子句中的兩個(gè)簡(jiǎn)單謂詞的行。當(dāng)然,假如您已經(jīng)有許多關(guān)于 EMP 表的索引,您也許應(yīng)該檢查再創(chuàng)建另一個(gè)關(guān)于表的索引所帶來(lái)的影響。要考慮的因素包括:修改影響 :DB2 將自動(dòng)維護(hù)您創(chuàng)建的每個(gè)索引。這表示對(duì)該表的每個(gè) INSERT 和每個(gè) DELETE 都將不僅在表中插入和刪除,而且會(huì)在其索引中插入和刪除。假如您對(duì)在索引中的列的值進(jìn)行 UPDATE 操作,那么您還更新了該索引。因此索引加快了檢索過程的速度,但減慢了修改的速度。 上一頁(yè)12345678下一頁(yè) 現(xiàn)有索引中的列 :假如在 EMPNO 或 DEPTNO 上已經(jīng)有了一個(gè)索引,那么創(chuàng)建另一個(gè)關(guān)于該組合的索引也許并不明智。但是,更改另一個(gè)索引以添加缺少的列也許可以起作用。但也不一定,因?yàn)樗饕辛械捻樞蛞苍S會(huì)根據(jù)查詢而有很大差異。例如,考慮以下查詢:SELECT LASTNAME, SALARYFROM EMPWHERE EMPNO ='000010'AND DEPTNO > 'D01';在這種情況下,在索引中應(yīng)該首先列出 EMPNO。然后列出 DEPTNO,從而答應(yīng) DB2 對(duì)第一列(EMPNO)執(zhí)行直接索引查找,然后針對(duì)大于號(hào)掃描第二列(DEPTNO)。而且,假如已經(jīng)存在關(guān)于這兩列的索引(一個(gè)關(guān)于 EMPNO,一個(gè)關(guān)于 DEPTNO),DB2 可以使用它們來(lái)滿足該查詢,因此創(chuàng)建另一個(gè)索引也許是沒有必要的。這種特定查詢的重要性 :查詢?cè)街匾敲茨赡芫驮綉?yīng)該通過創(chuàng)建索引來(lái)進(jìn)行調(diào)優(yōu)。假如您正在編碼 CIO 要天天都運(yùn)行的查詢,那么您應(yīng)該確保它提供最佳性能。因此,為該特定查詢構(gòu)建索引是很重要的。反之,職員的查詢也許就沒有必要看得那么重,所以也許應(yīng)該利用現(xiàn)有索引來(lái)執(zhí)行查詢。當(dāng)然,決定取決于應(yīng)用程序?qū)I(yè)務(wù)的重要性 - 而不只是用戶的重要性。索引設(shè)計(jì)涉及的內(nèi)容比到目前為止我所討論的要多得多。例如,您也許要考慮索引重載以實(shí)現(xiàn)僅索引訪問(index-only access)。假如 SQL 查詢要尋找的所有數(shù)據(jù)都包含在索引中,那么 DB2 也許只使用索引就可以滿足該請(qǐng)求。請(qǐng)考慮我們前面的 SQL 語(yǔ)句。給定了關(guān)于 EMPNO 和 DEPTNO 的信息,我們要尋找 LASTNAME 和 SALARY。我們還從創(chuàng)建關(guān)于 EMPNO 和 DEPTNO 列的索引開始。假如我們?cè)谒饕羞€包含了 LASTNAME 和 SALARY,我們就不再需要訪問 EMP 表,因?yàn)槲覀冃枰乃袛?shù)據(jù)都已經(jīng)在索引中。該技術(shù)可以大大提高性能,因?yàn)樗鼫p少了 I/O 請(qǐng)求的數(shù)量。 上一頁(yè)12345678下一頁(yè) 請(qǐng)記住:使每個(gè)查詢成為僅索引訪問是不謹(jǐn)慎,甚至也是不可能的。您應(yīng)該謹(jǐn)慎使用該技術(shù)以便用于非凡棘手或重要的 SQL 語(yǔ)句。SQL 編碼準(zhǔn)則當(dāng)您編寫訪問 DB2 數(shù)據(jù)的 SQL 語(yǔ)句時(shí),要確保遵循以下三個(gè)編碼 SQL 的準(zhǔn)則以獲得最佳性能。當(dāng)然,SQL 性能是一個(gè)復(fù)雜的話題,而且了解 SQL 的執(zhí)行方式的每一個(gè)細(xì)微差別可能要花一生的時(shí)間。但是,這些簡(jiǎn)單的規(guī)則可以使您進(jìn)入開發(fā)高性能 DB2 應(yīng)用程序的正軌。第一條規(guī)則是始終在每條 SQL SELECT 語(yǔ)句的 SELECT 列表中只提供 確實(shí)需要檢索的那些列 。另一種說(shuō)法就是“不要使用 SELECT *。簡(jiǎn)寫 SELECT * 表示您要檢索正在被訪問的表中的所有列。這適用于“快捷但不恰當(dāng)?shù)姆绞将@得的“(quick and dirty)查詢,但卻是應(yīng)用程序的壞實(shí)踐,因?yàn)椋篋B2 表在將來(lái)可能需要更改,以包括附加列。SELECT * 也會(huì)檢索那些新的列,而假如沒有進(jìn)行費(fèi)時(shí)的更改,您的程序也許無(wú)法處理附加的數(shù)據(jù)。DB2 將為被請(qǐng)求返回的每一列消耗附加資源。假如程序不需要數(shù)據(jù),它就不會(huì)尋找它。即使程序需要每一列,最好根據(jù) SQL 語(yǔ)句中的名稱來(lái)顯式地尋找每一列,以便增加清楚度和避免以前犯的錯(cuò)誤。不要尋找您已經(jīng)知道的東西 。這聽起來(lái)似乎顯而易見,但大多數(shù)程序員都曾經(jīng)違反過這條規(guī)則。舉一個(gè)典型的示例,考慮以下 SQL 語(yǔ)句有什么錯(cuò)誤:SELECT EMPNO, LASTNAME, SALARYFROM EMPWHEREEMPNO = '000010';放棄嗎?問題是 EMPNO 已經(jīng)包含在 SELECT 列表中。您已經(jīng)知道了 EMPNO 將等于值“000010,因?yàn)槟蔷褪?WHERE 子句要 DB2 做的事。但在 WHERE 子句中列出了 EMPNO,DB2 還會(huì)盡職地檢索該列。這會(huì)產(chǎn)生附加開銷,從而降低性能。 上一頁(yè)12345678下一頁(yè) 在 SQL 中 使用 WHERE 子句過濾數(shù)據(jù) ,而不是在程序中到處使用它進(jìn)行過濾。這也是新手輕易犯的錯(cuò)誤。在 DB2 將數(shù)據(jù)返回到程序之前,最好由 DB2 過濾數(shù)據(jù)。這是因?yàn)?DB2 使用附加 I/O 和 CPU 資源來(lái)獲取每一行數(shù)據(jù)。傳遞到程序的行越少,SQL 的效率就越高:SELECT EMPNO, LASTNAME, SALARYFROMEMPWHERE SALARY > 50000.00;與只讀取所有數(shù)據(jù)而不使用 WHERE 子句,然后在程序中檢查 SALARY 是否大于 50000.00 的做法相比,該 SQL 更好。使用參數(shù)化查詢 。參數(shù)化 SQL 語(yǔ)句包含了變量,也稱作參數(shù)(或參數(shù)標(biāo)記)。典型的參數(shù)化查詢使用這些參數(shù)來(lái)代替文字值,因此 WHERE 子句條件可以在運(yùn)行時(shí)更改。通常程序被設(shè)計(jì)成最終用戶可以在運(yùn)行查詢之前提供參數(shù)的值。這答應(yīng)使用一個(gè)查詢根據(jù)提供給參數(shù)的不同的值返回不同的結(jié)果。參數(shù)化查詢的主要性能好處是優(yōu)化器可以制定在重復(fù)執(zhí)行語(yǔ)句時(shí)能夠再使用的存取路徑。與每次 WHERE 子句中需要一個(gè)新值就發(fā)出一條全新的 SQL 語(yǔ)句相比,這可以給程序增加很大的性能收益。但是,這些規(guī)則并不是 SQL 性能調(diào)優(yōu)的最終和最高目標(biāo) - 決不是。您可能需要附加的、深入的調(diào)優(yōu)。但遵循前面的規(guī)則將確保您不會(huì)犯降低應(yīng)用程序性能的“新手錯(cuò)誤。特定數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)技巧無(wú)論您使用的是 Delphi、C++Builder 還是 Kylix,某些技巧和準(zhǔn)則將幫助您確保在訪問 DB2 數(shù)據(jù)時(shí)獲得好的性能。例如,在某些情況下,使用 dbExpress TM來(lái)代替 ODBC/JDBC 或 ADO 可以提高查詢性能。dbExpress 是用于從 Delphi(或 Borland Kylix™)處理動(dòng)態(tài) SQL 的跨平臺(tái)接口。要確保在您的應(yīng)用程序中經(jīng)常發(fā)出 COMMIT 語(yǔ)句。COMMIT 語(yǔ)句控制工作單元。發(fā)出 COMMIT 會(huì)將自上一個(gè) COMMIT 語(yǔ)句之后的所有工作“永遠(yuǎn)記錄到數(shù)據(jù)庫(kù)中。在發(fā)出 COMMIT 之前,可以使用 ROLLBACK 語(yǔ)句回滾工作。當(dāng)修改數(shù)據(jù)(使用 INSERT、UPDATE 和 DELETE)但沒有發(fā)出 COMMIT 時(shí),DB2 將在數(shù)據(jù)上加一把鎖并保持該鎖 - 這把鎖會(huì)使其它應(yīng)用程序在等待檢索被鎖住的數(shù)據(jù)時(shí)超時(shí)。通過在工作完成時(shí)發(fā)出 COMMIT 語(yǔ)句,并且確保數(shù)據(jù)是正確的,就釋放了該數(shù)據(jù)以供其它應(yīng)用程序使用。另外,構(gòu)建應(yīng)用程序時(shí)要考慮使用情況。例如,當(dāng)某個(gè)特定查詢返回幾千行給最終用戶時(shí),要慎重處理。對(duì)于在程序和最終用戶之間的在線交互,很少會(huì)用到幾百行以上的數(shù)據(jù)。您可以在 SQL 語(yǔ)句上使用 FETCH FIRST nROWS ONLY 子句來(lái)限制返回到查詢的數(shù)據(jù)量。例如,考慮以下查詢:SELECT EMPNO, LASTNAME, SALARYFROM EMPWHERE SALARY >10000.00FETCH FIRST 200 ROWS ONLY;該查詢將只返回 200 行。假如有超過 200 行符合條件也沒有關(guān)系;假如您嘗試從查詢中 FETCH(訪存)超過 200 行,DB2 將用 +100 SQLCODE 表明數(shù)據(jù)結(jié)束。當(dāng)您想要限制返回給程序的數(shù)據(jù)量時(shí),這種方法很有用。DB2 支持另一個(gè)名為 OPTIMIZE FOR nROWS 的子句,該子句不限制要返回給游標(biāo)的行數(shù),但從性能角度看可能是有幫助的。使用 OPTIMIZE FOR nROWS 子句告訴 DB2 如何處理 SQL 語(yǔ)句。例如:SELECT EMPNO,LASTNAME,SALARYFROM EMPWHERE SALARY >10000.00OPTIMIZE FOR 20 ROWS;這告訴 DB2 嘗試盡快訪存前 20 行。假如您的 Delphi 應(yīng)用程序在顯示從數(shù)據(jù)庫(kù)檢索出來(lái)的數(shù)據(jù)行時(shí)每次顯示 20 行,那么這將非常有用。對(duì)于只讀游標(biāo),使用 FOR READ ONLY 子句確保游標(biāo)無(wú)歧義。Delphi 不能在 DB2 游標(biāo)中執(zhí)行位置更新,因此將 FOR READ ONLY 附加到每條 SELECT 語(yǔ)句后面可以使游標(biāo)成為無(wú)歧義的只讀游標(biāo),從而對(duì) DB2 有所幫助。例如:SELECT EMPNO,LASTNAME, SALARYFROM EMPWHERE SALARY > 10000.00FOR READ ONLY; 上一頁(yè)12345678
標(biāo)簽:
DB2
數(shù)據(jù)庫(kù)
排行榜
