簡體   English   中英

提高大型數據集的搜索性能

[英]Improving search performance in large data sets

在已經投入生產的WPF應用程序中,用戶有一個窗口,用於選擇客戶端。 它顯示包含所有客戶端的列表和可以搜索客戶端的TextBox。

隨着客戶群的增加,這種速度異常緩慢。 大約1分鍾的操作,每天發生約100次。

目前MSSQL管理工作室表示查詢select id, name, birth_date from client需要41秒才能執行(大約130000行)。

關於如何改善這段時間有什么建議嗎? 代碼上的索引,ORM或直接sql查詢?

目前我正在使用框架3.5和LinqToSql

如果您的查詢實際上是SELECT id, name, birth_date from client (即,沒有where子句),那么您將能夠做的很少,以加快新硬件的速度。 SQL Server必須進行表掃描才能獲得所有數據。 即使覆蓋索引也意味着它必須掃描與表一樣大的索引。

您需要問自己的是:130000個客戶列表對您的用戶真正有用嗎? 我真的要滾動到列表中的第75613條,找到他們想要的用戶嗎? 答案可能不是。 我只會選擇搜索選項。 至少那時你可以添加對這些查詢有意義的索引。

如果您確實需要整個列表,請嘗試以塊的形式加載它。 從前500條記錄開始,然后在用戶移動滾動條時添加更多記錄。 這樣,初始加載時間減少,用戶只加載必要的數據。

為什么需要所有客戶的清單? 難道你不能擁有你描述的搜索TextBox並在服務器端處理搜索查詢。 在那里,您為單個客戶端搜索的最大返回行數設置上限(例如,最多500個匹配)。

或者,可以通過在Web服務器上緩存客戶端數據列表來獲得一些效率增益

根據您的查詢,索引應該沒有幫助。 您可以使用一個緩存已排序查詢的視圖(假設您沒有按ID排序?),但鑒於SQL Server的adhoc查詢的烘焙查詢緩存,您可能不會在那里看到太大的收益。 ORM確實增加了一些開銷,但是有一些教程可以降低成本(例如http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-改進你的linq-to-sql-application-performance.html )。 適用於您的要點是盡可能使用已編譯的查詢,並為只讀數據關閉樂觀並發。

通過讓您的客戶端直接訪問數據庫,可以實現更大的性能提升。 如果你在那里添加一個服務層(不一定是web服務,但它可能是),那么服務類或應用程序可以放置一些智能緩存,這對於像這樣的只讀查詢有一個數量級的幫助。

進入SQL Server,進行新的查詢。 在“查詢”菜單中,單擊“包括客戶端統計信息”。

像在代碼中一樣運行查詢。 它將顯示結果以及名為“客戶端統計信息”的結果旁邊的選項卡

單擊它並在“服務器回復的等待時間”中查看時間。這是以ms為單位,它是服務器實際執行的時間。

我剛剛運行了這個查詢:

select  firstname, lastname from leads

在服務器上花了3ms來獲取301,000條記錄。

“總執行時間”類似於483ms,其中包括SSMS實際獲取數據並處理數據的時間。 我的查詢需要2.5-3s才能在SSMS中運行,剩余時間(2500ms左右)實際上是SSMS繪制結果等。)

我的猜測是,41秒可能沒有花在SQL服務器上,因為130,000條記錄確實沒那么多。 在SQL Server返回結果之后,41秒可能主要用於所有內容。

如果發現SQL Server需要很長時間才能執行,請在查詢菜單中啟用“包括實際執行計划”,然后重新運行查詢。 出現一個名為“執行計划”的新選項卡,此選項卡將顯示當您對此表執行選擇時SQL服務器正在執行的操作以及它花費所有時間的百分比。 在我的情況下,它在PK_Leads的“聚集索引掃描”中花費了100%的時間

編輯包含更多統計數據

一般來說:

  1. 找出需要花費大量時間,執行查詢或檢索結果的內容
  2. 如果查詢執行,查詢計划將告訴您哪些索引丟失,只需按下SSMS中的顯示查詢計划按鈕,您將獲得有關應創建哪些索引以提高性能的提示
  3. 如果它是值的檢索,除了升級硬件(ram,磁盤,網絡等)之外,你無能為力。

但:
在您的情況下,看起來查詢是全表掃描 ,這對性能來說永遠不會有好處,請檢查您是否真的需要一次檢索所有這些數據。
因為沒有條款,所以它的查詢執行不太可能是問題。 意味着其他索引無濟於事。

您需要更改應用程序訪問數據的方式。 不是將所有客戶端加載到內存中,然后在內存中從它們中搜索,而是需要將搜索項傳遞給數據庫查詢。

LinqToSql使您可以使用不同的功能來搜索值,這是一個描述其中大部分的博客: http//davidhayden.com/blog/dave/archive/2007/11/23/LINQToSQLLIKEOperatorGeneratingLIKESQLServer.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM