當前位置:首頁 » 數據倉庫 » 資料庫如何表分區
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫如何表分區

發布時間: 2022-05-10 19:56:21

⑴ 如何使用Oracle資料庫分區表

當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。

⑵ 如何對已經存在的數據表進行分區

過程中為sql Server數據表劃分為三個步驟:

1)建立分區函數

2)建立分區方案

3)對表的分區

第一步:建立分區函數

分區函數定義[U]如何[/ U],也就是你想怎麼SQL Server數據分區。這里不是一個特定的表作為一個例子,但總的技術部門總結的數據。

分區指定為每個分區用分區邊界來實現。例如,假設我們有一個客戶表,其中包含所有的企業客戶信息,客戶信息與客戶的唯一標識號,客戶編號從1到100萬。我們可以使用下面的分區功能(這里稱為customer_Partfunc)把這個表分為四個分區:

CREATE PARTITION FUNCTION customer_partfunc(INT)

AS RANGE RIGHT

輸入值( 250000,500000,750000)

這些邊界劃分指定了四個分區。第一個分區包含所有值?少於25萬的記錄。第二個分區包含所有值?之間250,000和499,999的記錄。第三個分區包含所有值?500,000至749,999記錄。大於或等於750,000的所有其他記錄都包含在第四個分區中。

請注意,此示例使用「RANGE RIGHT」條款。這表明,該邊界值是分區的右側。同樣,如果您使用「RANGE LEFT」條款,那麼第一個分區將包含所有的值小於或等於25萬條記錄;?第二個分區將包含所有的值250001和500000之間的記錄,等等??

第二步:創建

分區方案

一旦如何分區功能分區後的數據完整的定義,下一步是創建一個分區方案,定義[ U],其中[/ U],這就是你要分區的數據。這是一個非常簡單的過程,例如,如果我有四個文件組,從「FG1」到「FG4」的名字,那麼你可以使用下面的分區方案:

創建分區計劃customer_partscheme

作為間隔customer_partfunc

要(FG1,FG2,FG3,FG4)

請注意,我們現在把一個分區函數連接到分區規劃,但我們還沒有連接在分區方案的任何具體的資料庫表。這是重復使用的功能函數時。我們可以利用這個功能來分區方案(或只是一個分區函數)對資料庫表的任何數據。

第三步:表已分區

建立良好的分區方案後,就可以開始對表進行分區。這是最簡單的一步,只需加上「ON」子句中的表創建語句指定表的分區方案,並申請表列的分區方案。你不需要指定分區函數,分區方案已經因為分區函數定義。

例如,假設你想使用上述的分區方案來創建一個客戶表,您需要使用以下Transact-SQL語句:

CREATE TABLE客戶(姓數據類型為nvarchar(40),姓氏為nvarchar(40),CUSTOMERNUMBER INT)
開customer_partscheme(CUSTOMERNUMBER)

⑶ 資料庫一個表數據太多了,如何分表

這個要看你是什麼資料庫。
Oracle 或者 SQL Server 企業版本的, 可以嘗試使用 分區表來處理。

如果對 分區表不熟悉, 或者不高興折騰。
SQL Server 可以嘗試使用 分區視圖的方式來處理。

⑷ 資料庫中表分割和表分區的區別是什麼

個人認為理論上使用表分割在性能上應該和建立表分區查不多,但是,表分割對於所有的資料庫都適用,而表分區只能用於oracle這樣的特定的資料庫;表分區屬於資料庫物理設計,表分割屬於邏輯設計。
表分區:
表分區是ORACLE對於非常大的表進行優化的一種有效方法, 是非常有效的一種手段, 在很多情況下,比你說的表分割更有效,比如,有一個代碼表,使用分區表把100萬紀錄分在10個分區中(ID 每從1到10萬為一個分區),那樣寫查詢語句的時候,只要給出查詢條件中所需要的代碼,ORACLE自動會定位到對應的分區進行查詢,大大降低的查詢時間. 而採用表分割,那必須先根據查詢的代碼指定所要查詢的表,才能找到相應的紀錄. 而且,如果有下面這樣的語句,查詢的條件是跨分區的:
SELECT * FROM MYTABLE WHERE ID BETWEEN 99000 AND 10111;
在分區表中是非常容易實現的,ORACLE會自動在兩個分區中查詢;而採用表分割的話是否必須寫成兩個查詢語句在UNION ALL。
事實上,大型的資料庫都有對大表的特殊處理方式(類似於分區表),如果太強調可移植性而放棄這些最重要的特性的話,那性能很可能受到很大的影響.
即便是oracle資料庫,當數據量很大時,用分表比用表分區要快些,尤其是在表用到group by求和等操作。
我也認為表分區要好一些,也就是一般說來的分區表,對這些表操作起來有很多強大的功能,說他強大主要是體現在對與表中有海量數據的情況之下的,試問大家一個其中有1億條記錄的表你是否會經常的將其移植到其他資料庫系統當中去呢?
表分區基於物理存儲,還有就是基於分區的索引可以使用,很不錯的,當然,這些都是在海量數據情況之下的比較,但是如果真要是數據量不大的情況下比較,我想要比較分區表和表分割就沒什麼意思了。
表分區的效果對硬體有所依賴,而且效果恐怕不如諸位想像中那麼好。我做過一點測試,很失望。
而表分割的效率提升在很多時候(不是所有時候)是很明顯的。
當然這都是在巨型表的前提下討論,縮小表和索引的規模有利於提高效率,這正是分割表的特點。
表分割:
1、水平分割:根據一列或多列數據的值把數據行放到兩個獨立的表中。
水平分割通常在下面的情況下使用:A 表很大,分割後可以降低在查詢時需要讀的數據和索引的頁數,同時也降低了索引的層數,提高查詢速度。B 表中的數據本來就有獨立性,例如表中分別記錄各個地區的數據或不同時期的數據,特別是有些數據常用,而另外一些數據不常用。C需要把數據存放到多個介質上。
例如法規表law就可以分成兩個表active-law和 inactive-law。activea-authors表中的內容是正生效的法規,是經常使用的,而inactive-law表則使已經作廢的法規,不常被查詢。水平分割會給應用增加復雜度,它通常在查詢時需要多個表名,查詢所有數據需要union操作。在許多資料庫應用中,這種復雜性會超過它帶來的優點,因為只要索引關鍵字不大,則在索引用於查詢時,表中增加兩到三倍數據量,查詢時也就增加讀一個索引層的磁碟次數。
2、垂直分割:把主碼和一些列放到一個表,然後把主碼和另外的列放到另一個表中。
如果一個表中某些列常用,而另外一些列不常用,則可以採用垂直分割,另外垂直分割可以使得數據行變小,一個數據頁就能存放更多的數據,在查詢時就會減少I/O 次數。其缺點是需要管理冗餘列,查詢所有數據需要join操作。

⑸ 資料庫表分區優化

對SQL Server數據表進行分區的過程分為三個步驟:

1)建立分區函數

2)建立分區方案

3)對表格進行分區

第一個步驟:建立分區函數

分區函數定義[u]how[/u],即你想要SQL Server如何對數據進行分區。這里就不以某一個表格作為例子,而是總體概括分割數據的技術。

分區是通過指定每個分區的分割界線實現的。例如,假定我們有一個Customers表格,裡麵包含了企業所有的客戶的信息,客戶信息以唯一的客戶號進行辨識,客戶號從1到1000000。我們可以運用以下的分區函數(這里稱之為customer_Partfunc)把這個表格平均分為四個分區:

CREATE PARTITION FUNCTION customer_partfunc (int)
AS RANGE RIGHT
FOR VALUES (250000, 500000, 750000)

這些分割界線指定了四個分區。第一個分區包含所有值小於250000的記錄。第二個分區包含所有值在250000和499999之間的記錄。而第三個分區包含所有值在500000和749999之間的記錄。其他所有大於或等於750000的記錄都包含在第四個分區里。

注意這個例子中使用了「RANGE RIGHT」從句。這說明分界值是在分區的右邊。同樣,如果使用的是「RANGE LEFT」從句,那麼第一個分區就會包含所有值小於或等於250000的記錄;第二個分區就會包含所有值在250001和500000之間的記錄,如此類推。

第二個步驟:建立分區方案

一旦建立完定義如何對數據進行分區的分區函數之後,下一步就是建立一個分區方案,定義[u]where[/u],即你想在哪裡對數據進行分區。這是一個很直接明了的過程,例如,如果我有四個文件組,名稱分別從「fg1」到「fg4」,那麼就可以使用以下分區方案:

CREATE PARTITION SCHEME customer_partscheme
AS PARTITION customer_partfunc
TO (fg1, fg2, fg3, fg4)

注意我們現在把一個分區函數連接到了分區方案,但是我們還沒有把分區方案連接到任何具體的資料庫表格。這就是重復使用功能發揮功能的時候。我們可以通過這個功能把分區方案(或者只是分區函數)用於資料庫表格的任何數據上。

第三個步驟:對表格進行分區

建立好分區方案之後,就可以開始對表格進行分區了。這是最簡單的一個步驟,只需要在表格創建語句中添加「ON」從句,指定表格分區方案和要應用該分區方案的表列。你不需要指定分區函數,因為分區方案已經定義了分區函數。

舉個例子,假設你想要用上述的分區方案來創建一個客戶表格,你需要使用以下Transact-SQL語句:

CREATE TABLE customers (FirstName nvarchar(40), LastName nvarchar(40), CustomerNumber int)
ON customer_partscheme (CustomerNumber)

⑹ oracle資料庫按照一定條件把表拆分為多個表

其實不需要拆分表,分區就可以,還是原來的表名,只是將原來的表分成了若乾的分區,這樣能起到分表的效果,還不用分成很多的表。
比如你原來的表的名字是A,那麼將該表改為A1,然後從新建立一個分區表A,分區的依據是班級,也就是list分區,也就是一般意義上的列表分區表。
然後再將A1的數據插入新A表就可以了。
至於分區表的建立方式,往上很多,可以自行查找。
這樣操作查詢的語句不需要變,只是在不跨分區查詢的情況下,相當於分成了若干張表去查詢。比如查詢1班的成績,那麼就是在1班的分區內,不會有2班的問題,就相當於你用一個指頭就能解決問題,不會動用這個手一樣。
如果分表的話,那麼假設有12個班,那麼就要建立12張表,這樣的話,語句就要寫12次,冗餘太大了。

⑺ 如何將Oracle資料庫的普通表轉換成分區表

在一個高可用系統中,如果需要改變一個表的定義是一件比較棘手的問題,尤其是對於7×24系統。Oracle提供的基本語法基本可以滿足一般性修改,但是對於把普通堆表改為分區表,把索引組織表修改為堆表等操作就無法完成了。而且,對於被大量DML語句訪問的表,幸運的是,Oracle從9i版本開始提供了在線重定義表功能,通過調用DBMS_REDEFINITION包,可以在修改表結構的同時允許DML操作。

在線重定義表具有以下功能:

修改表的存儲參數;

可以將表轉移到其他表空間;

增加並行查詢選項;

增加或刪除分區;

重建表以減少碎片;

將堆表改為索引組織表或相反的操作;

增加或刪除一個列。

調用DBMS_REDEFINITION包需要EXECUTE_CATALOG_ROLE角色,除此之外,還需要CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、LOCK ANY TABLE和SELECT ANY TABLE的許可權。

在線重定義表的步驟如下:

1.選擇一種重定義方法:

存在兩種重定義方法,一種是基於主鍵、另一種是基於ROWID。ROWID的方式不能用於索引組織表,而且重定義後會存在隱藏列M_ROW$$。默認採用主鍵的方式。

2.調用DBMS_REDEFINITION.CAN_REDEF_TABLE()過程,如果表不滿足重定義的條件,將會報錯並給出原因。

3.在用一個方案中建立一個空的中間表,根據重定義後你期望得到的結構建立中間表。比如:採用分區表,增加了COLUMN等。

4.調用DBMS_REDEFINITION.START_REDEF_TABLE()過程,並提供下列參數:被重定義的表的名稱、中間表的名稱、列的映射規則、重定義方法。

如果映射方法沒有提供,則認為所有包括在中間表中的列用於表的重定義。如果給出了映射方法,則只考慮映射方法中給出的列。如果沒有給出重定義方法,則認為使用主鍵方式。

5.在中間表上建立觸發器、索引和約束,並進行相應的授權。任何包含中間表的完整性約束應將狀態置為disabled。

當重定義完成時,中間表上建立的觸發器、索引、約束和授權將替換重定義表上的觸發器、索引、約束和授權。中間表上disabled的約束將在重定義表上enable。

6.(可選)如果在執行DBMS_REDEFINITION.START_REDEF_TABLE()過程和執行DBMS_REDEFINITION.FINISH_REDEF_TABLE()過程直接在重定義表上執行了大量的DML操作,那麼可以選擇執行一次或多次的SYNC_INTERIM_TABLE()過程,以減少最後一步執行FINISH_REDEF_TABLE()過程時的鎖定時間。

7.執行DBMS_REDEFINITION.FINISH_REDEF_TABLE()過程完成表的重定義。這個過程中,原始表會被獨占模式鎖定一小段時間,具體時間和表的數據量有關。

執行完FINISH_REDEF_TABLE()過程後,原始表重定義後具有了中間表的屬性、索引、約束、授權和觸發器。中間表上disabled的約束在原始表上處於enabled狀態。

8.(可選)可以重命名索引、觸發器和約束。對於採用了ROWID方式重定義的表,包括了一個隱含列M_ROW$$。推薦使用下列語句經隱含列置為UNUSED狀態或刪除。

ALTER TABLE TABLE_NAME SET UNUSED (M_ROW$$);

ALTER TABLE TABLE_NAME DROP UNUSED COLUMNS;

下面是進行重定義操作後的結果:

原始表根據中間表的屬性和特性進行重定義;

START_REDEF_TABLE()和FINISH_REDEF_TABLE()操作之間在中間表上建立的觸發器、索引、約束和授權,現在定義在原始表上。中間表上disabled的約束在原始表上處於enabled狀態。

原始表上定義的觸發器、索引、約束和授權建立在中間表上,並會在刪除中間表時刪除。原始表上原來enabled狀態的索引,建立在中間表上,並處於disabled狀態。

任何定義在原始表上的存儲過程和游標都會變為INVALID,當下次調用時後自動進行編譯。

如果執行過程中出現錯誤或者人為選擇退出的話,可以執行DBMS_REDEFINITION.ABORT_REDEF_TABLE()過程。

其中UNAME 參數是指用戶;

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);

可以改為:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(『USER』, 'T', 'T_NEW')

PL/SQL 過程已成功完成。

SQL> EXEC dbms_redefinition.sync_interim_table(『USER』, 'T', 'T_NEW')

現在,將中間表與原始表同步。(僅當要對表 T 進行更新時才需要執行該操作。)

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

PL/SQL 過程已成功完成。

如果重組織失敗,那麼你就必須採取特殊的步驟來讓它重新開始。由於重定義過程需要創建表格的快照,因此為了重新開始這一過程,你必須調用DBMS_REDEFINITION.ABORT_REDEF_TABLE來釋放快照。

DBMS_REDEFINITION.ABORT_REDEF_TABLE過程有三個參數,即用戶(schema)、原始表格(original table name)名稱以及持有表格名稱(holding table name)。它「出棧」並允許你開始重組織表格。

SQL> SELECT COUNT(*) FROM T;

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

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

需要說明的是完成後,原表和中間表的結構也同時進行了交換,並且中間表裡面有原表的數據備份。

優點:

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

不足:實現上比上面兩種略顯復雜,適用於各種情況。

然而,在線表格重定義也不是完美無缺的。下面列出了Oracle9i重定義過程的部分限制:

你必須有足以維護兩份表格拷貝的空間。

你不能更改主鍵欄。

表格必須有主鍵。

必須在同一個大綱中進行表格重定義。

在重定義操作完成之前,你不能對新加欄加以NOT NULL約束。

表格不能包含LONG、BFILE以及用戶類型(UDT)。

不能重定義鏈表(clustered tables)。

不能在SYS和SYSTEM大綱中重定義表格。

不能用具體化視圖日誌(materialized view logs)來重定義表格;不能重定義含有具體化視圖的表格。

不能在重定義過程中進行橫向分集(horizontal subsetting)。

⑻ 資料庫分區的分類

分區主要有兩種形式://這里一定要注意行和列的概念(row是行,column是列)
水平分區(Horizontal Partitioning)
這種形式分區是對表的行進行分區,通過這樣的方式不同分組裡面的物理列分割的數據集得以組合,從而進行個體分割(單分區)或集體分割(1個或多個分區)。所有在表中定義的列在每個數據集中都能找到,所以表的特性依然得以保持。
舉個簡單例子:一個包含十年發票記錄的表可以被分區為十個不同的分區,每個分區包含的是其中一年的記錄。(朋奕註:這里具體使用的分區方式我們後面再說,可以先說一點,一定要通過某個屬性列來分割,譬如這里使用的列就是年份)
垂直分區(Vertical Partitioning)
這種分區方式一般來說是通過對表的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分區,每個分區都包含了其中的列所對應的行。
舉個簡單例子:一個包含了大text和BLOB列的表,這些text和BLOB列又不經常被訪問,這時候就要把這些不經常使用的text和BLOB了劃分到另一個分區,在保證它們數據相關性的同時還能提高訪問速度。
在資料庫供應商開始在他們的資料庫引擎中建立分區(主要是水平分區)時,DBA和建模者必須設計好表的物理分區結構,不要保存冗餘的數據(不同表中同時都包含父表中的數據)或相互聯結成一個邏輯父對象(通常是視圖)。這種做法會使水平分區的大部分功能失效,有時候也會對垂直分區產生影響。

⑼ oracle資料庫如何查看錶的表分區的信息(每個表分區的名字和所屬表空間)

這樣SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME
FROM USER_TAB_PARTITIONS

註:

USER_TAB_PARTITIONS:可查看分區表的名字、歸屬表空間以及表的詳細分區情況。

USER_PART_TABLES:可查看用戶所有的分區表,以及分區方式。

(9)資料庫如何表分區擴展閱讀:

分區表的作用

Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外分區還可以極大簡化常見的管理任務,分區是構建千兆位元組數據系統或超高可用性系統的關鍵工具。

分區功能能夠將表、索引或索引組織表進一步細分為段,這些資料庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從資料庫管理員的角度來看,一個分區後的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使資料庫管理員在管理分區後的對象時有相當大的靈活性。

但是,從應用程序的角度來看,分區後的表與非分區表完全相同,使用 SQL DML 命令訪問分區後的表時,無需任何修改。

⑽ 資料庫分區和分表的區別

分區、分表、分庫的詳細理解
一、什麼是分區、分表、分庫
分區
就是把一張表的數據分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的

分表
就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然後操作它。

分庫
一旦分表,一個庫中的表會越來越多

將整個資料庫比作圖書館,一張表就是一本書。當要在一本書中查找某項內容時,如果不分章節,查找的效率將會下降。而同理,在資料庫中就是分區。

二、常用的單機資料庫的瓶頸
問題描述
單個表數據量越大,讀寫鎖,插入操作重新建立索引效率越低。
單個庫數據量太大(一個資料庫數據量到就是極限)
單個資料庫伺服器壓力過大
讀寫速度遇到瓶頸(並發量幾百)
三、分區
什麼時候考慮使用分區?
一張表的查詢速度已經慢到影響使用的時候。

sql經過優化

數據量大

表中的數據是分段的
對數據的操作往往只涉及一部分數據,而不是所有的數據

分區解決的問題
主要可以提升查詢效率

分區的實現方式(簡單)
mysql5 開始支持分區功能

四、分表
什麼時候考慮分表?
一張表的查詢速度已經慢到影響使用的時候。

sql經過優化

數據量大
當頻繁插入或者聯合查詢時,速度變慢

分表解決的問題
分表後,單表的並發能力提高了,磁碟I/O性能也提高了,寫操作效率提高了

查詢一次的時間短了
數據分布在不同的文件,磁碟I/O性能提高
讀寫鎖影響的數據量變小
插入資料庫需要重新建立索引的數據減少
分表的實現方式(復雜)
需要業務系統配合遷移升級,工作量較大

分區和分表的區別與聯系
分區和分表的目的都是減少資料庫的負擔,提高表的增刪改查效率。

分區只是一張表中的數據的存儲位置發生改變,分表是將一張表分成多張表。
當訪問量大,且表數據比較大時,兩種方式可以互相配合使用。
當訪問量不大,但表數據比較多時,可以只進行分區。

常見分區分表的規則策略(類似)
Range(范圍)
Hash(哈希)
按照時間拆分
Hash之後按照分表個數取模
在認證庫中保存資料庫配置,就是建立一個DB,這個DB單獨保存user_id到DB的映射關系