oracle中隨機(jī)取1條或N條(據(jù)說(shuō)效率更高)
select * from table1 sample(10) where rownum <= 10
--其中sample(10) 含義為檢索表中的10%數(shù)據(jù)
一鸟雏、數(shù)據(jù)冗余
**
**
關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)冗余主要是指關(guān)系數(shù)據(jù)庫(kù)中同一信息數(shù)據(jù)的重復(fù)存貯兽叮。
關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)冗余形成的原因:表的重復(fù)爽茴、屬性的重復(fù)厨姚、元組的重復(fù)吕朵、屬性值的重復(fù)猎醇。有的數(shù)據(jù)冗余用于數(shù)據(jù)間建立聯(lián)系、數(shù)據(jù)安全或?yàn)榱藬?shù)據(jù)使用的便利努溃,是必需的數(shù)據(jù)冗余硫嘶,而其余的數(shù)據(jù)冗余為非必需的數(shù)據(jù)冗余應(yīng)盡量予以消除。
數(shù)據(jù)冗余容易產(chǎn)生數(shù)據(jù)的不一致性梧税,同時(shí)浪費(fèi)了寶貴的資源沦疾,應(yīng)盡量減少。但關(guān)系數(shù)據(jù)庫(kù)中為實(shí)現(xiàn)一些功能有些數(shù)據(jù)冗余是必需的第队。必需的數(shù)據(jù)冗余主要用于以下用途:
(1)數(shù)據(jù)間建立聯(lián)系哮塞,如兩表間通過(guò)共同屬性建立聯(lián)系;
(2)數(shù)據(jù)恢復(fù)凳谦,如建立備份文件以備正式文件被破壞時(shí)恢復(fù)忆畅;
(3)數(shù)據(jù)核查,如設(shè)立數(shù)據(jù)校驗(yàn)位可以檢查數(shù)據(jù)在存貯尸执、傳輸?shù)冗^(guò)程中的改變家凯;
(4)數(shù)據(jù)使用的便利,如為了查看數(shù)據(jù)的直觀如失,使用數(shù)據(jù)的方便肆饶、高效。
二岖常、分區(qū)表
**
**
(1) 表空間及分區(qū)表的概念:
表空間是一個(gè)或多個(gè)數(shù)據(jù)文件的集合驯镊,所有的數(shù)據(jù)對(duì)象都存放在指定的表空間中,但主要存放的是表竭鞍, 所以稱作表空間板惑。
分區(qū)表: 當(dāng)表中的數(shù)據(jù)量不斷增大,查詢數(shù)據(jù)的速度就會(huì)變慢偎快,應(yīng)用程序的性能就會(huì)下降冯乘,這時(shí)就應(yīng)該考慮對(duì)表進(jìn)行分區(qū)。表進(jìn)行分區(qū)后晒夹,邏輯上表仍然是一張完整的表裆馒,只是將表中的數(shù)據(jù)在物理上存放到多個(gè)“表空間”(物理文件上)姊氓,這樣查詢數(shù)據(jù)時(shí),不至于每次都掃描整張表喷好,而只是從當(dāng)前的分區(qū)查到所要的數(shù)據(jù)大大提高了數(shù)據(jù)查詢的速度翔横。
(2) 表分區(qū)有以下優(yōu)點(diǎn):
1、改善查詢性能:對(duì)分區(qū)對(duì)象的查詢可以僅搜索自己關(guān)心的分區(qū)梗搅,提高檢索速度禾唁。
2、增強(qiáng)可用性:如果表的某個(gè)分區(qū)出現(xiàn)故障无切,表在其他分區(qū)的數(shù)據(jù)仍然可用荡短;
3、維護(hù)方便:如果表的某個(gè)分區(qū)出現(xiàn)故障哆键,需要修復(fù)數(shù)據(jù)掘托,只修復(fù)該分區(qū)即可;
4籍嘹、均衡I/O:可以把不同的分區(qū)映射到不同磁盤(pán)以平衡I/O烫映,改善整個(gè)系統(tǒng)性能。
對(duì)應(yīng)的缺點(diǎn):
已經(jīng)存在的表沒(méi)有方法可以直接轉(zhuǎn)化為分區(qū)表噩峦,不過(guò) Oracle11g 提供了在線重定義表的功能。
(3) 如何創(chuàng)建表分區(qū)抽兆?
- 1识补、 創(chuàng)建范圍(range)分區(qū)
即根據(jù)分區(qū)鍵值的范圍進(jìn)行劃分,創(chuàng)建一個(gè)標(biāo)準(zhǔn)的range分區(qū)表:
> create table t_partition_range (id number,name varchar2(50))
partition by range(id)(
partition t_range_p1 values less than (10) tablespace tbspart01,
partition t_range_p2 values less than (20) tablespace tbspart02,
partition t_range_p3 values less than (30) tablespace tbspart03,
partition t_range_pmax values less than (maxvalue) tablespace tbspart04 );
- 2辫红、Hash分區(qū):
對(duì)于那些在列的值無(wú)法有效劃分范圍的表凭涂,可以使用hash分區(qū),這樣對(duì)于提高性能還是會(huì)有一定的幫助贴妻,hash分區(qū)會(huì)將表中的數(shù)據(jù)平均分配到你指定的幾個(gè)分區(qū)中切油,但無(wú)法控制數(shù)據(jù)被放入哪個(gè)分區(qū)。
> create table t_partition_range (id number,name varchar2(50))
partition by hash(id)(
partition t_range_p1 values less than (10) tablespace tbspart01,
partition t_range_p2 values less than (20) tablespace tbspart02,
partition t_range_p3 values less than (30) tablespace tbspart03,
partition t_range_pmax values less than (maxvalue) tablespace tbspart04 );
- 3名惩、列表(list)分區(qū):
如果表的某個(gè)列的值可以枚舉澎胡,則可以考慮對(duì)表進(jìn)行列表分區(qū),比如客戶表可以按照客戶所在的省份進(jìn)行分區(qū)娩鹉,同樣只用將partition by 后關(guān)鍵詞換為list即可攻谁。
(4) 表分區(qū)策略
對(duì)表進(jìn)行分區(qū)設(shè)計(jì)時(shí),首先要考慮和分析分區(qū)表中每個(gè)分區(qū)的數(shù)據(jù)量弯予,
確定哪些表屬于大表戚宦。
關(guān)于分區(qū)的表空間的規(guī)劃,要對(duì)每個(gè)表空間大小進(jìn)行估算锈嫩,比如每個(gè)季度數(shù)據(jù)為100MB受楼,那么最好創(chuàng)建120MB的表空間垦搬,同時(shí)還要考慮數(shù)據(jù)量的增長(zhǎng)。
(5) 管理分區(qū)表
對(duì)已經(jīng)存在表分區(qū)的表艳汽,進(jìn)行的操作有:添加表分區(qū)猴贰、刪除分區(qū)、合并分區(qū)等骚灸。
- 1糟趾、添加表分區(qū)
1、范圍分區(qū)表(range partitioned table)
ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-ddhh24:mi:ss'));
2甚牲、哈希分區(qū)表(hash partitioned table)
ALTER TABLE hash_example ADD PARTITION part03;
3义郑、列分區(qū)表(list partitioned table)
ALTER TABLE list_example ADD PARTITION part04 VALUES ('TE');
ALTER TABLE list_example MODIFY PARTITION part04 ADD VALUES('MIS');
ALTER TABLE list_example MODIFY PARTITION part04 DROP VALUES('MIS');
- 2、刪除表分區(qū)
ALTER TABLE ... DROP PARTITION part_name;
- 3丈钙、合并表分區(qū)
ALTER TABLE range_example MERGE PARTITIONS part01_1, part01_2 INTO PARTITION part01 UPDATE INDEXES;
--將part01_1和part01_2分區(qū)合并成part01分區(qū)非驮,如果省略u(píng)pdate indexes子句的話,必須重建受影響的分區(qū)的index;