GaussDB國慶獻(xiàn)禮】GaussDB 100 HA架構(gòu)技術(shù)建議書(2)

      網(wǎng)友投稿 1355 2022-05-29

      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ì)。

      【GaussDB國慶獻(xiàn)禮】GaussDB 100 HA架構(gòu)技術(shù)建議書(2)

      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)容。

      上一篇:5月編程語言排行榜:Python、C++ 競爭白熱化
      下一篇:物聯(lián)網(wǎng)架構(gòu)超強(qiáng)解讀來了!
      相關(guān)文章
      亚洲av永久无码精品古装片 | 亚洲午夜久久久久妓女影院| 亚洲欧洲日韩国产一区二区三区| 亚洲一卡2卡三卡4卡有限公司| 亚洲熟妇无码乱子AV电影| 亚洲欧洲一区二区三区| 国产成人精品亚洲| 亚洲成a人片在线观看久| 国产亚洲欧美日韩亚洲中文色| 亚洲GV天堂GV无码男同| 亚洲av无码偷拍在线观看| 亚洲av永久无码一区二区三区| 亚洲国产精华液2020| 亚洲av综合日韩| 国产亚洲精品成人久久网站| 亚洲av成人一区二区三区在线观看| 亚洲高清视频一视频二视频三| 亚洲av中文无码| 国产成人高清亚洲| 亚洲欭美日韩颜射在线二| 亚洲午夜久久久影院伊人| 亚洲精品无码Av人在线观看国产| 亚洲动漫精品无码av天堂| 亚洲成人激情在线| 亚洲精品视频免费看| 亚洲一卡二卡三卡| 亚洲精品无码久久久久YW| 国产亚洲欧美日韩亚洲中文色| 亚洲?V无码成人精品区日韩| 亚洲一区二区三区在线观看精品中文| 亚洲三区在线观看无套内射| 久久精品亚洲视频| 亚洲成人在线免费观看| 亚洲国产综合精品中文第一| 亚洲av无码专区青青草原| 亚洲人成网站色在线入口| 久久久久久久尹人综合网亚洲| 无码乱人伦一区二区亚洲| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲人成人网毛片在线播放| 久久久久久久久无码精品亚洲日韩|