資料庫表分區
A. 資料庫分區的分類
分區主要有兩種形式://這里一定要注意行和列的概念(row是行,column是列)
水平分區(Horizontal Partitioning)
這種形式分區是對表的行進行分區,通過這樣的方式不同分組裡面的物理列分割的數據集得以組合,從而進行個體分割(單分區)或集體分割(1個或多個分區)。所有在表中定義的列在每個數據集中都能找到,所以表的特性依然得以保持。
舉個簡單例子:一個包含十年發票記錄的表可以被分區為十個不同的分區,每個分區包含的是其中一年的記錄。(朋奕註:這里具體使用的分區方式我們後面再說,可以先說一點,一定要通過某個屬性列來分割,譬如這里使用的列就是年份)
垂直分區(Vertical Partitioning)
這種分區方式一般來說是通過對表的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分區,每個分區都包含了其中的列所對應的行。
舉個簡單例子:一個包含了大text和BLOB列的表,這些text和BLOB列又不經常被訪問,這時候就要把這些不經常使用的text和BLOB了劃分到另一個分區,在保證它們數據相關性的同時還能提高訪問速度。
在資料庫供應商開始在他們的資料庫引擎中建立分區(主要是水平分區)時,DBA和建模者必須設計好表的物理分區結構,不要保存冗餘的數據(不同表中同時都包含父表中的數據)或相互聯結成一個邏輯父對象(通常是視圖)。這種做法會使水平分區的大部分功能失效,有時候也會對垂直分區產生影響。
B. 資料庫中表分割和表分區的區別是什麼
個人認為理論上使用表分割在性能上應該和建立表分區查不多,但是,表分割對於所有的資料庫都適用,而表分區只能用於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操作。
C. 數據量達到多少需要表分區 sql
表分區有兩個條件:1、數據量大;2、有一定標準的數據讀取,比如:按照日期年份分區,那麼2013年的數據是歷史數據不經常讀,這樣才行,如果是做數據分析的話,表分區就不太合適,如果經常誇分區讀數的話,不但速度不快,反而變慢了
數據量大 還真不太好定 我現在用的表 一個月的數據超過500萬 就是大數據了,可能有的公司是一個表超過500萬就是大數據了,關鍵是看伺服器的承受力
D. oracle分區表的分區有幾種類型
oracle分區表的分區有四種類型:范圍分區、散列分區、列表分區和復合分區。
特點如下:
1、范圍分區
就是根據資料庫表中某一欄位的值的范圍來劃分分區。
數據中有空值,Oracle機制會自動將其規劃到maxvalue的分區中。
2、散列分區
根據欄位的hash值進行均勻分布,盡可能地實現各分區所散列的數據相等。
散列分區即為哈希分區,Oracle採用哈希碼技術分區,具體分區如何由Oracle說的算,也可能我下一次搜索就不是這個數據了。
3、列表分區
列表分區明確指定了根據某欄位的某個具體值進行分區,而不是像范圍分區那樣根據欄位的值范圍來劃分的。
4、復合分區
根據范圍分區後,每個分區內的數據再散列地分布在幾個表空間中,這樣我們就要使用復合分區。復合分區是先使用范圍分區,然後在每個分區同再使用散列分區的一種分區方法。
比如將part_date的記錄按時間分區,然後每個分區中的數據分三個子分區,將數據散列地存儲在三個指定的表空間中。
(4)資料庫表分區擴展閱讀:
分區的恢復方法:
如果資料庫運行在archive 模式下,那麼一旦資料庫損壞則可以通過冷備份(熱備份)和歸檔備份將資料庫恢復到斷點狀態。
資料庫控制文件恢復(假設所有控制文件均被破壞):
資料庫基於文件系統: 利用操作系統的tar、cp等命令即可。
資料庫基於裸設備:dd if=$ORACLE_BASE/con.bak of=/dev/rdrd/drd1 seek=12
E. oracle資料庫如何查看錶的表分區的信息(每個表分區的名字和所屬表空間)
這樣SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME
FROM USER_TAB_PARTITIONS
註:
USER_TAB_PARTITIONS:可查看分區表的名字、歸屬表空間以及表的詳細分區情況。
USER_PART_TABLES:可查看用戶所有的分區表,以及分區方式。
(5)資料庫表分區擴展閱讀:
分區表的作用
Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外分區還可以極大簡化常見的管理任務,分區是構建千兆位元組數據系統或超高可用性系統的關鍵工具。
分區功能能夠將表、索引或索引組織表進一步細分為段,這些資料庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從資料庫管理員的角度來看,一個分區後的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使資料庫管理員在管理分區後的對象時有相當大的靈活性。
但是,從應用程序的角度來看,分區後的表與非分區表完全相同,使用 SQL DML 命令訪問分區後的表時,無需任何修改。
F. Oracle資料庫查詢分區表
查分區表user_tab_partitions,或者user_segments,或者user_objects都行。
個人感覺user_tab_partitions比較好。
至於6個月之前,可以用sysdate和add_months來做,然後再to_char截取,就行
G. 資料庫分區表 什麼情況下需要分區
數據量很大,而且經常按照某個欄位進行條件過濾或者分組時,可以考慮使用分區,例如某種商品的銷售情況,經常要查看某個月、某個季度的銷售明細或者總計,則可以根據銷售日期進行分區,每個月分為一個區,而且最好是能夠把不同區的數據分別存放在不同的物理硬碟上,這樣在進行查詢的時候,如果查詢某個月的數據,可以直接在特定硬碟查詢,數據量小,速度快,如果查詢所有月份的數據,多塊硬碟可以並行查詢,速度也會明顯提高。
H. MySQL 表數據分區,每10000條數據自動分區
Mysql不能自動創建分區,需要使用mysql event事件的方式自動創建分區
1.創建分區的存儲過程如下(每次執行先校驗當前分區是否存在,如果存在則不處理;不存在則創建):
DELIMITER $$#該表所在資料庫名稱USE `demo`$$DROP PROCEDURE IF EXISTS `create_partition_by_day`$$CREATE PROCEDURE `create_partition_by_day`(IN_SCHEMANAME VARCHAR(64), IN_TABLENAME VARCHAR(64))BEGIN #當前日期存在的分區的個數 DECLARE ROWS_CNT INT UNSIGNED; #目前日期,為當前日期的後一天 DECLARE TARGET_DATE TIMESTAMP; #分區的名稱,格式為p20180620 DECLARE PARTITIONNAME VARCHAR(9); #當前分區名稱的分區值上限,即為 PARTITIONNAME + 1 DECLARE PARTITION_ADD_DAY VARCHAR(9); SET TARGET_DATE = NOW() + INTERVAL 1 DAY; SET PARTITIONNAME = DATE_FORMAT( TARGET_DATE, 'p%Y%m%d' ); SET TARGET_DATE = TARGET_DATE + INTERVAL 1 DAY; SET PARTITION_ADD_DAY = DATE_FORMAT( TARGET_DATE, '%Y%m%d' ); SELECT COUNT(*) INTO ROWS_CNT FROM information_schema.partitions WHERE table_schema = IN_SCHEMANAME AND table_name = IN_TABLENAME AND partition_name = PARTITIONNAME; IF ROWS_CNT = 0 THEN SET @SQL = CONCAT( 'ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`', ' ADD PARTITION (PARTITION ', PARTITIONNAME, " VALUES LESS THAN (", PARTITION_ADD_DAY ,") ENGINE = InnoDB);" ); PREPARE STMT FROM @SQL; EXECUTE STMT; DEALLOCATE PREPARE STMT; ELSE SELECT CONCAT("partition `", PARTITIONNAME, "` for table `",IN_SCHEMANAME, ".", IN_TABLENAME, "` already exists") AS result; END IF;END$$DELIMITER ;
2.資料庫定時任務(每小時執行一次)
DELIMITER $$#該表所在的資料庫名稱USE `demo`$$CREATE EVENT IF NOT EXISTS `daily_generate_partition`ON SCHEDULE EVERY 1 hour #執行周期,還有天、月等等STARTS '2018-06-20 00:00:00'ON COMPLETION PRESERVEENABLECOMMENT 'Creating partitions'DO BEGIN #調用剛才創建的存儲過程,第一個參數是資料庫名稱,第二個參數是表名稱 CALL datacollectcenter.create_partition_by_day('demo','test1');END$$DELIMITER ;
I. 在my sql中怎麼將數據表分區
可以看mysql的data文件夾下面的資料庫文件,就可以查看當前分區情況。
還有幾種獲取MySQL分區表信息的常用方法
SHOW CREATE TABLE
可以查看創建分區表的CREATE語句
SHOW TABLE STATUS
可以查看錶是否為分區表
查看INFORMATION_SCHEMA.PARTITIONS表
可以查看錶具有哪幾個分區、分區的方法、分區中數據的記錄數等重要信息
J. 資料庫分區和分表的區別
分區、分表、分庫的詳細理解
一、什麼是分區、分表、分庫
分區
就是把一張表的數據分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的
分表
就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然後操作它。
分庫
一旦分表,一個庫中的表會越來越多
將整個資料庫比作圖書館,一張表就是一本書。當要在一本書中查找某項內容時,如果不分章節,查找的效率將會下降。而同理,在資料庫中就是分區。
二、常用的單機資料庫的瓶頸
問題描述
單個表數據量越大,讀寫鎖,插入操作重新建立索引效率越低。
單個庫數據量太大(一個資料庫數據量到就是極限)
單個資料庫伺服器壓力過大
讀寫速度遇到瓶頸(並發量幾百)
三、分區
什麼時候考慮使用分區?
一張表的查詢速度已經慢到影響使用的時候。
sql經過優化
數據量大
表中的數據是分段的
對數據的操作往往只涉及一部分數據,而不是所有的數據
分區解決的問題
主要可以提升查詢效率
分區的實現方式(簡單)
mysql5 開始支持分區功能
四、分表
什麼時候考慮分表?
一張表的查詢速度已經慢到影響使用的時候。
sql經過優化
數據量大
當頻繁插入或者聯合查詢時,速度變慢
分表解決的問題
分表後,單表的並發能力提高了,磁碟I/O性能也提高了,寫操作效率提高了
查詢一次的時間短了
數據分布在不同的文件,磁碟I/O性能提高
讀寫鎖影響的數據量變小
插入資料庫需要重新建立索引的數據減少
分表的實現方式(復雜)
需要業務系統配合遷移升級,工作量較大
分區和分表的區別與聯系
分區和分表的目的都是減少資料庫的負擔,提高表的增刪改查效率。
分區只是一張表中的數據的存儲位置發生改變,分表是將一張表分成多張表。
當訪問量大,且表數據比較大時,兩種方式可以互相配合使用。
當訪問量不大,但表數據比較多時,可以只進行分區。
常見分區分表的規則策略(類似)
Range(范圍)
Hash(哈希)
按照時間拆分
Hash之後按照分表個數取模
在認證庫中保存資料庫配置,就是建立一個DB,這個DB單獨保存user_id到DB的映射關系