【GaussDB國慶獻(xiàn)禮】GaussDB 100 HA架構(gòu)技術(shù)建議書(2)
3????? 數(shù)據(jù)庫功能
3.1????? 表和索引
3.1.1??????? 表的存儲:segemnt和extent
(1)Segment對應(yīng)一個(gè)表或索引,如果分區(qū),則對應(yīng)一個(gè)最小分區(qū)。
(2)Extent是一段連續(xù)的磁盤空間,當(dāng)Segment沒有空閑空間時(shí),向表空間申請一個(gè)空閑的extent。
(3)Extent的默認(rèn)大小為64K,使用大的extent可以提升全表掃描的效率。930版本支持動態(tài)extent。
3.1.2??????? 表的存儲:Page
頁由Page head、tail校檢碼、row dir、row組成。
?? Page head:頁面ID、Last SCN、size、ITL count、extent鏈表前驅(qū)和后驅(qū)節(jié)點(diǎn)。
?? Page tail:CRC校檢碼,用于完整性校檢
?? Row directory:Slot偏移地址字典,可以通過slot id查找slot在頁中的位置。
?? Row:數(shù)據(jù)行,對應(yīng)表中的一條數(shù)據(jù)。
Rowid = File ID + Page ID + Slot ID,通過Rowid可以定位到一行數(shù)據(jù)。
3.1.3??????? 表的分類
表的類型
類型說明
樣例
普通表(Heap)
數(shù)據(jù)全局可見,存儲在普通表空間,支持分區(qū)和lob類型
會話級全局臨時(shí)表
數(shù)據(jù)會話級可見,存儲在temp表空間,不支持分區(qū)和lob類型
create ? ? ?global temporary table t1
(
sql_id????????????????????????????? ? ? ?varchar(100) primary key,
sql_text??????????????????????????? ? ? ?varchar(1000)
)
on commit ? ? ?preserve rows
事務(wù)級全局臨時(shí)表
數(shù)據(jù)事務(wù)級可見,存儲在temp表空間,不支持分區(qū)和lob類型
create ? ? ?global temporary table t2
(
sql_id????????????????????????????? ? ? ?varchar(100) primary key,
sql_text??????????????????????????? ? ? ?varchar(1000)
)
on commit ? ? ?delete rows
本地臨時(shí)表
表結(jié)構(gòu)會話級可見,存儲在temp表空間,不支持分區(qū)和lob類型,表名必須以#為前綴
create ? ? ?temporary table #t3
(
sql_id????????????????????????????? ? ? ?varchar(100) primary key,
sql_text??????????????????????????? ? ? ?varchar(1000)
)
Nologging表
數(shù)據(jù)全局可見,存儲在temp2空間,支持分區(qū)和lob類型
create ? ? ?table t4
(
sql_id????????????????????????????? ? ? ?varchar(100) primary key,
sql_text??????????????????????????? ? ? ?varchar(1000)
)
nologging
3.1.4??????? B樹索引的結(jié)構(gòu)
?? 只支持B-Tree索引,不支持Hash、位圖等其他類型的索引
?? 樹的頂層是根頁,根頁面存放下一層每個(gè)樹枝節(jié)點(diǎn)的最小key值
?? Key的順序?yàn)樯?,頁面?nèi)升序搜索使用二分查找
?? 樹干節(jié)點(diǎn)的每個(gè)key值保存指向下層節(jié)點(diǎn)的指針(page id)
?? 葉子節(jié)點(diǎn)每個(gè)key值存放指向數(shù)據(jù)行的指針(row id),所有key都保存索引字段值
?? 掃描到葉子層后的橫向掃描,是為了支持范圍掃描
?? 與Oracle不同,高斯的B-Tree索引中包含key為null的數(shù)據(jù)
3.2????? 常用數(shù)據(jù)庫對象
對象
使用限制
比Oracle多的能力
表
1.索引列的定義長度最大為3900字節(jié)
2.不支持二級分區(qū)
3.不支持分區(qū)的合并、置換等高級能力
4.varchar最大長度是8000字節(jié)
1.不僅支持序列,還支持自增列
2.支持MySQL的二級制類型binary、varbinary和longblob
3.支持bool類型
4.支持?jǐn)?shù)組、JSON類型
觸發(fā)器
1.不支持語法referenceing new as new
1.支持在會話級disable所有觸發(fā)器
存儲過程
1.不支持自定義類型、hash表
2.930版本開始支持package
NA
視圖
1.不支持對視圖做DML操作
NA
序列
NA
NA
Job
1.不支持修改Job的內(nèi)容,需要重建
NA
時(shí)區(qū)
1.只支持?jǐn)?shù)字形式時(shí)區(qū)'+12:00'
NA
咨詢鎖
NA
1.不僅支持會話級,還支持事務(wù)級咨詢鎖
2.支持排他和共享咨詢鎖
同義詞
NA
NA
3.3????? 常用系統(tǒng)函數(shù)&操作符
參見<<開發(fā)者指南>>。
3.4????? 常用高級包
包名
描述
DBMS_DEBUG
用于對存儲過程(含自定義函數(shù),觸發(fā)器)的運(yùn)行過程調(diào)試。
DBMS_LOB
用于處理LOB類型數(shù)據(jù)。
DBMS_LOCK
用于提供鎖管理服務(wù)。
DBMS_JOB
用于執(zhí)行定時(shí)任務(wù)功能。
DBMS_OUTPUT
用于調(diào)試存儲過程、函數(shù),或者在zsql命令中顯示信息。
DBMS_RAFT
用于GS-Paxos主備維護(hù)的包。
DBMS_RANDOM
提供的內(nèi)置隨機(jī)數(shù)生成器,用于生成隨機(jī)的數(shù)字、字符。
DBMS_SQL
用于執(zhí)行SQL語句的包。
DBMS_STANDARD
標(biāo)準(zhǔn)包,用于事務(wù)管理、異常處理。
DBMS_STATS
用于優(yōu)化統(tǒng)計(jì)的包。
DBMS_UTILITY
用于數(shù)據(jù)類型處理和計(jì)算的包。
3.5????? 常用性能視圖
3.5.1??????? 實(shí)例
視圖名
視圖說明
別名
DV_SYS_STATS
實(shí)例級性能數(shù)據(jù)的累計(jì)值,包括SQL的每個(gè)步驟的執(zhí)行時(shí)間、產(chǎn)生的redo、邏輯讀、物理讀等數(shù)據(jù)。
V$SYSSTAT
DV_SYS_EVENTS
實(shí)例級等待事件的累計(jì)值,等待事件是重要的性能指標(biāo),一段時(shí)間的Top 等待時(shí)間反映了該時(shí)間段的性能瓶頸
V$SYSTEM_EVENT
DV_SYSTEM
當(dāng)前操作系統(tǒng)的CPU/MEM使用情況,該數(shù)據(jù)直接從操作系統(tǒng)讀取,包括CPU使用和虛擬內(nèi)存換入換出的累計(jì)值
V$SYSTEM
DV_WAIT_STATS
data buffer ? ? ? 中各類型的block的等待,對應(yīng)buffer busy wait等待事件
V$WAITSTAT
3.5.2??????? 內(nèi)存
視圖名
視圖說明
別名
DV_BUFFER_POOL_STATS
當(dāng)前BUFFER_POOL的使用統(tǒng)計(jì)情況,顯示空閑頁、常駐頁、臟頁等數(shù)量
V$BUFFER_POOL_STATISTICS
DV_GMA
當(dāng)前申請的內(nèi)存信息,高斯內(nèi)存是預(yù)分配,和配置的參數(shù)一致
V$SGA
DV_GMA_STATS
當(dāng)前SGA內(nèi)存的統(tǒng)計(jì)項(xiàng),包括shared pool和large pool的詳細(xì)統(tǒng)計(jì)
V$SGASTAT
DV_DC_POOLS
當(dāng)前DC池的情況
V$DC_POOL
DV_PL_MANAGER
存儲過程加載到內(nèi)存的情況
V$PL_MANAGER
DV_LIBRARY_CACHE
共享池中SQL語句的管理信息
V$LIBRARYCACHE
DV_TEMP_POOLS
當(dāng)前TEMP_POOL的分配情況
V$TEMP_POOL
DV_VM_FUNC_STACK
未釋放VM申請時(shí)的函數(shù)堆棧信息,當(dāng)系統(tǒng)發(fā)生疑似VM泄露時(shí),可以配置_MAX_VM_FUNC_STACK_COUNT,啟動該視圖能力
V$VM_FUNC_STACK
3.5.3??????? 會話、連接和事務(wù)
視圖名
視圖說明
別名
DV_SESSIONS
當(dāng)前所有的會話情況
V$SESSION
DV_SESSION_EVENTS
會話的所有的等待事件
V$SESSION_EVENT
DV_SESSION_WAITS
會話當(dāng)前的等待事件
V$SESSION_WAIT
DV_OPEN_CURSOR
當(dāng)前打開的游標(biāo)狀態(tài)
V$OPEN_CURSOR
DV_REACTOR_POOLS
連接池和對應(yīng)工作線程池信息
V$REACTOR_POOL
DV_SPINLOCKS
當(dāng)前所有會話對SPINLOCK的使用情況,spin_lock是自旋鎖,鎖住的語句太長開銷比較大 一般是控制一個(gè)結(jié)構(gòu)體變量在修改時(shí)不被別人修改
V$SPINLOCK
DV_TRANSACTIONS
當(dāng)前的事務(wù)信息
V$TRANSACTION
3.5.4??????? SQL
視圖名
視圖說明
別名
DV_SQLS
SQL的DML語句執(zhí)行情況
V$SQLAREA
DV_SQL_POOL
當(dāng)前系統(tǒng)SQLPOOL使用情況
V$SQLPOOL
DV_LONG_SQL
長SQL的日志
V$LONGSQL
3.5.5??????? 鎖
視圖名
視圖說明
別名
DV_LOCKS
當(dāng)前鎖資源情況
V$LOCK
DV_LOCKED_OBJECTS
鎖對象的信息
V$LOCKED_OBJECT
DV_USER_ADVISORY_LOCKS
使用中的會話級咨詢鎖信息
V$USER_ADVISORY_LOCKS
DV_LATCH
當(dāng)前結(jié)構(gòu)鎖的使用情況,latch一般是結(jié)構(gòu)鎖,有共享鎖,排他鎖之分,粒度大
V$LATCH
3.5.6??????? Segment
視圖名
視圖說明
別名
DV_SEGMENT_STATS
數(shù)據(jù)庫中的heap和index等對象的使用情況
V$SEGMENT_STATISTICS
DV_UNDO_SEGMENTS
undo ? ? ?segment隊(duì)列的實(shí)時(shí)狀態(tài)信息
V$UNDO_SEGMENT
DV_TEMP_UNDO_SEGMENT
所有temp ? ? ?undo segment隊(duì)列的實(shí)時(shí)狀態(tài)信息
V$TEMP_UNDO_SEGMENT
3.5.7??????? HA
視圖名
視圖說明
別名
DV_ARCHIVE_GAPS
備用數(shù)據(jù)庫上的存檔間隙的信息
V$ARCHIVE_GAP
3.6????? 常用SQL語法
參見<<開發(fā)者指南>>。
4????? 應(yīng)用開發(fā)
4.1????? 用戶表空間和schema
?? 表空間EXTENTS參數(shù)
一個(gè)extent里包含的頁面數(shù)。不指定EXTENTS時(shí),默認(rèn)一個(gè)extent包含8個(gè)頁面。
增大單個(gè)extent的頁面數(shù)量可以提高IO性能,但如果表空間下存在小表(數(shù)據(jù)量未達(dá)到一個(gè)extent大小),會導(dǎo)致空間浪費(fèi)。
說明:930版本會實(shí)現(xiàn)動態(tài)extent,那么就不用設(shè)置該參數(shù)了。
?? 表空間AUTOEXTEND
如果使用自動擴(kuò)展,對大批量的insert會有一定程度的性能損失,如果對性能要求很高,建議不使用自動擴(kuò)展。
?? ALL-IN-MEMORY表空間
默認(rèn)表空間都是頁面通過databuff的hash尋址方式訪問,帶頁面淘汰和加載的機(jī)制;內(nèi)存表空間為了加速訪問,把數(shù)據(jù)全部pin在內(nèi)存不進(jìn)行盤交換,并且使用pageid進(jìn)行基于偏移的直接尋址。除系統(tǒng)表空間之外的所有表空間在創(chuàng)建時(shí)都支持指定ALL-IN-MEMORY屬性。
?? schema默認(rèn)表空間
創(chuàng)建schema要指定默認(rèn)表空間,schema和表空間最好一一對應(yīng),方便按照表空間物理備份,不強(qiáng)制要求。
技術(shù)建議:
1.EXTENT對IO影響非常大,如果使用的版本未實(shí)現(xiàn)動態(tài)EXTENT,建議調(diào)大表的EXTENT。
2. AUTOEXTEND對大批量的INSERT會有一定程度的性能損失,建議提前擴(kuò)展好。
3.內(nèi)存表需要指定ALL-IN-MEMORY表空間。
4.禁止使用SYSTEM表空間保存業(yè)務(wù)對象。
4.2????? 表的設(shè)計(jì)
4.2.1??????? 表的設(shè)計(jì)一般原則
設(shè)計(jì)點(diǎn)
建議方案
可能產(chǎn)生的問題
單表(非分區(qū)表)的規(guī)模
數(shù)據(jù)量<5000萬,空間占用<100G
表過大會導(dǎo)致數(shù)據(jù)非常離散,根據(jù)索引掃描數(shù)據(jù)時(shí)物理讀高,并且索引的層高也會變大
表/分區(qū)的數(shù)量
總數(shù)量<10萬
Segment過多會產(chǎn)生大量的統(tǒng)計(jì)信息,系統(tǒng)表空間會增大,同時(shí)share pool的DC占用也會變多,buffer pool需要保存Segment頭,內(nèi)存消耗會增大
約束
唯一、非空約束由數(shù)據(jù)庫約束保證
如果由業(yè)務(wù)保證唯一和非空約束比較麻煩,容易產(chǎn)生垃圾數(shù)據(jù)
列的類型
1.時(shí)間類型用日期類型,不要使用字符串
2.長字符串使用clob,而不要用varchar
時(shí)間類型使用字符串占用的空間多,處理也容易出錯(cuò);列中包括長字符串容易出現(xiàn)行遷移和行鏈接
列的個(gè)數(shù)和長度
個(gè)數(shù)<200,行長度<8000字節(jié)
列過長容易出現(xiàn)行遷移和行鏈接,并且每個(gè)數(shù)據(jù)只能保留幾條數(shù)據(jù),索引掃描的效率會比較低
Extent的大小
當(dāng)前還不支持動態(tài)extent,對于大表,Extent設(shè)置為1M或8M
默認(rèn)extent是64K,對大表做全表掃描時(shí)IO效率低,增大extent,一次IO可以掃描更多的數(shù)據(jù)塊,減少IO次數(shù)
數(shù)據(jù)的更新
避免數(shù)據(jù)更新后變長,避免大量并發(fā)更新同一個(gè)數(shù)據(jù)塊,避免對索引列的大量更新
如果把數(shù)據(jù)更新后變長,容易出現(xiàn)行遷移和ITL等待,需要調(diào)大PCTFREE;并發(fā)更新同一個(gè)數(shù)據(jù)塊可能產(chǎn)生大量的buffer busy wait等待;大量更新索引列也會產(chǎn)生大量空塊和索引傾斜,update效率也會降低
數(shù)據(jù)的刪除
大批量數(shù)據(jù)的刪除使用刪除分區(qū)的方式,而不要用delete的方式
如果使用delete方式刪除大量數(shù)據(jù),不僅效率低,而且可能導(dǎo)致索引產(chǎn)生大量空塊和索引傾斜的問題
4.2.2??????? 分區(qū)的設(shè)計(jì)
分區(qū)類型
類型說明
適用場景
示例
Range
用戶創(chuàng)建分區(qū),分區(qū)鍵大小從小到大,不能往中間插入新分區(qū),分區(qū)鍵一般是date或number類型
適用日志、流水類大表,需要根據(jù)時(shí)間刪除歷史數(shù)據(jù)
CREATE ? ? ?TABLE WSR$_LONGSQL1
(
SNAP_ID????? ?BINARY_INTEGER??????? ? ? ?NOT NULL,
CTIME????????????????????????? ? ? ?DATE
)
PARTITION ? ? ?BY RANGE(SNAP_ID)
(PARTITION ? ? ?P_0 VALUES LESS THAN (1))
Interval
用戶只需要設(shè)定分區(qū)間隔和初始分區(qū)鍵值,根據(jù)插入的數(shù)據(jù)自動生成對應(yīng)的分區(qū),分區(qū)鍵一般是date或number類型
同Range分區(qū),比Range分區(qū)使用更方便,用戶不用提前創(chuàng)建分區(qū),并且可以有數(shù)據(jù)時(shí)再創(chuàng)建分區(qū)而不用創(chuàng)建空分區(qū)
CREATE TABLE ? ? ?WSR$_LONGSQL2
(
SNAP_ID????? ? ? ?BINARY_INTEGER??????? NOT NULL,
CTIME????????????????????????? ? ? ?DATE
)
PARTITION ? ? ?BY RANGE(SNAP_ID) INTERVAL(1)
(PARTITION ? ? ?P_0 VALUES LESS THAN (1))
List
分區(qū)鍵是離散值,分區(qū)需要用戶創(chuàng)建
適用在分區(qū)鍵是離散值的場景
CREATE ? ? ?TABLE WSR$_LONGSQL3
(
SNAP_ID????? ? ? ?BINARY_INTEGER??????? NOT NULL,
CTIME????????????????????????? ? ? ?DATE
)
PARTITION ? ? ?BY LIST (SNAP_ID)
(PARTITION ? ? ?P_0 VALUES (1))
Hash
用戶設(shè)定分區(qū)鍵和分區(qū)數(shù),可以自動生成分區(qū),插入數(shù)據(jù)時(shí)根據(jù)hash算法選擇對應(yīng)的分區(qū)
適用于分區(qū)鍵取值非常多的場景,一般用于把數(shù)據(jù)隔離開,而不是為了根據(jù)分區(qū)刪除數(shù)據(jù),使用hash分區(qū)減少buffer busy wait的等待
CREATE ? ? ?TABLE WSR$_LONGSQL4
(
SNAP_ID????? ? ? ?BINARY_INTEGER??????? NOT NULL,
CTIME????????????????????????? ? ? ?DATE
)
PARTITION ? ? ?BY HASH (SNAP_ID) PARTITIONS 16
4.2.3??????? 索引的設(shè)計(jì)原則
設(shè)計(jì)原則
說明
分區(qū)表不要創(chuàng)建全局索引
分區(qū)表一般創(chuàng)建本地索引(使用local關(guān)鍵字)。如果創(chuàng)建了全局索引,當(dāng)刪除分區(qū)時(shí)會導(dǎo)致索引失效
不要創(chuàng)建無用的索引
索引會降低DML語句的性能,所以不要創(chuàng)建無用的索引
不要創(chuàng)建冗余的索引
例如下面兩個(gè)索引,如果在userid, playlistid上創(chuàng)建了索引,就沒有必要在userid上創(chuàng)建一個(gè)索引。
create ? ? ?index ix_ums_playcontentlist_userid on t_ums_userplaycontentlist (userid)
create ? ? ?index ix_ums_playcontentlist_id on t_ums_userplaycontentlist (userid, ? ? ?playlistid)
索引的key不宜過長
如果索引key過長,會導(dǎo)致索引樹高度很大,索引查詢效率會降低。對于組合索引,索引的列不宜過多。不要把長字符串列作為索引列,例如描述字段。
組合索引,要把高選擇度的列放在前面
如下例所示,useraccount選擇度遠(yuǎn)高于accounttype,所以應(yīng)該把useraccount作為索引的首列,這樣當(dāng)查詢條件中有useraccount而沒有accounttype時(shí)仍能高效的使用索引。
create ? ? ?index ix_ums_usrordlib_account_type on t_ums_userorderlib ? ? ?(useraccount,accounttype)
當(dāng)需要對大數(shù)據(jù)量排序時(shí),可以通過創(chuàng)建索引來避免排序
場景:分頁查詢需要查詢歌曲(總數(shù)100萬),沒有查詢條件,查詢結(jié)果需要按照musicname排序,實(shí)際絕大部分的查詢是前幾頁。
解決方案:在musicname創(chuàng)建索引,通過索引全掃描來避免排序,只要不是查詢的數(shù)據(jù)非??亢?,效率就很高
一般不在選擇率很低的列上創(chuàng)建索引
一般不在狀態(tài),用戶類型這種取值很少的列上創(chuàng)建索引。但是,有些場景卻可以創(chuàng)建這種索引。例如,當(dāng)需要查詢的那部分的取值在數(shù)據(jù)中的比例很低時(shí)或者使用rownum限制了每次只查詢出一小批數(shù)據(jù)。總的原則是,只要一次查詢的數(shù)據(jù)在數(shù)據(jù)中的比例非常小,那么就適合使用索引。這里之所以說“一次查詢”,是因?yàn)榉蠗l件的數(shù)據(jù)可能很多,但是可能使用rownum限制了每次只查100條。
如果where語句中不得不對查詢列采用函數(shù)查詢,如upper函數(shù),需要建立相應(yīng)函數(shù)索引
如果查詢條件在列上使用了函數(shù),那么直接在列上創(chuàng)建的索引是無法使用的,必須創(chuàng)建對應(yīng)的函數(shù)索引。如下例所示。
create ? ? ?index ix_auditionauthlog_tonename on t_ums_auditionauthlog(upper(tonename))
tablespace ? ? ?ringidx
4.2.4??????? 表結(jié)構(gòu)的修改
支持在線重建索引和修改表結(jié)構(gòu)。索引的創(chuàng)建和重建當(dāng)前不支持并行。
技術(shù)建議:
1.表和索引的設(shè)計(jì)對系統(tǒng)的性能非常關(guān)鍵,需要使用者理解存儲結(jié)構(gòu)和設(shè)計(jì)原則。
2.索引的設(shè)計(jì)一定要根據(jù)查詢需求來設(shè)計(jì)。
3.分區(qū)是非常重要的特性,合理的使用分區(qū)可以大幅提升性能。
4.3????? 應(yīng)用框架
?? 兼容主流java連接池和Java框架
java連接池:c3p0、dbcp、druid;兼容hibenate、ibatis和mybatis。
?? hibenate方言
選擇Oracle方言:org.hibernate.dialect.OracleDialect。
4.4????? 數(shù)據(jù)庫接口
支持C-API,JDBC,ODBC,PYTHON和GO客戶端接口。
4.5????? 讀寫分離
JDBC支持多DN的讀寫分離,當(dāng)URL中配置多DN時(shí),可以通過URL中的屬性標(biāo)示來區(qū)分JDBC返回的連接是否是區(qū)分主機(jī)和備機(jī)。
?? 配置支持多DN讀寫分離
連接串格式: jdbc:zenith:rw:@{ip:port }[ , ... ][?useRW={false|true}]
連接串支持指定多個(gè)DN的ip,由“,”分割,連接串中一定全部為DN節(jié)點(diǎn)。
當(dāng)useRW屬性配置為true時(shí),則JDBC返回的連接可以是連接主機(jī)的也可以是連接備機(jī)的連接;當(dāng)useRW為false時(shí),則JDBC返回的連接只能是主機(jī)的連接。
技術(shù)建議:
1.對于非強(qiáng)一致性的查詢,建議讀備機(jī),減輕主機(jī)的壓力。
4.6????? SQL
4.6.1??????? 使用批量綁定接口
?? 盡量避免逐條commit
高并發(fā)逐條commit會產(chǎn)生大量的log file sync等待,對性能影響較大。
?? 使用綁定變量
當(dāng)前不支持cursor sharing,如果不使用綁定變量,會產(chǎn)生大量的硬解析。
避免使用過多的綁定變量,不推薦insert語句使用幾千個(gè)value的寫法。
4.6.2??????? 返回大數(shù)據(jù)量的分批處理
如果查詢結(jié)果返回很多數(shù)據(jù),設(shè)置fetch_size非常重要,如果fetch_size過小會導(dǎo)致交互次數(shù)多、查詢效率低;如果fetch_size過大或者全部返回,客戶端程序的內(nèi)存可能會撐爆。
這個(gè)特性非常重要,應(yīng)用程序在返回大數(shù)據(jù)量結(jié)果集時(shí)就不要分批查詢了,只要合理的設(shè)置fetch_size就可以一次查詢所有數(shù)據(jù)了,由數(shù)據(jù)庫分批fetch。
高斯默認(rèn)的fetch_size是100,可以在語句級修改,如果結(jié)果集較大,建議修改為1000以上。
?? JDBC接口
java.sql.PreparedStatement.setFetchSize(int)
技術(shù)建議:
1.大批量的DML語句,建議使用批量綁定方式。
2.對于返回大結(jié)果集的查詢,建議通過fetch_size分批處理,不建議業(yè)務(wù)分頁查詢。
3.不建議一個(gè)SQL過長或過于復(fù)雜。
4.7????? 提示(hint)
類型
提示名
使用說明
連接順序
leading
指定某個(gè)表為驅(qū)動表,例如leading(a)
ordered
多表連接時(shí)指定表的連接順序,按照from后面表的順序連接,沒有參數(shù)
連接方式
use_nl
指定表的連接方式為嵌套循環(huán),例如use_nl(a ? ? ?b),括號內(nèi)順序不重要,括號內(nèi)支持多個(gè)表
use_hash
指定表的連接方式為哈希連接,例如use_hash(a ? ? ?b),括號內(nèi)順序不重要,括號內(nèi)支持多個(gè)表
訪問路徑
full
指定對某個(gè)表全表掃描,例如full(a)
index
指定對某個(gè)表使用索引掃描,按照索引的排序方式,默認(rèn)正序,例如index(a ? ? ? 索引名)
其他
rule
指定使用RBO優(yōu)化器,不能有分區(qū)表等高級特性,不能和其他提示一起使用。
技術(shù)建議:
1.提示是基于RBO的,加了提示會自動變成RBO,所以加提示要慎重,要加全套提示。
5????? 運(yùn)維與工具
5.1????? 數(shù)據(jù)庫管理(DM)
Database Manager是一款基于Web的數(shù)據(jù)庫監(jiān)控工具,提供豐富的界面展示,可有效監(jiān)
控多個(gè)集群數(shù)據(jù)庫。通過管理員用戶和普通用戶區(qū)分查看和操作權(quán)限,對集群數(shù)據(jù)庫
進(jìn)行安全的監(jiān)控和運(yùn)維操作。
Database Manager提供的主要功能包括(但不限于):
?? 安裝集群
?? 導(dǎo)入并監(jiān)控集群
?? 集群、主機(jī)和實(shí)例運(yùn)行監(jiān)控
?? 數(shù)據(jù)庫運(yùn)行監(jiān)控
?? 故障診斷分析和上報(bào)
?? 告警分析和上報(bào)
?? 用戶管理
?? 查詢監(jiān)控和TOP查詢?nèi)∠?/p>
?? 巡檢
5.2????? 集群管理(CM)
GAUSS100 OLTP CM模塊主要針對分布式數(shù)據(jù)庫集群進(jìn)行系統(tǒng)管理,整個(gè)框架包括對外命令、內(nèi)部的邏輯仲裁、CM與ETCD的交互以及ETCD V3分布式數(shù)據(jù)管理。
CM模塊各部分功能介紹:
(1)對外命令:該部分主要包括集群管理各種場景所需要的命令行參數(shù),可供用戶根據(jù)需要手動或者自動化執(zhí)行所需場景功能,第二章針對各個(gè)命令會詳細(xì)介紹,這里不做贅述。
(2)邏輯仲裁:該部分主要通過主備成員關(guān)系一致性仲裁,主備倒換(switchover/failover)自動化來維護(hù)主備副本間關(guān)系,凡是涉及數(shù)據(jù)庫節(jié)點(diǎn)的異常處理,都需要經(jīng)過數(shù)據(jù)庫仲裁邏輯統(tǒng)一進(jìn)行數(shù)據(jù)庫仲裁判決誰是主。
(3)CM模塊與ETCD交互:該部分主要介紹CM模塊與ETCD如何交互,主要是指數(shù)據(jù)的交互,分布式數(shù)據(jù)主要存儲在ETCD中,通過watch機(jī)制監(jiān)控,CM向ETCD訂閱相關(guān)數(shù)據(jù),同時(shí)CM也可以修改并操作ETCD中的數(shù)據(jù)。
(4)CM內(nèi)部ETCD數(shù)據(jù)管理:該部分主要涉及ETCD的相關(guān)知識點(diǎn),重點(diǎn)介紹在CM模塊內(nèi)部ETCD是如何管理分布式數(shù)據(jù)的。
5.3????? 備份恢復(fù)
?? 備份方式、級別
①?????? 支持物理備份
通過復(fù)制物理文件的方式對數(shù)據(jù)庫進(jìn)行備份,以磁盤塊為基本單位將數(shù)據(jù)從主機(jī)復(fù)制到備機(jī),每次備份數(shù)據(jù)都是以一個(gè)扇區(qū)(512 Byte)為單位來進(jìn)行備份。通過備份的數(shù)據(jù)文件及歸檔日志等文件,數(shù)據(jù)庫可以進(jìn)行完全恢復(fù)。物理備份速度快,一般被用作對數(shù)據(jù)進(jìn)行備份和恢復(fù),用于全量備份的場景。通過合理規(guī)劃,可以低成本進(jìn)行備份與恢復(fù)
②?????? 支持全量備份
對某一時(shí)間點(diǎn)上的所有數(shù)據(jù)進(jìn)行完全復(fù)制,并不依賴文件的“存檔”屬性來確定需要備份哪些文件,在備份過程中會清除所有文檔的“存檔”屬性。這種備份方式的優(yōu)點(diǎn)是只要用磁帶,就可以恢復(fù)丟失的數(shù)據(jù),因此極大的加快了系統(tǒng)或數(shù)據(jù)的恢復(fù)時(shí)間。它的缺點(diǎn)在于各個(gè)全量備份磁帶中的備份數(shù)據(jù)存在大量的重復(fù)信息。另外,由于每次需要備份的數(shù)據(jù)量相當(dāng)大,因此備份所需時(shí)間較長。
③?????? 支持多級增量備份
增量備份是相對于上一次備份而言的一種備份。
通過BACKUP命令進(jìn)行增量備份時(shí),它備份上一次備份后(包含全量備份、差異增量備份、累積增量備份),所有發(fā)生變化的文件。這種備份方式最顯著的優(yōu)點(diǎn):沒有重復(fù)的備份數(shù)據(jù),因此備份的數(shù)據(jù)量不大,備份所需的時(shí)間較短。但增量備份的數(shù)據(jù)恢復(fù)比較麻煩,必須具有上一次全備份和所有增量備份磁帶(一旦丟失或損壞其中的磁帶,就會造成恢復(fù)的失?。?,并且必須沿著從全備份到依次增量備份的時(shí)間順序逐個(gè)反推恢復(fù),這就極大地延長了恢復(fù)時(shí)間。增量備份只支持通過BACKUP命令完成。
?? 備份支持壓縮、并行、切分
①?????? 壓縮
在備份存儲空間有限或者網(wǎng)絡(luò)備份帶寬有限的場景下,需要減小備份集大小,降低資源占用;備份時(shí)對備份集進(jìn)行壓縮,可一定程度上減小備份集大小。GaussDB 100支持zstd,lz4和zlib壓縮算法對備份集進(jìn)行壓縮。壓縮備份時(shí)可以指定壓縮級別,取值范圍為[1, 9],級別越高,壓縮率越高,但速度也越慢,默認(rèn)壓縮級別為1。
②?????? 并行、切分
當(dāng)備份介質(zhì)為磁盤時(shí),可以開啟多個(gè)并發(fā)線程進(jìn)行備份,以提高備份速度。并發(fā)個(gè)數(shù)取值是[1, 8]范圍內(nèi)的整數(shù)。不指定并發(fā)數(shù)量時(shí),將默認(rèn)啟動4個(gè)并發(fā)線程。并行備份時(shí),可指定數(shù)據(jù)文件的切分閾值,合適的切分閾值可以有效提高并行備份效率。
?? 支持PITR、指定方案(schema)恢復(fù)
①?????? PITR(Point In Time Recovery)
基于時(shí)間點(diǎn)的恢復(fù)。依據(jù)物理備份文件加上Redo日志文件,恢復(fù)數(shù)據(jù)庫到指定時(shí)間點(diǎn)。
通過備份集可以恢復(fù)到備份的時(shí)間點(diǎn);如果備份之后產(chǎn)生的歸檔日志存在,通過繼續(xù)回放歸檔日志,可以恢復(fù)到備份之后的時(shí)間點(diǎn)。
②?????? 恢復(fù)指定schema
為了便于數(shù)據(jù)維護(hù),可以將不同業(yè)務(wù)的數(shù)據(jù)使用不同的方案(schema)存儲在數(shù)據(jù)庫中,并且每個(gè)方案(schema)獨(dú)立使用一個(gè)表空間。如果只有一個(gè)方案(schema)的數(shù)據(jù)損壞并需要修復(fù),則可以通過工具ztrst實(shí)現(xiàn)基于全量備份文件只恢復(fù)指定方案(schema)的數(shù)據(jù),加快恢復(fù)速度。
5.4????? 邏輯導(dǎo)入導(dǎo)出
5.4.1??????? dump/load
支持對單表的導(dǎo)出和導(dǎo)入,格式是CSV。
支持指定行列分隔符,支持多分隔符,導(dǎo)入支持并行。
5.4.2??????? exp/imp
?? 導(dǎo)出格式
支持導(dǎo)出SQL文本和二進(jìn)制方式,后者支持并行和壓縮。
?? 導(dǎo)出對象
支持按照用戶、表、過濾條件導(dǎo)出數(shù)據(jù)。
支持只導(dǎo)出對象定義。
?? 導(dǎo)入對象
導(dǎo)入可以轉(zhuǎn)換表空間和用戶名。
5.5????? 全量割接工具(datasync)
DataSync是GaussDB 100的數(shù)據(jù)遷移工具,致力于實(shí)現(xiàn)其他商業(yè)數(shù)據(jù)庫向GaussDB 100高效、安全的數(shù)據(jù)同步。支持將Sybase、Oracle、MySQL、GaussDB 100 V100R003C10和SQL Server的數(shù)據(jù)遷移至GaussDB 100 V300R001數(shù)據(jù)庫。
DataSync通過JDBC方式將數(shù)據(jù)導(dǎo)出為CSV格式,支持?jǐn)?shù)據(jù)的導(dǎo)出、導(dǎo)入以及導(dǎo)出+導(dǎo)入。支持自動創(chuàng)建動態(tài)表、校驗(yàn)表結(jié)構(gòu)以及使用觸發(fā)器實(shí)現(xiàn)增量割接的能力。
5.6????? 邏輯復(fù)制(HDR)
支持異構(gòu)數(shù)據(jù)庫之間解析增量日志實(shí)現(xiàn)邏輯復(fù)制,支持雙活。
5.7????? 圖像化開發(fā)工具(DS)
Data Studio是一款GUI工具,可以通過它來連接數(shù)據(jù)庫,調(diào)試執(zhí)行SQL語句和存儲過程。它支持GaussDB 100的基本特性,為數(shù)據(jù)庫開發(fā)人員提供圖形界面,顯著提高構(gòu)建應(yīng)用程序的效率,并簡化數(shù)據(jù)庫開發(fā)及應(yīng)用開發(fā)任務(wù)。
Data Studio主要為數(shù)據(jù)庫開發(fā)人員提供以下功能:
瀏覽數(shù)據(jù)庫對象。
創(chuàng)建和管理數(shù)據(jù)庫對象(例如:數(shù)據(jù)庫、user、表、索引)。
執(zhí)行SQL語句和SQL腳本。
編輯和執(zhí)行PL/SQL語句。
Data Studio的具體使用方法請參見隨工具配套發(fā)布的《Data Studio用戶手冊》。
5.8????? 版本升級
支持一鍵式升級工具,目前還不支持滾動升級和熱補(bǔ)丁。
5.9????? SQL MAP
支持在線替換指定SQL的能力,用于規(guī)避性能問題。
--打開SQL映射功能開關(guān)。
ALTER SYSTEM SET enable_sql_map = true;
--創(chuàng)建一個(gè)SQL映射。
ALTER SQL_MAP (select count(*) from SYS_DUMMY) REWRITE TO (select count(1) as cnt from SYS_DUMMY);
--輸入源SQL語句,實(shí)際上會映射成目標(biāo)SQL語句來執(zhí)行。
select count(*) from SYS_DUMMY;
CNT
--------------------
1
1 rows fetched.
5.10?? 性能分析工具
?? WSR報(bào)告
?? LongSQL日志或視圖
?? 性能視圖
前面已經(jīng)做過介紹,詳情參考版本資料。
6????? 總結(jié)
本文系統(tǒng)的介紹了GaussDB 100HA架構(gòu)的能力以及使用建議,可以指導(dǎo)用戶快速的熟悉數(shù)據(jù)庫。由于產(chǎn)品功能還在不斷開發(fā)中,文中的描述可能跟實(shí)際有不一致的情況,需要獲取對應(yīng)版本的技術(shù)建議書。由于時(shí)間倉促,內(nèi)容有限,文中內(nèi)容難免會有疏漏錯(cuò)誤,歡迎讀者指正。
GaussDB
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。