最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle大表添加索引的實(shí)現(xiàn)方式

 更新時(shí)間:2025年07月14日 09:43:28   作者:數(shù)字天下  
文章介紹了Oracle創(chuàng)建索引的優(yōu)化方法,包括nologging減少日志、parallel并行加速、online不阻塞業(yè)務(wù),以及調(diào)整參數(shù)和內(nèi)存設(shè)置提升性能,操作后需恢復(fù)原參數(shù)

背景

業(yè)務(wù)系統(tǒng)中現(xiàn)在經(jīng)常存在上億數(shù)據(jù)的大表,在這樣的大表上新建索引,是一個(gè)較為耗時(shí)的操作,特別是在生產(chǎn)環(huán)境的系統(tǒng)中,添加不當(dāng),有可能造成業(yè)務(wù)表鎖表,業(yè)務(wù)表長(zhǎng)時(shí)間的停服勢(shì)必會(huì)影響正常業(yè)務(wù)的開展。

根據(jù)個(gè)人的實(shí)際經(jīng)驗(yàn),我們可以使用三種手段來(lái)幫助大家解決這個(gè)問題,需要注意的是這三種方法并不是獨(dú)立使用的,很多時(shí)候我們會(huì)結(jié)合起來(lái)一起使用來(lái)提升建索引的效率。

解決方案

第一種方法就是使用并行——parallel 開啟并發(fā)執(zhí)行

并發(fā)執(zhí)行可以最大程度的利用我們的數(shù)據(jù)庫(kù)的硬件資源,把大批量的數(shù)據(jù)分成小批量到不同的進(jìn)程去執(zhí)行,從而大大減少sql的執(zhí)行的時(shí)間。

由于建索引屬于ddl操作,我們可以通過(guò)下面的語(yǔ)句來(lái)實(shí)現(xiàn)并發(fā)執(zhí)行。

下面的語(yǔ)句中,我們就配置了使用并發(fā)值為8來(lái)執(zhí)行我們的sql語(yǔ)句

CREATE INDEX idx_table1_column1 ON table1 (column1) PARALLEL 8;

注意:

并不是所有的系統(tǒng)都適用使用并行來(lái)解決,比如:目前有個(gè)系統(tǒng)使用cpu已經(jīng)很高,如果這時(shí)你再開啟并行,只會(huì)加重系統(tǒng)的負(fù)載。因此,在執(zhí)行并行操作前一定要看一下系統(tǒng)目前使用情況。

第二種方法是不開啟日志——nologging

我們知道數(shù)據(jù)表新增、修改、刪除記錄都可能會(huì)觸發(fā)redo日志和undo日志的記錄,特別是insert into table1 select * from table2這種語(yǔ)句,每條insert動(dòng)作都會(huì)同時(shí)生成redo日志和undo日志,從而降低sql的執(zhí)行速度。

對(duì)于創(chuàng)建索引的操作也是如此,索引的創(chuàng)建同樣也涉及到這兩類日志的記錄,我們可以手動(dòng)指定不記錄非必要日志來(lái)加快sql執(zhí)行的速度。

注意:

nologging的核心在于只輸入最少的redo日志(注意,這里不是不輸出日志,只是最小化需要輸入的日志量而已) 用法的話十分簡(jiǎn)單,只需要在我們創(chuàng)建索引的語(yǔ)句上加上nologging關(guān)鍵字即可

CREATE INDEX idx_table1_column1 ON table1 (column1) nologging;

第三種方法是在線執(zhí)行——online(推薦使用)

前面介紹的兩個(gè)命令雖然能大幅度提升效率,但歸根結(jié)底建索引就是會(huì)導(dǎo)致鎖表,不停服執(zhí)行的話還是相當(dāng)有風(fēng)險(xiǎn)的,online的作用在于不阻塞DML操作,使得生產(chǎn)環(huán)境不會(huì)因?yàn)閳?zhí)行DDL語(yǔ)句導(dǎo)致業(yè)務(wù)功能阻塞, 尤其適合于不停機(jī)新建表索引這類場(chǎng)景。

需要注意的是:

online關(guān)鍵字的使用相對(duì)來(lái)說(shuō)耗時(shí)會(huì)長(zhǎng)一些,而且online關(guān)鍵字只能用于新增索引,并不能用在修改表結(jié)構(gòu)等SQL語(yǔ)句中。

online的使用也十分簡(jiǎn)單,在sql語(yǔ)句后面加上online就行。

CREATE INDEX idx_table1_column1 ON table1 (column1) online;

有了這三個(gè)方法,我們的最終的sql大概是這樣的,有了online可以保障不影響業(yè)務(wù)主流程的進(jìn)行,而nologging和parallel則可以大幅度提高我們sql的執(zhí)行速度,個(gè)人覺得是一種可行的解決方案。

CREATE INDEX idx_table1_column1 ON table1 (column1) parallel 8 nologging online ;

很多朋友認(rèn)為到這里就結(jié)束了,其實(shí)oracle數(shù)據(jù)庫(kù)優(yōu)化的空間永無(wú)止境,如果有朋友想追求最佳,想把數(shù)據(jù)庫(kù)的性能發(fā)揮到最佳。

那么下面還有三種方法,但是這些不常用,作為學(xué)習(xí)數(shù)據(jù)庫(kù)的原理,可以了解一下。

補(bǔ)充方法1:

由于創(chuàng)建索引時(shí)需要對(duì)表進(jìn)行全表掃描,可以適當(dāng)考慮調(diào)大db_file_multiblock_read_count的值, db_file_multiblock_read_count影響Oracle在讀取數(shù)據(jù)時(shí)一次讀取的最大block數(shù)量,在進(jìn)行一些數(shù)據(jù)量比較大的操作時(shí),可以適當(dāng) 調(diào)整當(dāng)前session的db_file_multiblock_read_count值,會(huì)在IO上節(jié)省節(jié)省一些時(shí)間。

SQL> show parameter db_file
NAME TYPE VALUE
db_file_multiblock_read_count integer 128
SQL> alter session set db_file_multiblock_read_count=256;
Session altered.
SQL> show parameter db_file
NAME TYPE VALUE
db_file_multiblock_read_count integer 256

補(bǔ)充方法2:

我們知道索引都是有序的,利用索引的這個(gè)特性,因此我們可以想到,在創(chuàng)建索引時(shí),要把索引列的值拿到內(nèi)存中進(jìn)行排序,因此我們調(diào)整排序區(qū)的大小(sort_area_size),建立索引時(shí)要對(duì)大量數(shù)據(jù)進(jìn)行排序操作 在oracle11g,如果workarea_size_policy的值為AUTO,sort_area_size將被忽略,pga_aggregate_target將被啟用,pga_aggregate_target決定了整個(gè) 的pga大小,而且一個(gè)session并不能使用全部的pga大小,它受到一個(gè)隱藏參數(shù)的限制,大致能使用pga_agregate_target的5%,因此可以 考慮將workarea_size_policy的值為manual,然后設(shè)置較大的sort_area_size以滿足需求。

SQL> alter system set workarea_size_policy=‘MANUAL';
System altered.
SQL> alter session set sort_area_size=204800;
Session altered.
SQL> show parameter sort_area_size;
NAME TYPE VALUE
sort_area_size integer 204800

補(bǔ)充方法3 :

為了讓添加索引的表能盡快加載到數(shù)據(jù)緩存區(qū)中buffer cache,我們可以使用cache和full hint對(duì)源表做fts,以使它盡可能的出現(xiàn)在 buffer cache中LRU的MRU一端。

SQL> select /*+ cache(t) full(t) / count() from big_table t;

打掃戰(zhàn)場(chǎng):添加完索引后,把打掃一下戰(zhàn)場(chǎng),把戰(zhàn)場(chǎng)恢復(fù)到操作之前,因此我們要把調(diào)整的參數(shù)進(jìn)行恢復(fù)到原來(lái)的樣子。

SQL> alter system set workarea_size_policy=‘AUTO';
System altered.
SQL> alter session set db_file_multiblock_read_count = 128;
Session altered.

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Oracle數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的調(diào)試過(guò)程

    Oracle數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的調(diào)試過(guò)程

    oracle如果存儲(chǔ)過(guò)程比較復(fù)雜,我們要定位到錯(cuò)誤就比較困難,那么我們就可以用存儲(chǔ)過(guò)程的調(diào)試功能,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程調(diào)試的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • oracle 中 sqlplus命令大全

    oracle 中 sqlplus命令大全

    Oracle的sql*plus是與oracle數(shù)據(jù)庫(kù)進(jìn)行交互的客戶端工具,借助sql*plus可以查看、修改數(shù)據(jù)庫(kù)記錄。接下來(lái)通過(guò)本文給大家介紹oracle中sqlplus命令知識(shí),非常不錯(cuò),感興趣的朋友一起看看吧
    2016-09-09
  • 詳解Oracle的sqlldr理論

    詳解Oracle的sqlldr理論

    這篇文章主要介紹了詳解Oracle的sqlldr理論,SQL*LOADER是ORACLE的數(shù)據(jù)加載工具,通常用來(lái)將操作系統(tǒng)文件(數(shù)據(jù))遷移到ORACLE數(shù)據(jù)庫(kù)中,SQL*LOADER是大型數(shù)據(jù)倉(cāng)庫(kù)選擇使用的加載方法,因?yàn)樗峁┝俗羁焖俚耐緩?DIRECT,PARALLEL),需要的朋友可以參考下
    2023-07-07
  • CentOS8下安裝oracle客戶端完整(填坑)過(guò)程分享(推薦)

    CentOS8下安裝oracle客戶端完整(填坑)過(guò)程分享(推薦)

    這篇文章主要介紹了CentOS8下安裝oracle客戶端完整(填坑)過(guò)程分享,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Oracle9i數(shù)據(jù)庫(kù)異常關(guān)閉后的啟動(dòng)

    Oracle9i數(shù)據(jù)庫(kù)異常關(guān)閉后的啟動(dòng)

    Oracle9i數(shù)據(jù)庫(kù)異常關(guān)閉后的啟動(dòng)...
    2007-03-03
  • Oracle文本函數(shù)簡(jiǎn)介

    Oracle文本函數(shù)簡(jiǎn)介

    Oracle數(shù)據(jù)庫(kù)提供了很多函數(shù)供我們使用,下面為您介紹的Oracle函數(shù)是文本函數(shù),如果您對(duì)此方面感興趣的話,不妨一看。
    2015-08-08
  • Linux下Oracle刪除用戶和表空間的方法

    Linux下Oracle刪除用戶和表空間的方法

    這篇文章主要介紹了Linux下Oracle刪除用戶和表空間的方法,涉及Oracle數(shù)據(jù)庫(kù)用戶和表操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-12-12
  • oracle設(shè)置mybatis自動(dòng)生成id插入方式

    oracle設(shè)置mybatis自動(dòng)生成id插入方式

    這篇文章主要介紹了oracle設(shè)置mybatis自動(dòng)生成id插入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 解析如何查看Oracle數(shù)據(jù)庫(kù)中某張表的字段個(gè)數(shù)

    解析如何查看Oracle數(shù)據(jù)庫(kù)中某張表的字段個(gè)數(shù)

    本篇文章是對(duì)查看Oracle數(shù)據(jù)庫(kù)中某張表的字段個(gè)數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • oracle如何使用java source調(diào)用外部程序

    oracle如何使用java source調(diào)用外部程序

    這篇文章主要為大家介紹了oracle如何使用java source調(diào)用外部程序,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論

五寨县| 五河县| 亳州市| 蓬溪县| 平塘县| 大港区| 泊头市| 阳信县| 香港 | 漾濞| 加查县| 东乡族自治县| 稻城县| 尼勒克县| 河津市| 德阳市| 盘山县| 新蔡县| 西畴县| 从化市| 新野县| 连城县| 宜春市| 富锦市| 葫芦岛市| 稻城县| 广宁县| 大悟县| 广元市| 民权县| 宣恩县| 宁武县| 湄潭县| 新野县| 鄂托克前旗| 衡东县| 富锦市| 张家口市| 宝山区| 平定县| 云浮市|