簡體   English   中英

在沒有SqlDataSource對象的情況下加快查詢SQL Server 2008 R2的方法

[英]Ways to speed up queries SQL Server 2008 R2 without SqlDataSource object

我正在嘗試在ASP.NET和C#中構建產品目錄應用程序,該應用程序將允許用戶從一系列下拉菜單中選擇產品屬性,並在gridview中顯示相關產品的列表。

在頁面加載時,從數據庫中查詢每個下拉菜單的選項以及gridview的整個產品目錄。 目前,該目錄包含6000多個項目,但是當應用程序上線時,我們的目光可能是該目錄的五到六倍。

在SQL Server Management Studio中執行該查詢時,拉出此目錄的查詢將在不到一秒鍾的時間內運行,但要花費十秒鍾以上的時間才能在網頁上呈現。 我們已經對查詢進行了盡可能多的優化:僅提取將在gridview中顯示的列(而不是說select * from ... ),並在查詢中添加with (nolock)命令以提取不包含數據的數據等待更新,但速度仍然太慢。

我已經研究了SqlCacheDependency ,但是所有可以找到的說明都假設我正在使用SqlDataSource對象。 我無法執行此操作,因為每次用戶從菜單中進行選擇時,都會構造一個新查詢並將其發送到數據庫以精煉所顯示產品的列表。

我不在這里,我希望有人可以提供一些見解。 如果您需要更多信息,請告訴我,我會盡快更新。

編輯:僅供參考,分頁不是這里的選項。 我為此而努力的人在這一點上堅定不移。 我能做的最好的就是將gridview包裹在div中,並帶有溢出:在CSS中自動設置。

我正在處理的表每隔幾個月不會更新一次以上。 有什么辦法可以在客戶端緩存此信息並以這種方式使用它?

您的大多數解決方案都將以幾種形式出現(與Gridview無關):

  1. 良好的索引。 為提取該數據的表創建良好的索引; 好的索引定義為:

    • 索引只存儲顯示產品所需的實際信息。 存儲的數據量越少,SQL Server中每8K頁可以存儲的數據量越大。
    • 覆蓋索引:您的SQL查詢應該完全符合您的需求(而不是SELECT * ),並且應該構建索引來覆蓋該查詢(因此將其稱為“覆蓋索引”)
  2. 良好的表結構:與索引一起使用。 提取信息所需的聯接越少,則提取信息的速度就越快。

  3. 尋呼。 您永遠不要一次拉出所有6000多個對象-哪個用戶可以一次查看6000個對象? 即使理論上的超人可以處理那么多數據; 那永遠不會成為您的中值用例。 一次拉50個左右(如果您確實需要那么多)或構建網站,以便始終拉動與用戶相關的內容,而不是拉動所有內容(請記住,這並不是要解決的瑣碎問題)

分頁的美麗之處在於您的客戶甚至不需要知道您已經實現了分頁。 一種這樣的技術稱為“ 無限滾動 ”。 有了它,您可以繼續並在客戶滾動到它們時獲取下N行。

如果(正如您所說的那樣)分頁確實不是一種選擇(盡管我真的對此表示懷疑;請解釋一下為什么您認為分頁,並且我很確定有人會找到解決方案),但實際上沒有辦法加快這種分頁的速度操作。

正如您所注意到的,不是花費很長時間的查詢,而是數據傳輸。 將數據從一個內存空間(sql)復制到另一個(您的應用程序)的速度並不快,並且顯示此數據的速度要慢幾個數量級。

編輯:為什么您的客戶“在這一點上堅定”? 他們為什么認為否則不可能呢? 他們為什么認為這是最佳解決方案?

有很多選項可以在網格上顯示大量數據,但第三方軟件可以顯示。 嘗試對ajax調用使用jquery / javascript網格。 它將幫助您在客戶端上呈現大量行。 甚至您也可以使用緩存來查詢數據庫多次。 這些是一個很好的網格,可以幫助您在網絡瀏覽器上顯示數千行:

  1. http://www.trirand.com/blog/
  2. https://github.com/mleibman/SlickGrid
  3. http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx
  4. http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records

希望對您有所幫助。

當應用程序(網頁)啟動時,您可以使用后台線程將所有行加載到客戶端上的數據表中。 然后僅使用數據表填充網格等。因此,您不必再次命中SQL,直到需要讀取/寫入其他數據為止。 (所有其他答案涵蓋其他選項)

暫無
暫無

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

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