讓天下沒有難用的資料庫 » Oracle列順序的影響
Oracle列順序的影響
通常情況下,dba或開發人員在進行表設計的時候,都不會考慮到列在表中的順序的問題,那麼列的順序對我們加快訪問表中的資料有沒有作用喃?如果我們知道了資料庫引擎是怎樣在塊中儲存行的話,這個問題我們就能容易明白了。
H:header記錄了行本身的一些屬性資訊,比如是否鎖定,該行中有多少列等;
Ln:length每列的長度
Dn:data 資料
create table test_column_order
(
id1 number,
id2 number,
id3 number,
id4 number,
id5 number,
id6 number,
id7 number,
id8 number,
id9 number,
id10 number
)
begin
for i in 1..1000000 loop
insert into test_column_order values(1,2,3,4,5,6,7,8,9,0);
end loop;
end;
/
declare
sum1 number;
begin
for i in 1..200 loop
select count(id1) into sum1 from test_column_order;
end loop;
end;
/
declare
sum1 number;
begin
for i in 1..200 loop
select count(id10) into sum1 from test_column_order;
end loop;
end;
/
在瞭解了行的格式後,資料庫引擎要定位到某一列,但是它並不知道該列在這一行中的偏移值,這樣不得不從第一列開始,然後按照第一列的長度定位到第二列,然後在根據第二列的長度定位到第三列。那麼我們在定位第一列的速度應該是最快的,定位往後的列將會越來越慢。
那麼在瞭解資料庫的訪問規則後,dba應該將經常訪問的列放在表的前面。這個需要協同開發人員,在系統設計的時候,做出合適的評估。比如在表設計中經常使用的primary key,在sql稽核的時候,發現全部是放在了第一列,但是我們很少使用它,反而一些經常使用時間欄位,狀態標誌位放在了表的後面,如果我們能夠利用好列順序的影響,那麼對我們的效能提高也是有一定意義的。