2009-02-28 61 views
1

我有一個已經在我的2人身上工作過的SP,仍然需要2分鐘或更長時間才能運行。有沒有辦法讓這些預運行和存儲在緩存或其他地方,所以當我的客戶需要在Web瀏覽器中查看這些數據時,他不想讓自己或我自己掛上?保存/緩存存儲過程結果以獲得更好的性能? (SQL Server 2005)

我不是在靠近DBA的地方,所以我受到我僱用的人的擺佈,以便爲我解決這個問題,所以在前面有一點知識會幫助我。

+0

此查詢的結果是否在線顯示,即在瀏覽器中顯示。如果是的話,你目前使用或正在使用哪種語言? – 2009-02-28 14:46:13

+0

是的,它顯示在網上 - 我使用.Net。我知道我可以在我的應用程序中緩存結果,但最初的調用需要幾分鐘的時間是一個真正的問題。 – Slee 2009-02-28 17:03:02

回答

8

如果確實需要很長時間才能運行,您可以安排使用SQL Agent運行進程,並將輸出轉到表中,然後更改Web應用程序以讀取表而不是執行存儲過程。您必須決定刷新的頻率,並處理刷新時發生的請求,但也可以通過生成兩個輸出文件(一個用於最新刷新)和一個輸出文件來處理。

但我會再看一下這個過程,看一下執行計劃,看看它在哪裏很慢,確保它沒有進行全表掃描。

1

從「查詢」菜單嘗試「分析數據庫引擎優化顧問中的查詢」。 我通常將過程編寫到一個新窗口中,取出查詢定義部分並嘗試臨時表,常規表和表變量的不同組合。

0

您可以將結果集緩存在應用程序中而不是數據庫中,或者在內存中保存數據表的實例,或者將其序列化到磁盤。它返回多少行? 在這裏發佈代碼太長了嗎?順序

4

首選的解決方案:

  1. 分析查詢,並相應地優化
  2. 緩存在應用程序中(可以使用httpRuntime.Cache(即使不是asp.net應用程序)
  3. 緩存SPROC導致數據庫中的表格,然後添加觸發器以使緩存失效(刪除表格),因此,對SPROC的調用將首先查看緩存表中是否有任何數據,如果沒有,請運行SPROC並存儲導致緩存表中,如果是這樣,返回該表中的數據SPROC的「源」表上的觸發器將會出現從CacheTable中刪除*到「清除緩存」(取決於你所做的sproc和它的依賴關係,你甚至可以根據觸發器部分更新緩存表,但所有這些很快就難以維護。但有時你必須做你必須做的事......這種方法將允許緩存表根據需要進行更新。您將始終擁有最新的數據,並且SPROC只會在需要時運行。
0

OK首先第一件事情,索引:

  • 你對錶有什麼指標,是利用他們的執行計劃?
  • 你有所有外鍵字段的索引嗎?

其次,它的PROC使用下列性能殺手:

  • 光標
  • 子查詢
  • 一個用戶定義的函數
  • SELECT *
  • 搜索以通配符開頭的標準

第三個

  • 可以將where子句重寫爲sargeable?有幾種方法可以寫出幾乎所有的東西,有些方法比其他方法更好。

我建議你去購買你的開發者關於性能調優的書籍。

可能你的過程可能是固定的,但是如果沒有看到代碼,很難猜出問題可能是什麼。