黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Oracle SQL 性能優(yōu)化技巧

系統(tǒng) 2510 0

1. 用適合的 ORACLE 優(yōu) 化器
???? ORACLE
優(yōu) 化器共有 3

???? A RULE ( 基于 規(guī)則 ) b COST ( 基于成本 ) c CHOOSE ( 選擇 )

???? 設(shè) 置缺省的 優(yōu) 化器,可以通 過(guò)對(duì) init.ora 文件中 OPTIMIZER_MODE 參數(shù)的各 聲明,如 RULE COST CHOOSE ALL_ROWS FIRST_ROWS 你當(dāng)然也在 SQL 級(jí) 或是會(huì) (session) 級(jí)對(duì) 進(jìn) 行覆蓋。

???? 了使用基于成本的 優(yōu) 化器 (CBO Cost-Based Optimizer) 你必 須經(jīng) 常運(yùn)行 analyze 命令,以增加數(shù)據(jù) 庫(kù) 中的 對(duì) 統(tǒng)計(jì) 信息 (object statistics) 的準(zhǔn)確性。

???? 如果數(shù)據(jù) 庫(kù) 優(yōu) 化器模式 設(shè) 為選擇 (CHOOSE) ,那 么實(shí)際 優(yōu) 化器模式將和是否運(yùn)行 過(guò) analyze 命令有 關(guān) 如果 table 經(jīng) analyze 過(guò) 優(yōu) 化器模式將自 動(dòng) CBO 反之,數(shù)據(jù) 庫(kù) 將采用 RULE 形式的 優(yōu) 化器。

在缺省情況下, ORACLE 采用 CHOOSE 優(yōu) 化器, 了避免那些不必要的全表 (full table scan) 你必 盡量避免使用 CHOOSE 優(yōu) 化器,而直接采用基于 規(guī)則 或者基于成本的 優(yōu) 化器。


2.
訪問(wèn) Table 的方式
???? ORACLE
采用兩 種訪問(wèn) 表中 記錄 的方式:

???? A 全表

????????? 全表 描就是 序地 訪問(wèn) 表中 記錄 ORACLE 采用一次 入多個(gè)數(shù)據(jù) (database block) 的方式 優(yōu) 化全表 描。

???? B 過(guò) ROWID 訪問(wèn)

????????? 你可以采用基于 ROWID 訪問(wèn) 方式情況,提高 訪問(wèn) 表的效率, ROWID 包含了表中 記錄 的物理位置信息。 ORACLE 采用索引 (INDEX) 實(shí)現(xiàn) 了數(shù)據(jù)和存放數(shù)據(jù)的物理位置 (ROWID) 聯(lián) 系。通常索引提供了快速 訪問(wèn) ROWID 的方法,因此那些基于索引列的 查詢 就可以得到性 能上的提高。


3.
共享 SQL 語(yǔ)
????
了不重 復(fù) 解析相同的 SQL 語(yǔ) 句,在第一次解析之后, ORACLE SQL 語(yǔ) 句存放在內(nèi)存中。 這塊 位于系 統(tǒng) 全局區(qū)域 SGA(system global area) 的共享池 (shared buffer pool) 中的內(nèi)存可以被所有的數(shù)據(jù) 庫(kù) 共享。 因此,當(dāng)你 執(zhí) 行一個(gè) SQL 語(yǔ) ( 時(shí) 被稱 一個(gè)游 標(biāo) ) 時(shí) ,如果它和之前的 執(zhí) 過(guò) 語(yǔ) 句完全相同, ORACLE 就能很快 得已 經(jīng) 被解析的 語(yǔ) 句以及最好的 執(zhí) 行路徑。 ORACLE 個(gè)功能大大地提高了 SQL 執(zhí) 行性能并 節(jié) 省了內(nèi)存的使用。

???? 可惜的是 ORACLE 對(duì)簡(jiǎn)單 的表提供高速 (cache buffering) 個(gè)功能并不適用于多表 查詢

???? 數(shù)據(jù) 庫(kù) 管理 init.ora 為這 個(gè)區(qū)域 設(shè) 置合適的參數(shù),當(dāng) 個(gè)內(nèi)存區(qū)域越大,就可以保留更多的 語(yǔ) 句,當(dāng)然被共享的可能性也就越大了。

???? 當(dāng)你向 ORACLE 提交一個(gè) SQL 語(yǔ) 句, ORACLE 會(huì)首先在 這塊 內(nèi)存中 找相同的 語(yǔ) 句。 里需要注明的是, ORACLE 對(duì) 兩者采取的是一 種嚴(yán) 格匹配,要達(dá)成共享, SQL 語(yǔ) 句必 完全相同 ( 包括空格, 行等 )

???? 數(shù)據(jù) 庫(kù) 管理 init.ora 為這 個(gè)區(qū)域 設(shè) 置合適的參數(shù),當(dāng) 個(gè)內(nèi)存區(qū)域越大,就可以保留更多的 語(yǔ) 句,當(dāng)然被共享的可能性也就越大了。

???? 共享的 語(yǔ) 句必 須滿 足三個(gè)條件:

???? A 字符 級(jí) 的比 當(dāng)前被 執(zhí) 行的 語(yǔ) 句和共享池中的 語(yǔ) 句必 完全相同。

???? B 兩個(gè) 語(yǔ) 句所指的 對(duì) 象必 完全相同:

???? C 兩個(gè) SQL 語(yǔ) 句中必 使用相同的名字的 (bind variables)


4.
選擇 最有效率的表名 ( 只在基于 規(guī)則 優(yōu) 化器中有效 )
???? ORACLE
的解析器按照從右到左的 FROM 子句中的表名,因此 FROM 子句中寫在最后的表 ( 礎(chǔ) driving table) 將被最先 理。在 FROM 子句中包含多個(gè)表的情況下,你必 須選擇記錄 條數(shù)最少的表作 礎(chǔ) 表。當(dāng) ORACLE 理多個(gè)表 時(shí) 會(huì)運(yùn)用排序及合并的方式 接它 。首先, 描第一個(gè)表 (FROM 子句中最后的那個(gè)表 ) 對(duì)記錄進(jìn) 行派序,然后 描第二個(gè)表 (FROM 子句中最后第二個(gè)表 ) ,最后將所有從第二個(gè)表中 索出的 記錄 與第一個(gè)表中合適 記錄進(jìn) 行合并。

???? 如果有 3 個(gè)以上的表 查詢 那就需要 選擇 交叉表 (intersection table) 礎(chǔ) 表, 交叉表是指那個(gè)被其他表所引用的表。


5.WHERE
子句中的
???? ORACLE
采用自下而上的 序解析 WHERE 子句,根據(jù) 個(gè)原理,表之 接必 寫在其他 WHERE 條件之前, 那些可以 過(guò)濾 掉最大數(shù)量 記錄 的條件必 寫在 WHERE 子句的末尾。


6.SELECT
子句中避免使用 ' * '
????
當(dāng)你想在 SELECT 子句中列出所有的 COLUMN 時(shí) ,使用 動(dòng)態(tài) SQL 列引用 '*' 是一個(gè)方便的方法。不幸的是, 是一個(gè)非常低效的方法。 實(shí)際 上, ORACLE 在解析的 過(guò) 程中, 會(huì)將 '*' 依次 轉(zhuǎn)換 成所有的列名, 個(gè)工作是通 過(guò)查詢 數(shù)據(jù)字典完成的, 意味著將耗 費(fèi) 更多的 時(shí)間


7.
減少 訪問(wèn) 數(shù)據(jù) 庫(kù) 的次數(shù)
????
當(dāng) 執(zhí) SQL 語(yǔ) 時(shí) ORACLE 在內(nèi)部 執(zhí) 行了 多工作:解析 SQL 語(yǔ) 句,估算索引的利用率, 量, 數(shù)據(jù) 等等。由此可 ,減少 訪問(wèn) 數(shù)據(jù) 庫(kù) 的次數(shù),就能 實(shí)際 上減少 ORACLE 的工作量。


8.
使用 DECODE 函數(shù)來(lái)減少 時(shí)間
????
使用 DECODE 函數(shù)可以避免重 復(fù)掃 描相同 記錄 或重 復(fù)連 接相同的表。


9.
整合 簡(jiǎn)單 ,無(wú) 關(guān)聯(lián) 的數(shù)據(jù) 庫(kù)訪問(wèn)
????
如果你有幾個(gè) 簡(jiǎn)單 的數(shù)據(jù) 庫(kù)查詢語(yǔ) 句,你可以把它 整合到一個(gè) 查詢 ( 即使它 沒有 關(guān) )


10.
除重 復(fù)記錄

11. TRUNCATE 替代 DELETE
????
當(dāng) 除表中的 記錄時(shí) ,在通常情況下, (rollback segments ) 用來(lái)存放可以被恢 復(fù) 的信息。 如果你沒有 COMMIT 務(wù) ORACLE 會(huì)將數(shù)據(jù)恢 復(fù) 除之前的狀 態(tài) ( 準(zhǔn)確地 說(shuō) 是恢 復(fù) 執(zhí) 除命令之前的狀況 )

???? 而當(dāng)運(yùn)用 TRUNCATE 時(shí) 段不再存放任何可被恢 復(fù) 的信息。當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢 復(fù) 。因此很少的 源被 調(diào) 用, 執(zhí) 時(shí)間 也會(huì)很短。


12.
盡量多使用 COMMIT
????
只要有可能,在程序中盡量多使用 COMMIT 這樣 程序的性能得到提高,需求也會(huì)因 COMMIT 放的 源而減少

???? COMMIT 放的 源:

???? A 段上用于恢 復(fù) 數(shù)據(jù)的信息。

???? B 、被程序 語(yǔ) 得的

???? C redo log buffer 中的空

???? D ORACLE 管理上述 3 種資 源中的內(nèi)部花 費(fèi)


13.
計(jì) 記錄 條數(shù)
????
和一般的 點(diǎn)相反, count(*) count(1) 稍快,當(dāng)然如果可以通 過(guò) 索引 索, 對(duì) 索引列的 計(jì) 數(shù)仍舊是最快的。例如 COUNT(EMPNO)


14.
Where 子句替 HAVING 子句
????
避免使用 HAVING 子句, HAVING 只會(huì)在 索出所有 記錄 之后才 對(duì)結(jié) 果集 進(jìn) 過(guò)濾 個(gè) 理需要排序, 總計(jì) 等操作。如果能通 過(guò) WHERE 子句限制 記錄 的數(shù)目,那就能減少 方面的 開銷


15.
減少 對(duì) 表的 查詢
????
在含有子 查詢 SQL 語(yǔ) 句中,要特 注意減少 對(duì) 表的 查詢


16.
過(guò) 內(nèi)部函數(shù)提高 SQL 效率。

17. 使用表的 (Alias)
????
當(dāng)在 SQL 語(yǔ) 句中 接多個(gè)表 時(shí) 請(qǐng) 使用表的 名并把 名前 個(gè) Column 上。 這樣 一來(lái),就可以減少解析的 時(shí)間 并減少那些由 Column 引起的 語(yǔ) 錯(cuò)誤


18.
EXISTS 替代 IN
????
多基于基 礎(chǔ) 表的 查詢 中, 滿 足一個(gè)條件,往往需要 對(duì) 另一個(gè)表 進(jìn) 聯(lián) 接。在 這種 情況下,使用 EXISTS( NOT EXISTS) 通常將提高 查詢 的效率。


19.
NOT EXISTS 替代 NOT IN
????
在子 查詢 中, NOT IN 子句將 執(zhí) 行一個(gè)內(nèi)部的排序和合并。 無(wú) 在哪 情況下, NOT IN 都是最低效的 ( 對(duì) 查詢 中的表 執(zhí) 行了一個(gè)全表遍 ) 了避免使用 NOT IN ,我 可以把它改寫成外 (Outer Joins) NOT EXISTS


20.
用表 接替 EXISTS
????
通常來(lái) 說(shuō) 采用表 接的方式比 EXISTS 更有效率


21.
EXISTS DISTINCT
????
當(dāng)提交一個(gè)包含一 對(duì) 多表信息 ( 比如部 表和雇 ) 查詢時(shí) ,避免在 SELECT 子句中使用 DISTINCT 一般可以考 EXIST

Oracle SQL 性能優(yōu)化技巧


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論