有關索引大量數據的性能問題。我有一張大表(約3000萬行),其中4列索引,以便快速搜索。目前我設置了索引(索引?),然後導入我的數據。這大概需要4個小時,這取決於數據庫服務器的速度。首先導入數據,然後執行索引構建會更快/更高效嗎?TSql,在數據輸入之前或之後建立索引
回答
我試圖通過說,它會可能「先索引,插入後」會比「插入第一,索引之後」慢,你插入記錄到表中聚簇索引,但不能按該索引的自然順序插入記錄。原因在於對於每個插入,數據行本身必須在磁盤上進行排序。
作爲示例,請考慮一個uniqueidentifier字段上帶有聚集主鍵的表。 guid的(幾乎)隨機性意味着可能會在數據的頂部添加一行,導致當前頁面中的所有數據都被混洗(也可能是較低頁面中的數據),但下一行添加在底部。如果集羣開啓,比如說一個日期時間列,並且您恰好按照日期順序添加行,那麼記錄自然會以正確的順序插入磁盤,並且不需要昂貴的數據排序/混排操作。
我會支持溫斯頓史密斯的「取決於」的答案,但建議您的聚集索引可能是確定哪種策略對當前情況更快的重要因素。你甚至可以嘗試沒有聚集索引,看看會發生什麼。讓我知道?
索引就位時插入數據會導致DBMS在每行之後更新它們。因此,首先插入數據並在之後創建索引通常會更快。特別是如果有這麼多的數據。
(然而,總是有可能出現特殊情況可能會導致不同的性能特徵。嘗試是肯定知道的唯一途徑。)
** @ af **基於什麼假設是泛化?最近我嘗試了兩種方法,發現使用索引進行批量插入要比放下並重新創建要快得多,因爲在數百萬行的數據集上花費了大約20分鐘的時間。 – 2010-10-28 12:59:31
是的,這完全取決於特定的數據,行的順序和索引。儘管DBMS必須在逐行插入東西時做更多的工作,但如果所有東西都按正確的順序進行,DBMS可以只寫東西,並且永遠不會重新排序數據或平衡索引數據結構。這些情況通常是例外情況,而不是常態。這取決於。通常事情並不排隊「恰到好處」。 – 2010-10-28 14:11:49
這將完全取決於您的特定數據和索引策略。你在這裏得到的任何答案都是一個猜測。
要知道確切的唯一方法就是嘗試兩種方法並進行適當的測量,這不難做到。
- 1. 在數據加載之前或之後創建Oracle SQL索引是否更好?
- 2. 在插入數據庫之前或之後格式化數據?
- 3. 在創建活動之前或之後加載數據?
- 4. 在用數據填充表格之前或數據到位之後創建索引是否更好?
- 5. 之前或輸入標籤
- 6. 在空表上創建索引後插入數據或在Oracle上插入數據後創建唯一索引?
- 7. 創建ViewModel:在模型數據可用之前或之後執行此操作?
- 8. 使用psycopg2刪除索引在提交之前或之後生效?
- 9. 搜索引擎在JS加載之前或之後讀取HTML嗎?
- 10. 光標之前的匹配數(或位置用戶正在輸入之前)
- 11. 插入之前的數據庫創建
- 12. 在節點之前和之後插入
- 13. 急SQL:選擇數據之前或日期時間之後
- 14. 在添加子元素之前或之後創建文檔樹
- 15. codestyle;在註釋之前或之後放入javadoc?
- 16. NSMutablearray在其他元素之前或之後插入新元素
- 17. 在輸入數據之前檢查數據庫中的重複
- 18. 在ElasticSearch建立索引後搜索
- 19. C函數在輸入之前退出
- 20. 在SQL中:根據之前或之後的日期添加列?
- 21. 在numpy數組函數之後獲取數據幀的索引
- 22. 在git diff輸出之後改變之前和之後的行數
- 23. 法建立之前發生在陣列
- 24. 在建立連接之前關閉Socket.io
- 25. pcap_next()函數應該放在數據包傳輸之前還是之後?
- 26. 之前或之後的時間戳
- 27. onActivityCreated()之前或之後調用onDraw()?
- 28. 數數之前用戶輸入
- 29. 本地函數聲明應放在「return」之前或之後
- 30. flash as3在構造函數之前或之後定義變量?
+1瞭解更多細節和上下文。 – 2010-10-28 13:58:45
正在插入的數據是非常不順序的,插入後做索引要快得多。感謝您的解釋。 – John 2010-11-02 13:45:13