2017-02-09 43 views
0

討論與同事的SQL性能,以及維護我們的操作數據存儲表的主題。我的同事(比我更有經驗的人)認爲,在數據更新發生時,刪除表,重新創建並插入其所有記錄比在表上執行標準DML操作更快。作爲我的懷疑論者,以及我以前的編程背景(在R中),似乎完全違揹我的直覺。Vanilla DML操作vs DROP,RECREATE,(RE)INSERT - 哪個更高效?

單個記錄大約是。 1.6 KB,分佈在約。 50列。記錄數量因業務流程而異,但表格的大小範圍很大,最小的記錄大約爲25000條記錄,最大的記錄大約爲25000000條記錄。典型的數據加載到ODS表格中,每個表格每天創建或修改0到500條記錄。

哪種選擇更好的性能,保持良好索引表,並使用香草DML操作(INSERTUPDATEDELETE)與2個DML操作(DROP TABLECREATE TABLE)與單一INSERT操作?

+1

'...蔓延約。 50列......這不是數據庫表。這是一個電子表格! – joop

+0

@joop的確如此。我聽到你,但我們無法控制這些ODS表的範圍。我們的源系統有一個特定的數據模型(EAV),我們透過這個模型創建ODS類表 - 因爲試圖對EAV數據模型進行操作報告是自殺。如果客戶端已經配置了一組數據以具有100個屬性,則該表將具有* k * + 100列,其中* k *是某個常數(如果我沒有記錯,則爲5)。 – Marley

回答

-1

如果您不需要表格記錄或需要恢復它們,那麼最佳性能是截斷表格。它將保留您的模式和表定義,因此您不必重新創建它,它會刪除所有記錄(儘管不可恢復),並允許您插入所有新記錄。在插入時,您的表格將創建一個新的索引。截斷不會記錄更改使其效率更高。

+0

truncate語句被MINIMALLY記錄。共同的信念是一個錯覺,最好不要轉載。更多關於這裏的TRUNCATE聲明:http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-1930-truncate-table-is-non-logged/ –

+0

是的,你是對的。當我提到伐木時,我應該更具體一些。它不會記錄單獨的行,這些行可以大大節省delete語句,特別是在大型表上,並且一旦提交,就無法恢復。 – kubasnack