Oracle數(shù)據(jù)庫索引聚簇與哈希聚簇使用指南
索引聚簇的使用:
◆對經(jīng)常在連接語句中訪問的表建立聚簇。
◆假如表只是偶爾被連接或者它們的公共列經(jīng)常被修改,則不要聚簇表。(修改記錄的聚簇鍵值比在非聚簇的表中修改此值要花費(fèi)更多的時(shí)間,因?yàn)镺racle必須將修改的記錄移植到其他的塊中以維護(hù)聚簇)。
◆假如經(jīng)常需要在一個(gè)表上進(jìn)行完全搜索,則不要聚簇這個(gè)表(對一個(gè)聚簇表進(jìn)行完全搜索比在非聚簇表上進(jìn)行完全搜索的時(shí)間長,Oracle可能要讀更多的塊,因?yàn)楸硎潜灰黄鸫鎯Φ摹#?
◆假如經(jīng)常從一個(gè)父表和相應(yīng)的子表中查詢記錄,則考慮給1對多(1:*)關(guān)系創(chuàng)建聚簇表。(子表記錄存儲在與父表記錄相同的數(shù)據(jù)塊中,因此當(dāng)檢索它們時(shí)可以同時(shí)在內(nèi)存中,因此需要Oracle完成較少的I/O)。
◆假如經(jīng)常查詢同一個(gè)父表中的多個(gè)子記錄,則考慮單獨(dú)將子表聚簇。(這樣提高了從相同的父表查詢子表記錄的性能,而且也沒有降低對父表進(jìn)行完全搜索的性能)。
◆假如從所有有相同聚簇鍵值的表查詢的數(shù)據(jù)超過一個(gè)或兩個(gè)Oracle塊,則不要聚簇表。(要訪問在一個(gè)聚簇表中的記錄,Oracle讀取所有包含那個(gè)記錄值的全部數(shù)據(jù)塊,如果記錄占據(jù)了多個(gè)數(shù)據(jù)塊,則訪問一個(gè)記錄需要讀的次數(shù)比一個(gè)非聚簇的表中訪問相同的記錄讀的次數(shù)要多)。
哈希聚簇的使用:
◆當(dāng)經(jīng)常使用有相同列的包含相等條件的查詢子句訪問表時(shí),考慮使用哈希聚簇來存儲表。使用這些列作為聚簇鍵。
◆如果可以確定存放具有給定聚簇鍵值的所有記錄所需的空間(包括現(xiàn)在的和將來的),則將此表以哈希聚簇存儲。
◆如果空間不夠,并且不能為將要插入的新記錄分配額外的空間,那么不要使用哈希聚簇。
◆如果偶爾創(chuàng)建一個(gè)新的、很大的哈希聚簇來保存這樣的表是不切實(shí)際的,那么不要用哈希聚簇存儲經(jīng)常增長的表。
◆如果經(jīng)常需要進(jìn)行全表搜索,并且必須要為表的預(yù)期增長中的哈希聚簇分配足夠的空間,則不要將此表以哈希聚簇存儲。(這樣的完全檢索必須要讀分配給哈希聚簇的全部塊,即使有些塊可能只包含很少的記錄。單獨(dú)地存儲表將減少由完全的表檢索讀取的塊的數(shù)量。)
◆如果你的應(yīng)用程序經(jīng)常修改聚簇鍵的值,則不要將表以哈希聚簇方式存儲。
◆不論這個(gè)表是否經(jīng)常與其他表連接,只要進(jìn)行哈希對于基于以前的指南的表合適,那么在哈希聚簇中存儲一個(gè)表則是有用的。
