建立分區表的語句是什么
建立分區表: Create table Employee( EmpNo varchar2 (10) primary key, Name varchar2(30), DeptNo Number (2) ) Partition by range(DeptNo) (partition PART1 values less than (11) tablespace PART1_TS, partition PART2 values less than(21) tablespace PART2_TS, partition PART3 valuse less than(31) tablespace PART3_TS partition PART4 values less than(MAXVALUE) tablespace PART4_TS ); 表Employee依據DeptNo列進行分區。
數據庫中表分割和表分區的區別比較
個人認為理論上使用表分割在性能上應該和建立表分區查不多,但是,表分割對于所有的數據庫都適用,而表分區只能用于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 2005表分區
前提是你的表上有聚焦索引(一般主鍵默認就是聚焦索引)
而且改的時候要把普通索引刪除掉(因為改是通過刪除聚焦索引實現數據切換的, 所以不刪除普通索引會導致普通索引被重建, 而切換到分區表再建立聚焦索引的時候又會導致普通索引重建一次, 所以刪除普通索引再重建可以避免兩次重建普通索引)
USE tempdb
GO
-- 測試表
CREATE TABLE *(
id int,
CONSTRAINT PK_id PRIMARY KEY CLUSTERED(
id)
)
INSERT *
SELECT 1 UNION ALL
SELECT 10
GO
-- 切換為分區表
-- 分區函數
CREATE PARTITION FUNCTION PF_test(int)
AS RANGE LEFT
FOR VALUES(5)
-- 分區架構
CREATE PARTITION SCHEME PS_test
AS PARTITION PF_test
ALL TO(
[PRIMARY])
-- 切換到分區表
ALTER TABLE *
DROP CONSTRAINT PK_id
WITH(
MOVE TO PS_test(id))
oracle的表空間,表分區及索引之間的關系;各位大蝦給分析一下這個
首先,要了解下表空間和區段的關系。
1、每個表空間中可以存放一個或多個段;
2、每個段是由一個或多個區段組成;
3、每個區段是有一個或多個連續的Oracle連續的數據塊組成。
然后,了解下將表數據分區存儲以及將索引分區存儲的意義:
1、分區表
當一個表的規模很大或者并行操作非常頻繁時,可以把這個表劃分成若干個分區,每個分區為一個存儲數據的段,因其對應的物理磁盤的邏輯結構及位置不同,所以可以提高并行操作的能力。
2、索引分區
當在一個大型表上創建索引時,這個索引也會很大,所以也可以像分區表那樣分區存儲。一個索可以分布在不同的表空間上,但是每個索引分區只能存放在一個表空間中。引入索引分區的目的也是減少輸入或輸出競爭。
oracle 查詢哪些表分區
如果查詢當前用戶下得分區表:
select * from user_tables where partitioned='YES'
如果要查詢整個數據庫中的分區表:
select * from dba_tables where partitioned='YES'
如果要查詢某個用戶下得分區表:
select * from dba_tables where partitioned='YES' and owner='ABCDEFG'
其中ABCDEFG為用戶名
oracle建表時按天分區的自動生成語句
DECLAREV_SQL VARCHAR2(1000);V_SQL_HEAD VARCHAR2(100);V_SQL_TAIL VARCHAR2(10);V_DAY VARCHAR2(8); CURSOR C_CUR ISSELECT TO_CHAR((TO_DATE('2012-01', 'yyyy-mm') + (ROWNUM - 1)), 'YYYYMMDD') S_DATE FROM DUALCONNECT BY ROWNUM <= LAST_DAY(TO_DATE('2012-12', 'yyyy-mm')) -TO_DATE('2012-01', 'yyyy-mm') + 1;BEGINDBMS_*(1000000); OPEN C_CUR;V_SQL_HEAD := 'PARTITION BY RANGE(ACCT_DAY)' || CHR(13) || '(';V_SQL_TAIL := CHR(13) || ')';DBMS_*_LINE(V_SQL_HEAD);LOOP FETCH C_CUR INTO V_DAY; EXIT WHEN C_CUR%NOTFOUND;V_SQL := 'PARTITION PART_' || V_DAY || ' ' || 'VALUES LESS THAN (''' ||TO_CHAR((TO_DATE(V_DAY, 'YYYYMMDD') + 1), 'YYYYMMDD') || ''')';DBMS_*_LINE(V_SQL); END LOOP;DBMS_*_LINE(V_SQL_TAIL); CLOSE C_CUR;END; 該語句執行之后的效果就是生成了2012年一年的分區,不重不漏。