2010-10-28 60 views
7

有關索引大量數據的性能問題。我有一張大表(約3000萬行),其中4列索引,以便快速搜索。目前我設置了索引(索引?),然後導入我的數據。這大概需要4個小時,這取決於數據庫服務器的速度。首先導入數據,然後執行索引構建會更快/更高效嗎?TSql,在數據輸入之前或之後建立索引

回答

8

我試圖通過說,它會可能「先索引,插入後」會比「插入第一,索引之後」慢,你插入記錄到表中聚簇索引,但不能按該索引的自然順序插入記錄。原因在於對於每個插入,數據行本身必須在磁盤上進行排序。

作爲示例,請考慮一個uniqueidentifier字段上帶有聚集主鍵的表。 guid的(幾乎)隨機性意味着可能會在數據的頂部添加一行,導致當前頁面中的所有數據都被混洗(也可能是較低頁面中的數據),但下一行添加在底部。如果集羣開啓,比如說一個日期時間列,並且您恰好按照日期順序添加行,那麼記錄自然會以正確的順序插入磁盤,並且不需要昂貴的數據排序/混排操作。

我會支持溫斯頓史密斯的「取決於」的答案,但建議您的聚集索引可能是確定哪種策略對當前情況更快的重要因素。你甚至可以嘗試沒有聚集索引,看看會發生什麼。讓我知道?

+0

+1瞭解更多細節和上下文。 – 2010-10-28 13:58:45

+0

正在插入的數據是非常不順序的,插入後做索引要快得多。感謝您的解釋。 – John 2010-11-02 13:45:13

3

索引就位時插入數據會導致DBMS在每行之後更新它們。因此,首先插入數據並在之後創建索引通常會更快。特別是如果有這麼多的數據。

(然而,總是有可能出現特殊情況可能會導致不同的性能特徵。嘗試是肯定知道的唯一途徑。)

+0

** @ af **基於什麼假設是泛化?最近我嘗試了兩種方法,發現使用索引進行批量插入要比放下並重新創建要快得多,因爲在數百萬行的數據集上花費了大約20分鐘的時間。 – 2010-10-28 12:59:31

+0

是的,這完全取決於特定的數據,行的順序和索引。儘管DBMS必須在逐行插入東西時做更多的工作,但如果所有東西都按正確的順序進行,DBMS可以只寫東西,並且永遠不會重新排序數據或平衡索引數據結構。這些情況通常是例外情況,而不是常態。這取決於。通常事情並不排隊「恰到好處」。 – 2010-10-28 14:11:49

3

這將完全取決於您的特定數據和索引策略。你在這裏得到的任何答案都是一個猜測。

要知道確切的唯一方法就是嘗試兩種方法並進行適當的測量,這不難做到。

相關問題