posts - 4, comments - 5, trackbacks - 0, articles - 10

          2006年11月14日

          1、FIRST_ROWS
          ?? 指示優(yōu)化器盡可能快地返回前n行記錄,提高響應(yīng)速度。如果沒有指定參數(shù),則返回第一行。該提示對Update和Insert無效,對包含塊操作的select語句無效,如排序和group。 這樣的語句不能優(yōu)化最佳響應(yīng)時間,因為Oracle在返回第一行之前,必須獲得所有的記錄。如果在這種情況下使用了該提示,優(yōu)化器會優(yōu)化最佳吞吐量(相當(dāng)于ALL_ROWS提示)。
          ?
          2、FULL
          ?? 指示優(yōu)化器執(zhí)行全表掃描,即使有索引,也不會走索引。
          ??
          ??? SELECT ? /* +?FULL(e)? */ ?employee_id,?last_name
          ??????
          FROM ?hr.employees?e? WHERE ?last_name? LIKE ?:b1;
          ??
          ?? 注意:如果表有別名,則必須使用別名。并且即使表加上了schema名稱,在提示中也不能指定schema名稱。
          ?
          3、HASH
          ?? 指示優(yōu)化器使用Hash掃描表,只適用于表簇中的表。
          ?
          4、INDEX
          ?? 指示優(yōu)化器適用Index掃描表,適用于函數(shù)、域、B樹、位圖和位圖聯(lián)合索引。
          ?? Index提示遵循以下規(guī)范:
          ?? a、如果Index提示指定單個的索引,那么數(shù)據(jù)庫執(zhí)行該索引上的掃描,優(yōu)化器不會執(zhí)行全表掃描或者表上的其他索引。
          ?? b、對于指定了多個索引的組合的Index提示,Oracle推薦使用INDEX_COMBINE而不是INDEX提示,因為它更加通用,如果Index提示指定了index列表,那么優(yōu)化器會考慮走每個索引的代碼,并從中選擇代價最小的一條索引,如果掃描多個index的代價最小,那么優(yōu)化器會掃描該個索引列表。優(yōu)化器不會走全表掃描或者沒有在index列表上的索引。
          ?? c、如果Index提示沒有指定Index,優(yōu)化器會評估掃描每個Index的代價,并選擇代價最小的Index,如果組合Index代價最小,那么優(yōu)化器會選擇掃描多個索引,并合并結(jié)果集。優(yōu)化器不會走全表掃描。
          ?
          ??? SELECT ? /* +?INDEX?(employees?emp_department_ix) */ ??employee_id,?department_id
          ????
          FROM ?employees? WHERE ?department_id? > ? 50 ;
          ?
          5、INDEX_ASC
          ?? 按索引值的升序方向掃描索引,其他參數(shù)與INDEX 提示完全一樣。
          ?
          6、INDEX_COMBINE
          ?? 聯(lián)合索引提示。索引規(guī)則與INDEX提示一樣。
          ??
          ??? SELECT ? /* +?INDEX_COMBINE(e?emp_manager_ix?emp_department_ix)? */ ? *
          FROM ?employees?e
          WHERE ?manager_id? = ? 108
          OR ?department_id? = ? 110 ;
          ?
          7、INDEX_DESC
          ? 降序INDEX提示。
          ?
          SELECT ? /* +?INDEX_DESC(e?emp_name_ix)? */ ? *
          FROM ?employees?e;
          ?
          8、INDEX_FFS
          ? 指示優(yōu)化器執(zhí)行快速全索引掃描,而不是全表掃描。
          ?
          SELECT ? /* +?INDEX_FFS(e?emp_name_ix)? */ ?first_name
          FROM ?employees?e;
          ?
          9、INDEX_JOIN
          ??以INDEX JOIN的方式掃描,必須存在足夠少的INDEX,這些索引包含著查詢中所有的列。
          ?
          SELECT ? /* +?INDEX_JOIN(e?emp_manager_ix?emp_department_ix)? */ ?department_id
          FROM ?employees?e? WHERE ?manager_id? < ? 110 ? AND ?department_id? < ? 50 ;
          ?
          10、INDEX_SS
          ? 索引跳躍掃描提示。
          ?
          11、LEADING
          ? 指定特定的表放在執(zhí)行計劃的前面,它比ORDERED提示更加通用。
          ? 如果因為Join路線的依賴關(guān)系而不能首先被Join,提示就會被忽略;如果指定了兩個或者多個沖突的LEADING提示,則他們都會被忽略;如果指定了ORDERED提示,那么LEADING就會被忽略。
          ?
          12、MERGE
          ??將視圖合并到查詢。
          ? 如果視圖查詢語句包含GROUP BY子句或者SELECT語句中用到了 DISTINCT,那么優(yōu)化器能夠?qū)⒁晥D合并到查詢語句中,合成的合并也能夠合并IN子查詢,如果IN子查詢沒有關(guān)聯(lián)。
          ?
          ?? SELECT ? /* +?MERGE(v)? */ ?e1.last_name,?e1.salary,?v.avg_salary
          FROM ?employees?e1,
          (
          SELECT ?department_id,? avg (salary)?avg_salary
          FROM ?employees?e2
          GROUP ? BY ?department_id)?v
          WHERE ?e1.department_id? = ?v.department_id? AND ?e1.salary? > ?v.avg_salary;
          ?
          13、NOAPPEND
          ?? 在并行模式中使用常規(guī)插入方法。
          ?
          14、NOCACHE
          ?
          15、NO_EXPAND
          ?
          16、NO_FACT
          ?
          17、NO_INDEX
          ?
          18、NO_INDEX_SS
          ?
          19、NO_MERGE
          ?
          20、NO_PARALLEL
          ?? 覆蓋了使用DDL語言創(chuàng)建或者更改table的PARALLEL參數(shù)的設(shè)置。
          ?
          21、NO_PARALLEL_INDEX
          ?? 覆蓋了使用DDL語言創(chuàng)建或者更改index的PARALLEL參數(shù)的設(shè)置。
          ?
          22、NO_PUSH_PRED
          ??
          23、NO_PUSH_SUBQ
          ?
          24、NO_PX_JOIN_FILTER
          ??? 阻止優(yōu)化器使用并行聯(lián)合位圖過濾器
          ?
          25、NO_REWRITE
          ??? 使查詢重寫失效
          ?
          26、NO_QUERY_TRANSFORMATION
          ??? 跳過所有查詢轉(zhuǎn)換,包括但不限于:OR-expansion、視圖合并、無嵌套子查詢、星型轉(zhuǎn)換和物化視圖重寫。
          ?
          27、NO_STAR_TRANSFORMATION
          ?
          28、NO_UNNEST
          ?
          29、NO_USE_HASH
          ?
          30、ORDERED
          ?? 指示優(yōu)化器按照FROM子句出現(xiàn)的表順序join表。Oracle推薦使用LEADING提示。
          ?
          31、PARALLEL
          ?? 指示優(yōu)化器使用指定數(shù)目的服務(wù)器去執(zhí)行并行操作,包括SELECT、INSERT、MERGE、UPDATE和DELETE部分的語句和表掃描部分都可使用。
          ?? 注意:如果發(fā)生sort或者group,那么服務(wù)器的數(shù)量應(yīng)該是提示指定的兩倍。
          ?? 如果任何并行都被禁止,那么提示就會被忽略。
          ?? 如果指定了DEFAULT或者沒有指定任何值,那么查詢器就會去檢查初始參數(shù)的設(shè)置來決定并行度。
          ?? 臨時表上的該提示將會被忽略。
          ?
          32、PARALLEL_INDEX
          ?? 為分區(qū)索引指定并行索引掃描的數(shù)量。示例:
          ??? SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */
          ?
          33、PQ_DISTRIBUTE
          ?
          34、PUSH_PRED
          ?
          35、PUSH_SUBQ
          ?
          36、REWRITE
          ??? 對物化視圖使用查詢重寫。

          posted @ 2006-11-16 17:05 勇敢的心 閱讀(2199) | 評論 (1)編輯 收藏

          (1)、Oracle插入數(shù)據(jù)有兩種方式:
          a、常規(guī)插入:重新使用table中的自由空間,在已有數(shù)據(jù)中插入新數(shù)據(jù);維護引用完整性約束。
          b、Direct-Path插入:在表中已有數(shù)據(jù)之后插入新數(shù)據(jù);數(shù)據(jù)直接插入數(shù)據(jù)文件,繞過buffer cache;已有數(shù)據(jù)中的自由空間沒有被重新利用;忽略了引用完整性約束。
          ?
          (2)、連續(xù)模式:一個進程執(zhí)行sql語句;
          ?????? 并行模式:多個進程同時執(zhí)行一個sql語句,即并行執(zhí)行。
          ?
          (3)Direct-Path插入的優(yōu)點:
          1、可以disable redo log和undo log;而常規(guī)插入?yún)s不可以如此,并且重用自由空間和維護引用完整性。
          2、通過CREATE TABLE...AS SELECT 語句可以從現(xiàn)有表中創(chuàng)建新表,使用Direct-Path插入可以在插入時更新定義在目標(biāo)表上的任意索引。
          3、Direct-Path插入能保證事務(wù)的原子性,即使在并行模式下。使用SQL*Loader在并行模式加載中不能保證原子性。
          4、當(dāng)并行Direct-Path加載發(fā)生錯誤時,索引被標(biāo)志成UNUSABLE。
          5、如果想使用表壓縮的壓縮格式存儲數(shù)據(jù),必須使用Direct-Path插入。
          ?
          ?
          (4)使用Direct-Path插入:
          ?
          在連續(xù)模式中,在Insert語句中指定“APPEND”提示,在INSERT關(guān)鍵字之后,或者在INSERT子查詢中的SELECT關(guān)鍵字之后。
          在并行DML模式中,默認(rèn)的就是DIRECT-PATH插入,為了運行并行DML模式,必須滿足以下條件:
          a、必須是Oracle企業(yè)版;
          b、必須在session中使并行DML生效,執(zhí)行以下sql語句:
          ALTER SESSION { ENABLE | FORCE } PARALLEL DML;
          c、必須指定table的并行屬性,在創(chuàng)建的時候或者其他時候,或者在insert操作時使用“PARALLEL”提示。
          ?
          為了使Direct-Path Insert模式失效,在INSERT語句中指定“NOAPPEND”提示,覆蓋并行DML模式。
          ?
          (5)、Direct-Path INSERT 是如何工作的
          ?
          在分區(qū)表和非分區(qū)表都可以使用Direct-Path INSERT
          ?
          連續(xù)Direct-Path INSERT到分區(qū)和非分區(qū)表
          ? 單個進程插入數(shù)據(jù)到高水位標(biāo)志之上,當(dāng)執(zhí)行完commit之后,高水位標(biāo)志得到更新。
          ?
          并行Direct-Path INSERT到分區(qū)表
          ? 類似于serial Direct-Path INSERT,每個并行操作分配給一個或者多個分區(qū),每個并行操作插入數(shù)據(jù)到各自的分區(qū)段的高水位標(biāo)志之上,commit之后,用戶就能看到更新的數(shù)據(jù)。
          ?
          并行Direct-Path INSERT到非分區(qū)表
          ? 每個并行執(zhí)行分配一個新的臨時段,并插入數(shù)據(jù)到臨時段。當(dāng)commit運行后,并行執(zhí)行協(xié)調(diào)者合并新的臨時段到主表段,用戶就能看到更新的數(shù)據(jù)。
          ?
          為Direct-Path INSERT指定的Log模式
          ?? Direct-Path INSERT可以使用Log或者不使用Log。
          ?
          (6)、其他需要注意的地方:
          ??? 索引維護:Oracle在Direct-Path INSERT 操作末尾,對具有索引的表執(zhí)行索引維護,這樣就避免了在drop掉索引后,再rebuild。
          ??? 使用的空間:Direct-Path INSERT比常規(guī)的插入需要更多的空間。因為它將數(shù)據(jù)插入在高水位之上。并行插入非分區(qū)表需要更多的空間,因為它需要為每一個并行創(chuàng)建臨時段。
          ??? 鎖:在插入期間,數(shù)據(jù)庫在表上獲得排他鎖,用戶不能在表上執(zhí)行并行插入、更新或者刪除操作,并行的索引創(chuàng)建和build也不被允許。但卻可以并行查詢,但查詢返回的是插入之前的結(jié)果集。

          posted @ 2006-11-14 09:22 勇敢的心 閱讀(2472) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 甘肃省| 康乐县| 延津县| 新密市| 宜春市| 区。| 通城县| 额尔古纳市| 吉林市| 长丰县| 贺州市| 曲靖市| 陈巴尔虎旗| 中山市| 德州市| 莆田市| 馆陶县| 宁蒗| 屯昌县| 余干县| 视频| 时尚| 新竹县| 内江市| 龙岩市| 榆林市| 鄄城县| 兴海县| 偃师市| 阿坝县| 湾仔区| 逊克县| 吉首市| 水富县| 两当县| 黑龙江省| 武义县| 奉新县| 固始县| 许昌市| 茶陵县|