2010-10-14 63 views
1

所以,在我看來,對於具有10k條記錄的表的查詢和對具有10條記錄的表的查詢幾乎同樣快,如果它們都獲取大致相同數量的記錄並充分利用簡單索引(auto增量,記錄id類型索引字段)。有效索引能夠在多大程度上克服非常大的表的性能問題?

我的問題是,這將延伸到與接近4條十億記錄的表,如果它是正確索引,數據庫是建立在這樣一種方式,查詢始終有效地利用這些指標?

此外,我知道將新記錄插入到一​​個非常大的索引表中可能會非常緩慢,因爲如果我只將新記錄添加到表的末尾,所有索引都必須重新計算,那麼我可以避免這種減速,還是不行,因爲索引是一棵二叉樹,並且樹的大塊仍然需要重新計算?

最後,我四處張望了一下大約有非常大的表工作一個常見問題/警告,但未能真正找到一個,所以如果有人的類似的東西都知道,鏈接,將不勝感激。

+0

PostgreSQL的性能取決於不止多少條記錄。但是一般來說,如果你有數十億條記錄,那麼數據庫將會變慢,即使有很多RAM。雖然RAM速度很快,但您仍然需要查找/讀取/讀取數據,然後對數據執行計算。請記住,「較慢」是一個相對術語。沒有Hadoop之類的東西,數據庫一直在增強內存和CPU以提高性能。 – vol7ron 2010-10-14 04:02:26

+0

如果你打算使用非常大的表格,你可能想要考慮類似NoSQL的數據庫,比如Hadoop;使用map reduce來分配服務器節點的工作。 – vol7ron 2010-10-14 04:04:45

+1

「如果你打算使用非常大的表格」定義非常大的表格。 – Kuberchaun 2010-10-14 14:13:01

回答

1

這裏是關於大表和索引的對他們的影響,包括成本/效益一些良好的閱讀,爲你的要求:

http://www.dba-oracle.com/t_indexing_power.htm

+0

引用的文章沒有深入調查索引非常大的表。它只是討論索引的基礎知識。 – 2010-10-14 01:43:41

1

索引非常大的表(與任何數據庫相關的)取決於在許多因素上,包括您的訪問模式,讀取與寫入的比例以及可用RAM的大小。

如果你能適應你的「熱」(即經常訪問的索引頁)到內存中,然後訪問通常會很快。

用於索引非常大的表的策略,採用分區表和分區索引。 但是如果你的查詢沒有加入或過濾分區鍵,那麼在沒有分區的表上性能沒有提高,即沒有分區消除。

SQL Server Database Partitioning Myths and Truths

Oracle Partitioned Tables and Indexes

這是保持你的指標儘可能窄很重要。

Kimberly Tripp's The Clustered Index Debate Continues...(SQL Server)

1

通過唯一索引查找訪問數據將放緩爲表變得非常大,但不是很大。索引在Postgres中存儲爲B樹結構(不是每個節點只有兩個子節點的二叉樹),所以10k行表可能有2個級別,而10B行表可能有4個級別(取決於行)。所以當表格變得很大時,它可能會達到5級或更高,但這隻意味着讀取一個額外的頁面,因此可能不明顯。

當您插入新行,你無法控制,他們被插入到表的物理佈局,所以我假定你的意思是「表結束」使用被索引的最大值的條款。在這種情況下,我知道Oracle在葉塊分裂方面有一些優化,但我不知道Postgres。

0

如果正確編制索引,插入性能可能會受到的影響大於選擇性能。 PostgreSQL中的索引有大量的選項,可以讓你索引表的一部分或表中元組的不可變函數的輸出。如果索引的大小可用,索引的大小將比實際掃描表的速度慢得多。最大的區別在於搜索樹和掃描列表。當然,你仍然有磁盤I/O和內存開銷進入索引使用,所以大型索引的性能不如理論上可以達到的。