2012-10-26 37 views
2

我最近不得不向我們的數據庫團隊提出一組新的Postgres表格,這些表格將被我正在編寫的應用程序使用。他們失敗的設計,因爲我的表有上市等,從而領域:Postgres表可以按列順序進行優化嗎?

my_table 
    my_table_id : PRIMARY KEY, AUTO INCREMENT INT 
    some_other_table_id, FOREIGN KEY INT 
    some_text : CHARACTER VARYING(100) 
    some_flag : BOOLEAN 

他們說,該表將不是最佳的,因爲some_text出現some_flag之前,由於CHARACTER VARYING字段進行搜索慢BOOLEAN S,做了當表掃描,具有一個表結構的列更快,它的列的排列順序從最高精度到最低精度;因此,如下所示:

my_table 
    my_table_id : PRIMARY KEY, AUTO INCREMENT INT 
    some_other_table_id, FOREIGN KEY INT 
    some_flag : BOOLEAN 
    some_text : CHARACTER VARYING(100) 

這些DBA來自Sybase背景,最近才作爲我們的Postgres DBA進行切換。我想,這也許是不適用於Postgres的一個優化的Sybase(我想Postgres的是足夠聰明,不知何故不在乎有關列順序)。

無論哪種方式,我無法找到確認或否認任何Postgres的文檔。尋找任何戰鬥穿戴的Postgres DBA來權衡這是否是有效或虛假(或有條件有效!)索賠。

+0

不,列順序對PostgreSQL中的性能沒有影響。 –

回答

3

我與甲骨文類似問題的經驗,其中有9版本和10(或8,9)如果沒有記錯(由於行內找到列數據的CPU開銷)之間的行爲大的變化說起,我不認爲當一個實際的實驗相當直接和確定時,你應該依賴記錄的行爲來解決這樣的問題。

所以我建議你創建一個測試用例這一點。使用完全相同的數據和列以不同的順序創建兩個表,並運行重複和各種測試。嘗試將整個測試作爲一個可以在開發或測試系統上運行的腳本來實現,並告訴你答案。也許DBA是對的,你可以說,「嘿,證實你的想法,非常感謝」,或者你可能會發現沒有可衡量的和顯着的差異。在後一種情況下,您可以將整個測試交給DBA,並解釋如何不能重現問題。讓他們進行測試。

無論哪種方式,有人會學到一些東西,你已經得到了你可以應用到未來(或過去)版本的測試情況。

最後,張貼在這裏你發現了什麼;)

+1

我認爲這種差異主要表現在對錶格執行** lot **更新時(在這種情況下,開始處的可變長度數據需要移動)。但我認爲除非你正在運行一個非常繁忙的系統,否則實際上不能測量這些差異。 –

+0

真的,PG內部人員不夠熟悉。但是我懷疑,如果塊中有後續行,那麼塊中的所有後續數據都可能需要重寫,這會使差異變得微不足道。必須...抗拒...敦促... ...調查... –

+0

@DavidAldridge:不會重寫整個數據頁塊讀取器? –

1

數據庫設計點,還有就是你的設計和你的DBA表明沒有任何區別 - 你的應用程序不應該關心。在關係數據庫中(邏輯上)不存在列的順序;實際上,如果列的順序很重要(邏輯上)它失敗了1NF。

因此,簡單地通過所有創建表的腳本,你的DBA,讓他們在他們覺得這是在物理層次上最佳的任何方式實現(重新排序列)。您只需繼續申請。

數據庫設計不能失敗的列的順序 - 它根本不是設計過程的一部分。


大數據銀行未來的用戶必須得到保護,不必知道 數據是如何在機器舉辦...

...野兔處理的問題是這些數據的獨立性 - 的 獨立的應用程序和數據類型和變化 增長終端活動......

EF科德〜1979年

更改物理層......不得要求更改爲 應用...

Rule 8: Physical data independenceEF科德〜1985


所以我們在這裏 - 33歲後...

+1

我非常同情你的觀點Damir,但我認爲現實是DBA的將聲明他們認爲是最佳實踐的東西(我的經驗是,DBA相信很多很多事情從「真正的在先的版本」到「真正的在不同的數據庫中」 「到」完全垃圾「)並迫使每個人遵守。他們不會採用自己重新排列列的過程,我認爲他們不希望這樣做,因爲它會引入輸入錯誤,開發延遲和代碼版本問題的可能性。 續... –

+0

... cont 在這種情況下,他們的信念可能有一些基礎,如Oracle曾經使用過的(在訪問表中最右側的列時CPU開銷很高) - 它會非常值得找出它在Postgres中是否有效的問題。 –

+0

爲什麼? DBA可以在數據庫服務器上搜索緩慢的查詢並隨時添加索引,而無需諮詢開發人員。爲什麼這會有什麼不同?對於開發人員來說,DBA如何在磁盤上對齊他的字節並不重要。 –

1

你的DBA的很可能指的是,是「流汗的訪問策略到「給定元組(/行)中的布爾值。

在他們提出的設計,系統可以通過在字節9

看着你的建議設計「到」該值時,系統首先必須檢查所有的變長列的長度字段[而來之前它可以知道布爾值可以找到的字節偏移量。這總是比「他們」的方式慢。

他們的考慮是物理設計(它是一個正確的)之一。達米爾的答案也是正確的,但這是從LOGICAL設計的角度來看的答案。

如果你的DBA的這句話是真的打算爲「一個‘壞’設計的批評」,那麼他們應該指出的是,邏輯設計是工作(和列的順序並不在這一水平關係),物理設計是他們的工作。如果他們期望做物理設計(他們的工作),那麼老闆不再有任何理由讓他們保持就業。

相關問題