日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 2330 0

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

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

???? 置缺省的 優(yōu) 化器,可以通 過對 init.ora 文件中 OPTIMIZER_MODE 參數(shù)的各 聲明,如 RULE COST CHOOSE ALL_ROWS FIRST_ROWS 你當然也在 SQL 或是會 (session) 級對 行覆蓋。

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

???? 如果數(shù)據(jù) 優(yōu) 化器模式 為選擇 (CHOOSE) ,那 么實際 優(yōu) 化器模式將和是否運行 analyze 命令有 如果 table 經(jīng) analyze 優(yōu) 化器模式將自 CBO 反之,數(shù)據(jù) 將采用 RULE 形式的 優(yōu) 化器。

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


2.
訪問 Table 的方式
???? ORACLE
采用兩 種訪問 表中 記錄 的方式:

???? A 全表

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

???? B ROWID 訪問

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


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

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

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

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

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

???? 共享的 句必 須滿 足三個條件:

???? A 字符 的比 當前被 執(zhí) 行的 句和共享池中的 句必 完全相同。

???? B 兩個 句所指的 象必 完全相同:

???? C 兩個 SQL 句中必 使用相同的名字的 (bind variables)


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

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


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


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


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


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


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


10.
除重 復記錄

11. TRUNCATE 替代 DELETE
????
除表中的 記錄時 ,在通常情況下, (rollback segments ) 用來存放可以被恢 的信息。 如果你沒有 COMMIT ORACLE 會將數(shù)據(jù)恢 除之前的狀 態(tài) ( 準確地 是恢 執(zhí) 除命令之前的狀況 )

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


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

???? COMMIT 放的 源:

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

???? B 、被程序 得的

???? C redo log buffer 中的空

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


13.
記錄 條數(shù)
????
和一般的 點相反, count(*) count(1) 稍快,當然如果可以通 索引 索, 索引列的 數(shù)仍舊是最快的。例如 COUNT(EMPNO)


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


15.
減少 表的 查詢
????
在含有子 查詢 SQL 句中,要特 注意減少 表的 查詢


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

17. 使用表的 (Alias)
????
當在 SQL 句中 接多個表 使用表的 名并把 名前 Column 上。 這樣 一來,就可以減少解析的 時間 并減少那些由 Column 引起的 錯誤


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


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


20.
用表 接替 EXISTS
????
通常來 采用表 接的方式比 EXISTS 更有效率


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

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 汝城县| 肥城市| 罗平县| 兴文县| 淳安县| 门头沟区| 上虞市| 措勤县| 阿荣旗| 登封市| 尉犁县| 陆川县| 墨脱县| 德惠市| 黑龙江省| 邓州市| 宁德市| 清流县| 商南县| 宝鸡市| 鹿邑县| 桦川县| 阿合奇县| 庐江县| 太康县| 遵义县| 霞浦县| 麦盖提县| 清流县| 丰镇市| 房山区| 乐都县| 吉隆县| 永州市| 西青区| 巴林右旗| 肇东市| 东港市| 洪雅县| 桐乡市| 周宁县|