① 請問SQLServer資料庫中的Guid類型在Oracle資料庫中對應的是什麼類型怎麼轉換
有點類似JAVA用的UUID,你說的是Uniqueidentifier這個數據類型吧?其實他是對一列數據的描述,這列數據可以版把表中數據設定具有權唯一性,oracle中建議你使用MD5碼這樣的,你可以把數據都拿過來放到16個位元組欄位裡面
② 開機時老是出現DHCP GUID之類的 該怎麼取消呢
啟動到BIOS,修改里純畢旁面的啟動項:做橡好像有三個(primary error automantic)其中好像有兩個的第一啟動項都是network,修數知改為硬碟啟動即可!因為BIOS默認的就是network,很多人都未修改過。
③ 請問ORACLE的SYS_GUID()函數是對於整個資料庫來說都是唯一的嗎
不會,和皮羨或表和資料庫沒有派裂關系
每次調用都會產生新的值燃伍
SQL> select SYS_GUID(), SYS_GUID() from al;
SYS_GUID() SYS_GUID()
-------------------------------- --------------------------------
④ 阿里雲ACP介紹
引言:雲服務是產品的本質,雲組織是未來商業模式的基礎,雲管理是未來效率的基礎。(選自阿里雲 邁異發布會)
首先介紹一下ACP考試。阿里雲認證類似於大家比較熟悉的AWS認證、思科認證、紅帽認證等廠商認證。阿里雲認證分為三級ACA、ACP、ACE。本文章主要針對ACP認證。ACP認證目前又按專業方向分四種:雲計算(主要對應阿里雲基礎架構產品)、大數據(主要對應阿里雲大數據系列產品)、雲安全(主要對應阿里雲雲盾系列產品)、企業級互聯網架構(主要對應阿里雲企業級中間件系列產品)。
ACA:雲計算助力工程師
ACP:雲計算工程師
ACE:雲計算架構師(前提要獲取ACP認證)
阿里雲認證全景路線,請查看: https://e.aliyun.com/certification?spm=5176.8142029.388261.117.e9396d3ery2JHe#guid-03
雲計算工程師ACP詳情,請查看: https://e.aliyun.com/certification/acp01?spm=5176.11999222.1216633.4.31faff1208Rl2K#step=step1
阿里雲認證權益:
阿里雲雲計算專業認證考試(Alibaba Cloud Certified Professional,ACP)
阿里雲雲計算專業認證考試(Alibaba Cloud Certified Professional,ACP)是面向使用阿里雲雲計算產品的架構、開發、運維人員的專業技術認證。
考試認證費用:1200元
考試方式:線下考試,自帶電腦
考試要點:
試卷滿分為100分,考試時間為120分鍾
及格分數:80
答題方式:閉卷
試卷內容:
產品名稱試題比例
雲伺服器 ECS31%
彈性伸縮 (Auto Scaling)10%
負載均衡 SLB17%
專有網路 VPC9%
對象存儲 OSS17%
內容分發網路 CDN3%
安全(雲盾、雲安全)10%
雲計算通用知識3%
試卷題型:
題目類型題目數量分值
單選題及判斷題70題每題1分
多選題30題每題1分
官方推薦的備考策略是:阿里雲官方文檔+官方在線課程+雲計算產品實操。
我們的備考策略是:阿里雲官方文檔+視頻課程+刷題。
阿里雲官方文檔: https://help.aliyun.com/?spm=5176.11273984.1280361.46.cee439ecXaNxOa
免費的視頻課程: http://i.youku.com/acpers
阿里雲刷題: http://c1c.acper.net/index.php?user-app-register&code=1548640137790 (通過該地址注冊,你懂的)
發現一個很不錯的培訓平台(雲頂雲),裡面有很多知識點總結和每日習題, https://www.yundingyun.com/service/train.html
⑤ 如何隨機抽取一個大數據集中的部分紀錄
oracle隨機讀取表中的N條數據方法:
1
2
3
1) select * from (select * from tablename order by sys_guid()) where rownum < N;
2) select * from (select * from tablename order by dbms_random.value) where rownum< N;
3) select * from (select * from table_name sample(10) order by trunc(dbms_random.value(0, 1000))) where rownum < N;
說明:
sample(10)含義為檢索表中的10%數據,sample值應該在[0.000001,99.999999]之間,其中 sys_guid() 和 dbms_random.value都是內部函數
注:
在使1)方法時,即使用sys_guid() 這種方法時,有時會獲取到相同的記錄,即:和前一次查詢的結果集是一樣的(可能是和操作系統有關:windows正常,linux異常;也可能是因為sys_guid()函數本身的問題,有待繼續研究)
所以,為確保在不同的平台每次讀取的數據都是隨機的,建議採用2)和3)兩種方案,其中2)方案更常用。3)方案縮小了查詢的范圍,在查詢大表,且要提取數據不是很不多的情況下,會對查詢速度上有一定的提高
⑥ 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參數 官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入
⑦ 為什麼不用NoSQL
當為大家描述我們的整體服務架構時,最常見的兩個問題是:
為什麼採用結構化方式將數據存儲在SQL資料庫中,而不使用NoSQL平台?
為什麼自己維護數據中心,而不將Evernote託管到雲服務提供商?
這兩個問題都很有趣,我們先來探討第一個。
對特定的應用而言,相比一個單一的SQL實例,一個現代的鍵值存儲引擎具備顯著的性能優勢和可擴展性。
CREATE TABLE notebooks ( id int UNSIGNED NOT NULL PRIMARY KEY, guid binary(16) NOT NULL, user_id int UNSIGNED NOT NULL, name varchar(100) COLLATE utf8_bin NOT NULL, ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE notes ( id int UNSIGNED NOT NULL PRIMARY KEY, guid binary(16) NOT NULL, user_id int UNSIGNED NOT NULL, notebook_id int UNSIGNED NOT NULL, title varchar(255) NOT NULL, ... FOREIGN KEY (notebook_id) REFERENCES notebooks(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果你在Windows客戶端上創建了一個名為「Cooking」的記事本,並立即在其中粘貼了一個名為「Quick Tomato Sauce」的食譜,客戶端會立刻進行如下同步:
調用NoteStore.createNotebook() 請求伺服器創建記事本,並返回以創建記事本的GUID。
通過指定記事本御橡的GUID,調用NoteStore.createNote()在記事本中創建筆記。
每次API調用都通過SQL事物予以實現,可以讓客戶端完全信任伺服器的任何提示。ACID兼容的資料庫可以做到這些:
原子性(Atomicity):如果API調用成功,那麼所有的改動都會保存;如果API調用失敗,所有的改動都不會提交。
一致性(Consistency): 在API調用完成後,所有的賬戶都可用,並能保證內部狀態的一致性。每篇筆記都與記事本相關聯,以避免出現孤立項。資料庫不允許刪除關聯有記事的記事本,這得感謝FOREIGN KEY約束。
持久性(Durability):當伺服器發送記事本已創建完畢的回執後,客戶端會認為它的存在具有持久性,以便進行後續的操作。變更的持久性,可以讓客戶端知道在任何時刻對服務狀態的影響都能保持一致性。
對我們的同步協議而言,持久性最為重要。如果客戶端不能確定伺服器端的變更具有持久性,那麼協議將會變得復雜而低效。
「大數據」問題
得益於事務處理的資料庫的ACID屬性,同樣使得數據集非常難以擴展,以超出單台伺服器的判拆伍范圍。資料庫集群和多主復制技術並不理想,鍵值存儲為實現可擴展性提供了一條捷徑。
所幸,Evernote暫時不需要考慮這個問題。即便是我們有近10億的筆記,和近20億的資源文件,這也並不能稱得上是一個大數據集。通過按用戶分區,它被劃分成了2千萬個獨立的數據集。
我們尚未遇到所謂「大數據」引發的問題,倒是遇到了許多「中數據」的存儲問題,這就是通過規整分區形成的分片存儲架構。
也許以後……
我們對新的存儲系統非常感興趣,非常樂意應用在哪些對ACID要求不強,但確實需要橫向擴展的新項目中。例如,我們的報告分析系統已經逐漸超出了MySQL平台的承受力,需要被更快、更先進的系統所取代。
我掘或們現在對以Evernote用戶元數據為基礎的MySQL分片存儲頗為滿意,盡管這不會引起那些IT弄潮兒的興趣。
⑧ MySQL寫入時只佔用1個線程,其他線程都基本沒動
對資料庫不懂,不過看過這本書,我覺得我們能做的就絕核凳並旅是。
優化索氏歷引,特別是唯一索引。
合理設置啟動參數等。
⑨ 如何實現oracle資料庫大數據增量操作
源表和目復標表 直接哈希分區制 64個
目標表在關聯欄位建本地分區索引 ,分區鍵和索引鍵一樣
目標表的分區最好分到多個表空間上
寫個存儲過程按分區掃源表,操作目標表(更新或插入)
開多個session調存儲過程傳分區為參數
⑩ 實際大網站中mysql的主鍵用int還是guid
使用INT做主鍵的優點:
1、需要很小的數據存儲空間,僅僅需要4 byte 。
2、insert和update操作時使用INT的性能比GUID好,所以使用int將會提高應用程序的性能。
3、index和Join 操作,int的性能最好。
4、容易記憶。
5、支持通過函數獲取最新的值,如:Scope_Indentity() 。
使用INT做主鍵的缺點
1、如果經常有合並表的操作,就可能會出現主鍵重復的情況。
2、使用INT數據范圍有限制。如果存在大量的數據,可能會超出INT的取值范圍。
3、很難處理分布式存儲的數據表。
使用GUID做主鍵的優點:
1、它是獨一無二的。
2、出現重復的機會少。
3、適合大量數據中的插入和更新操作。
4、跨伺服器數據合並非常方便。
使用GUID做主鍵的缺點:
1、存儲空間大(16 byte),因此它將會佔用更多的磁碟大小。
2、很難記憶。join操作性能比int要低。
3、沒有內置的函數獲取最新產生的guid主鍵。
4、GUID做主鍵將會添加到表上的所以其他索引中,因此會降低性能。
總結:
上面列出了GUID和INT兩種數據類型做主鍵優缺點。我覺得,對於大數據量,建議使用guid做主鍵。而使用int會得到最佳的性能。