Ⅰ kettle從oracle向mysql遷移大數據量時報錯,求教
OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用於解決異構數據環境中數據復制的一個商業工具。相比於其它遷移工具OGG的優勢在於可以直接解析源端Oracle的redo log,因此能夠實現在不需要對原表結構做太多調整的前提下完成數據增量部分的遷移。本篇文章將重點介紹如何使用OGG實現Oracle到MySQL數據的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。
(一)OGG邏輯架構
參照上圖簡單給大家介紹下OGG邏輯架構,讓大家對OGG數據同步過程有個簡單了解,後面章節會詳細演示相關進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:
Manager進程:需要源端跟目標端同時運行,主要作用是監控管理其它進程,報告錯誤,分配及清理數據存儲空間,發布閾值報告等
Extract進程:運行在資料庫源端,主要用於捕獲數據的變化,負責全量、增量數據的抽取
Trails文件:臨時存放在磁碟上的數據文件
Data Pump進程:運行在資料庫源端,屬於Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數據直接發送到目標端的Trail文件,如果配置了Data Pump,Extract進程會將數據抽取到本地Trail文件,然後通過Data Pump進程發送到目標端,配置Data Pump進程的主要好處是即使源端到目標端發生網路中斷,Extract進程依然不會終止
Collector進程:接收源端傳輸過來的數據變化,並寫入本地Trail文件中
Replicat進程:讀取Trail文件中記錄的數據變化,創建對應的DML語句並在目標端回放
二、遷移方案
(一)環境信息
OGG版本 OGG 12.2.0.2.2 For Oracle OGG 12.2.0.2.2 For MySQL
資料庫版本 Oracle 11.2.0.4 MySQL 5.7.21
OGG_HOME /home/oracle/ogg /opt/ogg
(二)表結構遷移
表結構遷移屬於難度不高但內容比較繁瑣的一步,我們在遷移表結構時使用了一個叫sqlines的開源工具,對於sqlines工具在MySQL端創建失敗及不符合預期的表結構再進行特殊處理,以此來提高表結構轉換的效率。
注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結構遷移完成後到資料庫切換前盡量不要再修改表結構。
(三)數據遷移
數據同步的操作均採用OGG工具進行,考慮數據全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取資料庫的redo log,待全量抽取結束後開啟增量數據回放,應用全量和增量這段期間產生的日誌數據,OGG可基於參數配置進行重復數據處理,所以使用OGG時優先將增量進行配置並啟用。此外,為了避免本章節篇幅過長,OGG參數將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢任何你不理解的參數。
1.源端OGG配置
(1)Oracle資料庫配置
針對Oracle資料庫,OGG需要資料庫開啟歸檔模式及增加輔助補充日誌、強制記錄日誌等來保障OGG可抓取到完整的日誌信息
查看當前環境是否滿足要求,輸出結果如下圖所示:
(2)Oracle資料庫OGG用戶創建
OGG需要有一個用戶有許可權對資料庫的相關對象做操作,以下為涉及的許可權,該示例將創建一個用戶名和密碼均為ogg的Oracle資料庫用戶並授予以下許可權
(3)源端OGG 管理進程(MGR)配置
(4)源端OGG 表級補全日誌(trandata)配置
表級補全日誌需要在最小補全日誌打開的情況下才起作用,之前只在資料庫級開啟了最小補全日誌(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補全日誌以獲得必要的信息。
(5)源端OGG 抽取進程(extract)配置
Extract進程運行在資料庫源端,負責從源端數據表或日誌中捕獲數據。Extract進程利用其內在的checkpoint機制,周期性地檢查並記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機制是為了保證如果Extract進程終止或者操作系統宕機,我們重啟Extract進程後,GoldenGate能夠恢復到以前的狀態,從上一個斷點處繼續往下運行,而不會有任何數據損失。
(6)源端OGG 傳輸進程(pump)配置
pump進程運行在資料庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那麼pump進程就會把trail文件以數據塊的形式通過TCP/IP協議發送到目標端,Pump進程本質上是Extract進程的一種特殊形式,如果不使用trail文件,那麼Extract進程在抽取完數據後,直接投遞到目標端。
補充:pump進程啟動時需要與目標端的mgr進程進行連接,所以需要優先將目標端的mgr提前配置好,否則會報錯連接被拒絕,無法傳輸抽取的日誌文件到目標端對應目錄下
(7)源端OGG 異構mapping文件(defgen)生成
該文件記錄了源庫需要復制的表的表結構定義信息,在源庫生成該文件後需要拷貝到目標庫的dirdef目錄,當目標庫的replica進程將傳輸過來的數據apply到目標庫時需要讀寫該文件,同構的資料庫不需要進行該操作。
2.目標端OGG配置
(1)目標端MySQL資料庫配置
確認MySQL端表結構已經存在
MySQL資料庫OGG用戶創建
mysql> create user 'ogg'@'%' identified by 'ogg';
mysql> grant all on *.* to 'ogg'@'%';
#### 提前創建好ogg存放checkpoint表的資料庫
mysql> create database ogg;
(2)目標端OGG 管理進程(MGR)配置
目標端的MGR進程和源端配置一樣,可直接將源端配置方式在目標端重復執行一次即可,該部分不在贅述
(3)目標端OGG 檢查點日誌表(checkpoint)配置
checkpoint表用來保障一個事務執行完成後,在MySQL資料庫從有一張表記錄當前的日誌回放點,與MySQL復制記錄binlog的GTID或position點類似。
#### 切換至ogg軟體目錄並執行ggsci進入命令行終端
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit param ./GLOBALS
checkpointtable ogg.ggs_checkpoint
ggsci> dblogin sourcedb [email protected]:3306 userid ogg
ggsci> add checkpointtable ogg.ggs_checkpoint
(4)目標端OGG 回放線程(replicat)配置
Replicat進程運行在目標端,是數據投遞的最後一站,負責讀取目標端Trail文件中的內容,並將解析其解析為DML語句,然後應用到目標資料庫中。
#### 切換至ogg軟體目錄並執行ggsci進入命令行終端
shell> cd $OGG_HOME
shell> ggsci
#### 添加一個回放線程並與源端pump進程傳輸過來的trail文件關聯,並使用checkpoint表確保數據不丟失
ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint
#### 增加/編輯回放進程配置文件
ggsci> edit params r_cms
replicat r_cms
targetdb [email protected]:3306,userid ogg,password ogg
sourcedefs /opt/ogg/dirdef/cms.def
discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024
HANDLECOLLISIONS
MAP cms.*,target cms.*;
注意:replicat進程只需配置完成,無需啟動,待全量抽取完成後再啟動。
至此源端環境配置完成
待全量數據抽取完畢後啟動目標端回放進程即可完成數據准實時同步。
3.全量同步配置
全量數據同步為一次性操作,當OGG軟體部署完成及增量抽取進程配置並啟動後,可配置1個特殊的extract進程從表中抽取數據,將抽取的數據保存到目標端生成文件,目標端同時啟動一個單次運行的replicat回放進程將數據解析並回放至目標資料庫中。
(1)源端OGG 全量抽取進程(extract)配置
#### 切換至ogg軟體目錄並執行ggsci進入命令行終端
shell> cd $OGG_HOME
shell> ggsci
#### 增加/編輯全量抽取進程配置文件
#### 其中RMTFILE指定抽取的數據直接傳送到遠端對應目錄下
#### 注意:RMTFILE參數指定的文件只支持2位字元,如果超過replicat則無法識別
ggsci> edit params ei_cms
SOURCEISTABLE
SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
SETENV (ORACLE_SID=cms)
SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)
USERID ogg@appdb,PASSWORD ogg
RMTHOST 17X.1X.84.121,MGRPORT 7809
RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge
TABLE cms.*;
#### 啟動並查看抽取進程正常
shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &
## 查看日誌是否正常進行全量抽取
shell> tail -f ./dirrpt/ei_cms.rpt
(2)目標端OGG 全量回放進程(replicat)配置
#### 切換至ogg軟體目錄並執行ggsci進入命令行終端
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit params ri_cms
SPECIALRUN
END RUNTIME
TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg
EXTFILE /opt/ogg/dirdat/ms
DISCARDFILE ./dirrpt/ri_cms.dsc,purge
MAP cms.*,TARGET cms.*;
#### 啟動並查看回放進程正常
shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &
#### 查看日誌是否正常進行全量回放
shell> tail -f ./dirrpt/ri_cms.rpt
三、數據校驗
數據校驗是數據遷移過程中必不可少的環節,本章節提供給幾個數據校驗的思路共大家參數,校驗方式可以由以下幾個角度去實現:
1.通過OGG日誌查看全量、增量過程中discards記錄是否為0來判斷是否丟失數據;
2.通過對源端、目標端的表執行count判斷數據量是否一致;
3.編寫類似於pt-table-checksum校驗原理的程序,實現行級別一致性校驗,這種方式優缺點特別明顯,優點是能夠完全准確對數據內容進行校驗,缺點是需要遍歷每一行數據,校驗成本較高;
4.相對折中的數據校驗方式是通過業務角度,提前編寫好數十個返回結果較快的SQL,從業務角度抽樣校驗。
四、遷移問題處理
本章節將講述遷移過程中碰到的一些問題及相應的解決方式。
(一)MySQL限制
在Oracle到MySQL的表結構遷移過程中主要碰到以下兩個限制:
1. Oracle端的表結構因為最初設計不嚴謹,存在大量的列使用varchar(4000)數據類型,導致遷移到MySQL後超出行限制,表結構無法創建。由於MySQL本身數據結構的限制,一個16K的數據頁最少要存儲兩行數據,因此單行數據不能超過65,535 bytes,因此針對這種情況有兩種解決方式:
根據實際存儲數據的長度,對超長的varchar列進行收縮;
對於無法收縮的列轉換數據類型為text,但這在使用過程中可能導致一些性能問題;
2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字元集時,最多隻能對varchar(768)的列創建索引;
3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導入時由於各表的插入順序不唯一,可能子表先插入數據而主表還未插入,導致報錯子表依賴的記錄不存在,因此建議數據遷移階段禁用主外鍵約束,待遷移結束後再打開。
mysql>set global foreign_key_checks=off;
(二)全量與增量銜接
HANDLECOLLISIONS參數是實現OGG全量數據與增量數據銜接的關鍵,其實現原理是在全量抽取前先開啟增量抽取進程,抓去全量應用期間產生的redo log,當全量應用完成後,開啟增量回放進程,應用全量期間的增量數據。使用該參數後增量回放DML語句時主要有以下場景及處理邏輯:
目標端不存在delete語句的記錄,忽略該問題並不記錄到discardfile
目標端丟失update記錄
- 更新的是主鍵值,update轉換成insert
- 更新的鍵值是非主鍵,忽略該問題並不記錄到discardfile
目標端重復insert已存在的主鍵值,這將被replicat進程轉換為UPDATE現有主鍵值的行
(三)OGG版本選擇
在OGG版本選擇上我們也根據用戶的場景多次更換了OGG版本,最初因為客戶的Oracle 資料庫版本為11.2.0.4,因此我們在選擇OGG版本時優先選擇使用了11版本,但是使用過程中發現,每次數據抽取生成的trail文件達到2G左右時,OGG報錯連接中斷,查看RMTFILE參數詳細說明了解到trail文件默認限制為2G,後來我們替換OGG版本為12.3,使用MAXFILES參數控制生成多個指定大小的trail文件,回放時Replicat進程也能自動輪轉讀取Trail文件,最終解決該問題。但是如果不幸Oracle環境使用了Linux 5版本的系統,那麼你的OGG需要再降一個小版本,最高只能使用OGG 12.2。
(四)無主鍵表處理
在遷移過程中還碰到一個比較難搞的問題就是當前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因為很容易導致性能問題和主從延遲。同時在OGG遷移過程中表沒有主鍵也會產生一些隱患,比如對於沒有主鍵的表,OGG默認是將這個一行數據中所有的列拼湊起來作為唯一鍵,但實際還是可能存在重復數據導致數據同步異常,Oracle官方對此也提供了一個解決方案,通過對無主鍵表添加GUID列來作為行唯一標示,具體操作方式可以搜索MOS文檔ID 1271578.1進行查看。
(五)OGG安全規則
報錯信息
2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.
錯誤信息含義源端報錯表示為該抽取進程需要和目標端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標端mgr進行溝通,遠程將目標的replicat進行啟動,由於安全性現在而被拒絕連接。
報錯原因
在Oracle OGG 11版本後,增加了新特性安全性要求,如果需要遠程啟動目標端的replicat進程,需要在mgr節點增加訪問控制參數允許遠程調用
解決辦法
在源端和目標端的mgr節點上分別增加訪問控制規則並重啟
## 表示該mgr節點允許(ALLOW)10.186網段(IPADDR)的所有類型程序(PROG *)進行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW
(六)數據抽取方式
報錯信息
2019-03-15 14:49:04 ERROR OGG-01192 Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').
報錯原因
根據官方文檔說明,當前直接通過Oracle資料庫抽取數據寫到MySQL這種initial-load方式,不支持LOBs數據類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB欄位,無法進行傳輸,並且該方式不支持超過4k的欄位數據類型
解決方法
將抽取進程中的RMTTASK改為RMTFILE參數 官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入
Ⅱ 大數據開發中執行sql處理大量數據前怎麼測試sql寫的對不對
要保存數抄據到資料庫,VB自帶的功能是無法完成的,除非你用普通的文件保存數據。
用ADO相對簡單,對於你的問題只要一個Connection對象。用它連接資料庫,用它的Execute方法來執行更新數據的SQL語句。
如果你的輸入跟資料庫欄位直接對應,也可以使用數據綁定的辦法,用ADODC控制項獲取數據,並將文本框跟ADODC綁定。
Ⅲ 如何實現在線更新SQL Server千萬級記錄大表
還需要看你硬碟讀寫速度 7200轉的話應該4千萬左右為大數據的閾值 BulkCopy
小於4000萬的話,起事務批量更新,在線的話,你需要做一個主從庫,從庫用來讀,就不會影響到用戶訪問
Ⅳ mysql大數據批量更新,欄位concat追加字元串,越來越慢怎麼解決
取決於欄位=concat_ws.
這個欄位有沒有索引
+
會不會需要被索引.
'''
如是道(提問者回)
沒有索引,不需要被索引。
'''
如果是這答樣,
就應該把這個欄位丟到另外一張表,
基本上原則就是"separate
what
varies
from
what
stays
the
same."
。
Ⅳ ORACLE怎麼批量UPDATE
excel導入ORACLE的四個方法
EXCEL里導入ORACLE有四種方法,
1 使用sql *loader
SQL*LOADER是oracle的數據載入工具,在NT下sql*loader的命令為SQLLDR,在UNIX下一般為SQLLDR/SQLLOAD。通常用來將操作系統文件遷移到oracle資料庫中。它是大型數據倉庫選擇使用的載入方法,因為它提供了最快速的途徑(direct,parallel)。但這種方法要求存儲數據的oracle表是已經存在的。
使用這種方法導入excel內容到oracle時,首先需要將excel文件另存為文本格式,文件類型選文本類型或者csv類型即將e:\test.xls另存為e:\test.csv。
如果oracle沒有對應存儲數據的表結構,則需要創建表test(id,name,telphone)。
用記事本創建sql*loader控制文件test.ctl(ctl後綴是企圖證明這是一個控制文件,但實際上這個文件後綴不重要,用戶可以自由選擇,但文件格式一定要是文本格式),內容如下:
Load data
Infile 『e:\test.csv』 --數據源文件名稱
Append|insert|replace --append在表後追加,insert插入空表,replace替代原有內容
Into table test --要導入的資料庫表名稱
[when id = id_memo] --過濾條件
Fields terminated by X』09』 --欄位分隔符
(id,name,telphone) --欄位名稱列表
最後在命令窗口輸入sqlldr命令行執行導入操作Sqlldr userid = system/manager control=』e:\test.ctl』
Sqlldr的函數關鍵字說明:
Userid --oracle用戶名 userid = username/password
Control --控制文件名稱 control = 『e:\insert.ctl』
Log –-日誌文件名稱 log = 『e:\insert.log』
Bad --損壞文件名稱
Data --data file name
Discard --discard file name
Discardmax --number of discards to allow(默認全部)
Skip --導入時跳過的記錄行數(默認0)
Load --導入時導入的記錄行數(默認全部)
Errors --允許錯誤的記錄行數(默認50)
2 使用plsql developer
PL/SQL Developer是一種專門用於開發、測試、調試和優化oracle PL/SQL存儲程序單元,比如觸發器,存儲過程,函數和程序包等集成開發環境。
在單個文件數據不多(小於10w行),並且目的表結構已經存在的情況下可以使用plsql developer工具將excel內容直接通過簡單的,paste操作導入oracle資料庫。具體操作方式如下:
l 在plsql developer的sql window里輸入select * from test for update,其中test是要導入的oracle數據表名稱;
l 執行查詢(通過點擊按鈕或者快捷鍵F8可以實現);
l 點擊查詢結果上面的鎖狀按鈕,使得查詢到的內容處於編輯狀態。
l 從excel數據表中(ctrl +C)要導入oracle中的數據,如果是單列數據導入,可以先按plsql developer中查詢結果上面的「添加(+)」按鈕,使得數據表處於添加數據狀態,然後將滑鼠在plsql developer的列名稱上單擊,最後使用快捷鍵ctrl + v 完成數據導入操作,並單擊plsql developer中的「提交(對號)」按鈕提交所做的修改。
l 如果是同時導入所有列,首先選擇所有數據,然後點增加(+)並點擊編輯那一行最前面的星號使得整行數據都處於被選擇狀態,最後paste即可將數據導入。
l 如果分列導入數據,則需要逐列完成,首先選擇要導入的數據,然後然後點增加(+)並點擊編輯那一列的名稱,使得整列數據都處於被選擇狀態,最後paste即可將數據導入。
使用PLSQL developer執行數據的導入和導出操作主要存在的問題是在大數據量情況下對中文數據可能出錯,估計將接收數據表的類型定義為nvarchar2的類型會比較好一點。另外,就是這種方法需要人工更多的參與,不能達到自動導入的效果。
3 使用破解版的XLSTOORACLE,這個工具最簡單了,快捷方便,強烈推薦之!
Ⅵ sql server如何批量更新數據。
update表名setvalue=casewhenid=1then一個值
whenid=2then一個值
whenid=3then一個值elsevalue
end
上邊就是舉個例子,意思是,當id=1時,把專value設定個值,當id=2時,value設定另一屬個值,依次類推,不需要更改的保留原來的value值,最後以end結尾
Ⅶ 關於sql資料庫數據同步更新的問題
環境:兩台windows xp系統機器,並且安裝同一版本的資料庫5.0.17
兩台機器Ip
A:173.26.100.62
B:173.26.100.61
此例為A為主伺服器,B為從伺服器,A伺服器上的數據變更會更新到B伺服器資料庫當中
步驟:
1 .A機器上創建資料庫tsas,設置資料庫訪問許可權,也就是創建一個用戶和密碼,目的在於在B機器上用創建的這個用戶能夠正常連接A機器的資料庫。
grant file on *.* to backup@'173.26.100.61' identified by '1234';
2.在A伺服器的mysql目錄下編輯my.ini,加入如下語句:
server-id=1
log-bin=C:\mysqlbak\log-bin.log
3.重起A機器,可以用命令show master status 察看狀態
4 設置B伺服器,打開B機器mysql目錄下的my.ini,加入以下語句:
server-id=2
master-host=173.26.100.62
master-user=backup #同步用戶帳號
master-password=1234
master-port=3306
master-connect-retry=60 預設重試間隔60秒
replicate-do-db=tsas 告訴slave只做backup資料庫的更新
5.重新啟動B機器,可以用命令 show slave status察看B機器狀態
6.測試:
向A批量插入大數據量數據,那麼在B機器當中察看相關的表格,B機器與A機器中的數據是一致的,這樣就可以達到B機器同步A機器的數據。
Ⅷ 關於mysql大數據查詢,修改。請問有什麼方法可以保證性能
MySQL一個表100萬記錄不算大,我用到過單表中上億的記錄,只要規劃好,一樣的飛快。
第一考慮在大吞吐情況下的數據安全,按照個人經驗,第一推薦選用Innodb的方式,MyISAM的引擎雖然查詢高效,但是在高I/O的情況下,一旦出問題,如何進行數據修復是讓人崩潰的事情。而且Innodb支持事務,如果執行不成功,會自動回滾。
第二如果你的數據表基本上都是程序在訪問,那麼在定製索引的時候要好好考慮一下,把你常用的檢索條件在一起做復合索引,這會比分離的單鍵索引在數度上是數量級的提高。還有就是在你的程序裡面約定好篩選條件的順序,這個順序一定要和你定製的復合索引從左到右一致。
第三如果你的程序牽扯到多表的聯合,建議使用存儲過程,這樣避免在TCP/IP I/O資源的堵塞,另外存儲過程的使用過程中和具體使用的表之間的索引優化。針對特別常見的組合也可以使用view的方式創建。
第四在程序裡面使用SQL要遵循如下經驗:
- 不要在程序裡面對SQL使用循環,或把可以通過SQL計算的東西讓程序處理,盡量把運算交給MySQL伺服器去做
- 使用SQL的時候盡量符合自己表定義索引,不要已經索引的欄位進行函數計算,這樣會導致索引無效
其實性能主要是靠前期的規劃,規劃設計好,無論是資料庫和客戶端都按照規劃去做,性能一般差不了哪裡去。
Ⅸ 如何處理大量數據並發操作
處理大量數據並發操作可以採用如下幾種方法:
1.使用緩存:使用程序直接保存到內存中。或者使用緩存框架: 用一個特定的類型值來保存,以區別空數據和未緩存的兩種狀態。
2.資料庫優化:表結構優化;SQL語句優化,語法優化和處理邏輯優化;分區;分表;索引優化;使用存儲過程代替直接操作。
3.分離活躍數據:可以分為活躍用戶和不活躍用戶。
4.批量讀取和延遲修改: 高並發情況可以將多個查詢請求合並到一個。高並發且頻繁修改的可以暫存緩存中。
5.讀寫分離: 資料庫伺服器配置多個,配置主從資料庫。寫用主資料庫,讀用從資料庫。
6.分布式資料庫: 將不同的表存放到不同的資料庫中,然後再放到不同的伺服器中。
7.NoSql和Hadoop: NoSql,not only SQL。沒有關系型資料庫那麼多限制,比較靈活高效。Hadoop,將一個表中的數據分層多塊,保存到多個節點(分布式)。每一塊數據都有多個節點保存(集群)。集群可以並行處理相同的數據,還可以保證數據的完整性。
拓展資料:
大數據(big data),指無法在一定時間范圍內用常規軟體工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。
在維克托·邁爾-舍恩伯格及肯尼斯·庫克耶編寫的《大數據時代》中大數據指不用隨機分析法(抽樣調查)這樣捷徑,而採用所有數據進行分析處理。大數據的5V特點(IBM提出):Volume(大量)、Velocity(高速)、Variety(多樣)、Value(低價值密度)、Veracity(真實性)。
Ⅹ hibernate如何避免復雜查詢,優化大數據,和批量sql語句求答案
------解決方案--------------------------------------------------------
Hibernate 是一個優秀的 ORM 框架,但不是高效的。
大數據量的查詢,以及需要使用本地資料庫語言對 SQL 進行逐步調優的應用不適合使用 Hibernate
------解決方案--------------------------------------------------------
僅僅是查詢,沒有問題。hibernate的分頁也已經針對不同的資料庫進行了優化的
比如oracle,hibernate就採用的是oracle最快的分頁方式,具體的可以去看OracleDialect源代碼
其他的資料庫也是
get或者load是獲取一條數據,這里都需要用延遲載入的
批量sql的時候,需要設置batch size,並且關閉二級緩存,同時使用flush來同步資料庫,在使用clear來清空session緩存,這樣不至於內存溢出
,hibernte文檔上有這個例子
或者用存儲過程,如果你了解hibernate你就會用他的長處,而避免其短處
------解決方案--------------------------------------------------------
hibernate的查詢緩存key是查詢語句,但是key對應的value其實是資料庫表的主鍵
當查詢被緩存後,再次調用查詢的時候,通過key找到對應的id集合,然後一個一個的去class緩存中去load
class里沒有,再去資料庫中獲取。所以這又涉及到類緩存上了,當用hibernate進行資料庫的修改和刪除等操作的時候,都會更新一二級緩存,所以查詢緩存會獲取最新的數據
------解決方案--------------------------------------------------------