2013-11-04 178 views
0

我正在使用SQL Server CE 4.0,並且越來越差DELETE查詢性能。SQL Server CE刪除性能

我的表格中有300,000行。

我的查詢是:

DELETE from tableX 
where columnName1 = '<some text>' AND columnName2 = '<some other text>' 

我使用的2場columnName1和columnName2一個非聚集索引。

我注意到,當要刪除的行數很少(比如< 2000)時,索引可以幫助2-3倍的性能。但是,當要刪除的行數較大(比如> 15000)時,索引根本沒有任何幫助。

我對這種行爲的理論是,當行數很大時,索引維護正在消除使用索引(索引查找而不是表掃描)所實現的增益。它是否正確?

不幸的是,我不能擺脫索引,因爲它顯着有助於非變異查詢性能。

另外,我還能做些什麼來提高> 15,000行的刪除性能?

我在Windows 7(32位)上使用SQL Server CE 4.0。

我的應用程序是用C++編寫的,並使用OLE DB接口來操作數據庫。

回答

4

有些東西被稱爲「the tipping point」,其中使用seek查找單個行的代價是不值得的,並且更容易僅執行單次掃描而不是數千次搜索。

一對夫婦的事情,你可能會考慮性能:

  • 有一個篩選的索引,如果這些在CE支持(老實說,我不知道)

  • 而不是刪除15000排在一次,batch the deletes into chunks

  • 考慮一個「軟刪除」 - 您只需將active列更新爲0.然後您可以實際刪除背景中較小批次的行。我的意思是,用戶是否真的坐在那裏等着主動刪除15,000行?爲什麼?

+0

謝謝。我已經考慮過你的批處理想法,但是如果我不需要的話,不想觸摸代碼。現在看來我必須(嘆氣)。 – rohitsan

+0

此外,15000行刪除需要1-2秒。這聽起來合理嗎? – rohitsan

+1

1-2秒刪除15,000行肯定不會聽起來像一個「問題」... –