導航:首頁 > 網路數據 > oracle大數據怎麼處理

oracle大數據怎麼處理

發布時間:2024-07-22 14:15:54

㈠ Oracle資料庫大數據量表如何優化

要看數據多到何種程度。
比如一個表的筆數只是幾百,如果不需要和其他大表關聯查詢數據,連索引都不用建。
如果是幾十萬級別的表,一般正確建索引就可以。
如果是千萬級別的表,不但要正確建索引,而且要定時手工進行收集統計信息維護,不建議系統自動維護,以免影響使用性能。
如果是億以上級別的表,則可考慮按一定條件拆分表資拆好租料,將舊資料歸檔,這樣可改旅兆善生成表的使用。
資料庫優化的同時,程序也要襪盯進行相應優化,程序和
數據科學
搭配,才能使性能達到最佳。

㈡ oracle 如何處理更新大數據量

樓下的看清復楚,有50k的照片,不管制blob還是long raw處理起來都是很慢的
2G數據拷貝也不是秒級的操作。
你的pga對於你的數據過小,很容易導致大量而外i/o,操作最好是分批提交,不要一條sql寫入。

㈢ oracle單表的數據量太大該怎麼處理

實際有多大?

如果太大,那麼可以考慮分區 或者分表管理

㈣ oracle中對大數據處理有哪些方式

一、大數據存儲方式:
1. BLOB,二進制大數據
2. CLOB,文本類型大數據
3. BFILE(推薦),文件方式大內數據,以連接(容文件位置)方式存儲,實際在資料庫外
4. RAW,二進制大數據(ORACLE老版本的,9i後逐漸被BLOB/CLOB/BFILE代替)
二、大數據的處理內置函數
1. BLOB/CLOB/BFILE:DBMS_LOB包
2. RAW:UTL_RAW包

㈤ oracle一張上千萬記錄的數據表需要改為分區表,用什麼方法好

Oracle提供了分區技術以支持VLDB(Very Large DataBase)。分區表通過對分區列的判斷,把分區列不同的記錄,放到不同的分區中。分區完全對應用透明。

Oracle的分區表可以包括多個分區,每個分區都是一個獨立的段(SEGMENT),可以存放到不同的表空間中。查詢時可以通過查詢表來訪問各個分區中的數據,也可以通過在查詢時直接指定分區的方法來進行查詢。

分區提供以下優點:

由於將數據分散到各個分區中,減少了數據損壞的可能性;

可以對單獨的分區進行備份和恢復;

可以將分區映射到不同的物理磁碟上,來分散IO;

提高可管理性、可用性和性能。

Oracle提供了以下幾種分區類型:

范圍分區(range);

哈希分區(hash);

列表分區(list);

范圍-哈希復合分區(range-hash);

范圍-列表復合分區(range-list)。

Oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分區表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,並說明它們各自的特點。

方法一:利用原表重建分區表。

步驟:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已創建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已創建6264行。

SQL> COMMIT;

提交完成。
SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT ID, TIME FROM T;

表已創建。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
6264

SQL> SELECT COUNT(*) FROM T PARTITION (P1);

COUNT(*)
----------
0

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
6246

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
18

優點:方法簡單易用,由於採用DDL語句,不會產生UNDO,且只產生少量REDO,效率相對較高,而且建表完成後數據已經在分布到各個分區中了。

不足:對於數據的一致性方面還需要額外的考慮。由於幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執行CREATE TABLE語句和RENAME T_NEW TO T語句直接的修改可能會丟失,如果要保證一致性,需要在執行完語句後對數據進行檢查,而這個代價是比較大的。另外在執行兩個RENAME語句之間執行的對T的訪問會失敗。

適用於修改不頻繁的表,在閑時進行操作,表的數據量不宜太大。

方法二:使用交換分區的方法。

步驟:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已創建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已創建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (MAXVALUE));

表已創建。

SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

表已更改。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。
SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
6264

優點:只是對數據字典中分區和表的定義進行了修改,沒有數據的修改或復制,效率最高。如果對數據在分區中的分布沒有進一步要求的話,實現比較簡單。在執行完RENAME操作後,可以檢查T_OLD中是否存在數據,如果存在的話,直接將這些數據插入到T中,可以保證對T插入的操作不會丟失。

不足:仍然存在一致性問題,交換分區之後RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據。如果要求數據分布到多個分區中,則需要進行分區的SPLIT操作,會增加操作的復雜度,效率也會降低。

適用於包含大數據量的表轉到分區表中的一個分區的操作。應盡量在閑時進行操作。

方法三:Oracle9i以上版本,利用在線重定義功能

步驟:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已創建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已創建6264行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 過程已成功完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE));
表已創建。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW', -
> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 過程已成功完成。

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YANGTK', 'T', 'T_NEW');

PL/SQL 過程已成功完成。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
6264

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
6246

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
18

優點:保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權並建立各種約束,可以做到切換完成後不再需要任何額外的管理操作。

不足:實現上比上面兩種略顯復雜。

適用於各種情況。

這里只給出了在線重定義表的一個最簡單的例子,詳細的描述和例子可以參考下面兩篇文章。

Oracle的在線重定義表功能:http://blog.itpub.net/post/468/12855

Oracle的在線重定義表功能(二):http://blog.itpub.net/post/468/12962

索引也可以進行分區,分區索引有兩種類型:global和local。對於local索引,每一個表分區對應一個索引分區,當表的分區發生變化時,索引的維護由Oracle自動進行。對於global索引,可以選擇是否分區,而且索引的分區可以不與表分區相對應。當對分區進行維護操作時,通常會導致全局索引的INVALDED,必須在執行完操作後REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES語句,可以使在進行分區維護的同時重建全局索引。

全局索引可以包含多個分區的值 局部索引比全局索引容易管理,而全局索引比較快
注意:不能為散列分區 或者 子分區創建全局索引

Oracle的分區功能十分強大。不過用起來發現有兩點不大方便:

第一是已經存在的表沒有方法可以直接轉化為分區表。不過Oracle提供了在線重定義表的功能,可以通過這種方式來完成普通表到分區表的轉化。可以參考這個例子:http://blog.itpub.net/post/468/13091

第二點是如果採用了local分區索引,那麼在增加表分區的時候,索引分區的表空間是不可控制的。如果希望將表和索引的分區分開到不同的表空間且不同索引分區也分散到不同的表空間中,那麼只能在增加分區後,對新增的分區索引單獨rebuild。

Oracle最大允許存在多少個分區呢?

我們可以從Oracle的Concepts手冊上找到這個信息,對於Oracle9iR2:

Tables can be partitioned into up to 64,000 separate partitions.

對於Oracle10gR2,Oracle增強了分區特性:

Tables can be partitioned into up to 1024K-1 separate partitions.

關於何時應該進行分區,Oracle有如下建議:

■ Tables greater than 2GB should always be considered for partitioning.
■ Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.

這些信息是在網上查到的,測試了下確實可以用。

㈥ Oracle等資料庫數據量特別大的時候怎樣從程序和SQL語句方面優化使查詢速度加快

一般最抄常用的大數據量優襲化:
1、創建分區表,使查詢時的大表盡量分割成小表。Oracle提供范圍分區、列表分區、Hash分區以及復合分區,具體選擇哪種分區最優,需要根據你的業務數據來確定。
2、創建索引,創建合適的索引可以大大提高查詢速度。但是你的這張大表如果會頻繁的進行update、insert等操作,索引會導致這些操作變慢。就有可能需要進行動態索引的使用。
3、優化復雜SQL;對復雜的SQL進行合理的優化,這個有時候也需要根據你的數據情況來優化,可以參考一些SQL語句優化方面的文檔。

㈦ ORACLE大數據表Update處理

ORACLE中如果表數據量很大(M級或更大) update某個欄位是很慢的(如我的HIS項目中更新歷史業務流程表 萬條記錄 用CURSOR來更新 條MIT一次 花了 天也沒更新完) 後來嘗試過的改進辦法有

把表上的LOGGING取消

把表上的INDEX取消

但是依然很慢 無奈下找到這個

沒陪在這個主題問答里 ORA官方提了一種處理的辦法

利用CREATE table as select xxxxx的辦法來生成一新表T

在T 上創建與目標表一樣的索引

把目標表刪除或RENAME(注意備份以備反悔)

把T 改名成目標表

試了一下 果然非常歲察如地快 我的任務差不多在 Min就完成了

如csywdk table_room是一張大表 要刪除其中bakfwid在noNewYWFW 中的記錄 且要更新bakfwid在imp_table_room中記錄的ROOM_LOC為imp_table_room room_loc:

( )創建新表

create table tmp_new_table_room as

select t ROOM_ID t NEWROOMID t BUILDID t TFH t DKH t BUILD_NO t LAYER_NO t ROOM_NO t ROOM_NAME

decode(t bakfwid null t ROOM_LOC t room_loc)

t ROOM_AREA

t SURTYPE t LAYER_NAME t DEVDEP t CELL t DELFLAG t QXXZ t SJSJLSH t FD t ID t BAKFWID

from csywdk table_room t left join imp_table_room t on t bakfwid=t bakfwid

where not exists(select from noNewYWFW t where t bakfwid=t bakfwid)

( )創建備份表

create table Table_room as

select * from csywdk table_room

( )替換原表

drop table sde table_room

create table sde table_room as

select * from tmp_new_table_room

在這個問答里還提到一句ORA PL/SQL效率相關的話

能用一句語句處理的任務決不乎啟要用多句編程來實現

lishixin/Article/program/Oracle/201311/18980

㈧ 淺談Oracle中大數據量表的管理

簡介

隨著信息業的發展 在企業級資料庫應用中 經常會有一些幾十GB 上百GB的數據表 這些大數據量表的設計 維護及其備份都是資料庫管理中的重點及其難點 本文就從設計 維護及其備份方面探討一下大數據量表的管理

設計

大表時效性

大數據量表的數據量一般來說是跟時間成正比的 時間越久 數據量越大 在設計階段首先要考慮這些大表的時效性

通常情況 在一定的時間區間 數據的訪問頻度比較大 超過這個區間 數據的訪問頻度極小 這個時間區間根據不同的應用類型而不同 通常是幾個月 超過這個時間區間的數據可以認為是歷史數據 數據訪問的可能性不打 在企業應用中 並不是所有的數據都需要保留在生產資料庫中 對於這些歷史數據 可以考慮離線存放 或者是存放在另外的資料庫中 比如數據倉庫等

大表的時效性可以通過在表上加時間戳列來實現

使用分區表

Oracle 以後提供了分區表的功能 分區表可以把一個表的數據從物理和邏輯上分割成小的區域 Oracle支持非常大的分區表 一個對象可以允許多達 個分區 對於大表來說 使用分區表是首選方案 分區表可以改善表的維護 備份 恢復及查詢性能

分區表有 種分區方式

n Range Partitioning

n Hash Partitioning

n Composite Partitioning

n List Partitioning

對於有時效性的大表 可以採用按時間分區的 Range Partitioning表 例如按天分區的分區表

CREATE TABLE Test(

DATATIME DATE NOT NULL

P NUMBER NULL

P NUMBER NULL

P NUMBER NULL

P NUMBER NULL

P NUMBER NULL

P NUMBER NULL

P NUMBER NULL

P NUMBER NULL

CONSTRAINT PK_TEST PRIMARY KEY (datatime p p ) USING INDEX LOCAL TABLESPACE USERINDEX

)

PARTITION BY RANGE (DATATIME)

(PARTITION Test_ VALUES LESS THAN (TO_DATE( YYYY MM DD ))

(PARTITION Test_ VALUES LESS THAN (TO_DATE( YYYY MM DD ))

……

);

對於按時間分區仍然不能滿足性能需求的表 還可以根據應用需求 使用子分區對表進一步細化

應用設計中 要充分利用分區表的特性 對大表的訪問要完全避免全表訪問 縮小訪問范圍 在查詢條件中 盡量使用分區的列

維護

大表的維護工作比較繁瑣 索引的維護 存儲空間的維護 歷史數據的清理等等 使用分區表可以簡化大表的維護工作 但是如果表很多的話 手動的創建 刪除分區也是一件很繁瑣 而且容易出錯的事情

此章節以按天分區的分區表為例討論大表的自動維護

分區表的命名規則

分區表分區的命名應當按照一定的規則命名 以利於自動維護的實現 本例採用按天分區的分區表 分區的命名方式為TABLENAME_YYMMDD 例如 TEST表的 年 月 日的分區命名為TEST _

維護字典

在資料庫中創建維護字典表 存放需要自動維護的分區表的信息 包括表名 schema 表的類型 數據在資料庫中的保留時間等信息

Table Name: H_RETENTION

Column Type Null? Description

tablename Varchar ( ) Not null 表名

schemaname Varchar ( ) Not null Schema

typeid Varchar ( ) Not null 表類型 PARTITION NORMAL …

retention Number( ) Not null 該表的保存天數

自動創建分區

對於按時間分區的分區表 若不能及時創建新的數據分區 會導致數據無法插入到分區表的嚴重後果 資料庫會產生報錯信息ORA : inserted partition key does not map to any partition 插入失敗

創建分區可以手工創建 也可以根據維護字典 通過系統的任務調度來創建分區 通常是在月底創建下個月的分區

自動創建分區實現如下

/**************************************************************************

Program Name:Add_Partition

Description:

創建某個用戶下個月的所有分區

***************************************************************************/

PROCEDURE add_partition (v_schema IN VARCHAR )

IS

CURSOR c_td_table

IS

SELECT tablename

FROM h_retention

WHERE typeid = PARTITION

AND schemaname = UPPER (v_schema)

ORDER BY tablename;

v_cur BINARY_INTEGER;

v_int BINARY_INTEGER;

v_partition VARCHAR ( );

v_date DATE;

v_days NUMBER;

sql_stmt VARCHAR ( ); String used to save sql statement

err_msg VARCHAR ( );

BEGIN

v_date := TRUNC (ADD_MONTHS (SYSDATE ) MM );

v_days :=

TO_NUMBER (TO_CHAR (LAST_DAY (ADD_MONTHS (SYSDATE )) DD ));

v_cur := DBMS_SQL open_cursor;

FOR v_table IN c_td_table

LOOP

v_date := TRUNC (ADD_MONTHS (SYSDATE ) MM );

v_partition := v_table tablename;

FOR i IN v_days

LOOP

BEGIN

sql_stmt :=

ALTER TABLE

|| v_schema

||

|| v_table tablename

|| ADD PARTITION

|| v_partition

|| _

|| TO_CHAR (v_date YYMMDD )

||

|| VALUES LESS THAN (TO_DATE(

|| TO_CHAR (v_date + YYYY MM DD )

|| YYYY MM DD )) ;

DBMS_SQL parse (v_cur sql_stmt DBMS_SQL native);

v_int := DBMS_SQL EXECUTE (v_cur);

EXCEPTION

WHEN OTHERS

THEN

err_msg :=

v_partition

|| : Create

|| TO_CHAR (v_date YYMMDD )

|| partition unsuccessfully! Error Information:

|| SQLERRM;

log_insert (err_msg); You can define your own log_insert function

MIT;

END;

v_date := v_date + ;

END LOOP;

END LOOP;

DBMS_SQL close_cursor (v_cur);

END;

自動刪除過期分區

為了釋放存儲空間並提高大表的性能 要從資料庫中刪除大表中過期的歷史數據 刪除操作可以手工執行 也可以通過系統的任務調度來自動刪除 分區表數據刪除只需要刪除相應的數據分區 與delete相比 有如下好處

u 速度快

u 佔用回滾表空間少

u 產生日誌量少

u 釋放空間

如果有global的索引 刪除分區後需要重建索引

自動刪除分區實現如下

lishixin/Article/program/Oracle/201311/18275

閱讀全文

與oracle大數據怎麼處理相關的資料

熱點內容
壓縮完了文件去哪裡找 瀏覽:380
武裝突襲3浩方聯機版本 瀏覽:674
網路機頂盒移動網路 瀏覽:391
iphone手機百度雲怎麼保存到qq 瀏覽:148
資料庫設計與實踐讀後感 瀏覽:112
js對象是什麼 瀏覽:744
網頁文件存pdf 瀏覽:567
文件夾正裝 瀏覽:279
剛復制的文件找不到怎麼辦 瀏覽:724
試運行適用於哪些體系文件 瀏覽:987
ghost文件復制很慢 瀏覽:967
傑德原車導航升級 瀏覽:240
編程dest是什麼意思 瀏覽:935
linux埠鏡像 瀏覽:820
iphone5屏幕清塵 瀏覽:157
機頂盒密碼怎麼改 瀏覽:672
w7系統下載32位教程 瀏覽:618
pcb文件包括哪些內容 瀏覽:598
g00文件 瀏覽:607
用bat程序刪除程序 瀏覽:516

友情鏈接