2017-08-28 83 views
-1

我已經創建了一個存儲過程來獲取數據。在這個存儲過程中,我已經返回了超過5+的表和表,存儲了超過20k +的數據。所以現在我已經運行了存儲過程,以至於我在1分鐘以上的時間內獲取數據。我只想在1秒鐘內獲取數據。我也設置了SET NOCOUNT ON;並且還創建了缺失的索引。儘管如此,我還是得到了獲取數據的時間。如何提高SQL Server中使用存儲過程獲取數據的速度?

這是我的查詢=>

SET NOCOUNT ON; 

DECLARE @CurMon int 
DECLARE @year nvarchar(max) 
SELECT @CurMon = month(getdate()) 
SELECT @year = year(getdate()) 

SELECT 
    FORMAT(dateadd(MM, T.i, getdate()), 'MMM-yy') AS DateColumn, 
    CASE 
     WHEN uf.TotalCount IS NULL 
      THEN 0 
      ELSE uf.TotalCount 
    END AS TotalCount 
FROM 
    (VALUES ([email protected]),([email protected]),([email protected]),([email protected]),([email protected]),([email protected]),([email protected]), ([email protected]), ([email protected]), ([email protected]), ([email protected]), ([email protected])) AS T(i) 
OUTER APPLY 
    (SELECT DISTINCT 
     COUNT(datepart(MM, InsertDateTime)) OVER (PARTITION BY datepart(MM, InsertDateTime)) AS TotalCount 
    FROM 
     User 
    WHERE 
     DATEDIFF(mm, UF.InsertDateTime, DATEADD(mm, T.i, GETDATE())) = 0 
     AND IsLogin = 1) uf 
ORDER BY 
    DATEPART(MM, CONVERT(DATETIME, FORMAT(dateadd(MM, T.i, GETDATE()), 'MMMM') + '01 ' + @year, 110)) 

我有這樣的查詢像這樣在這裏請讓我怎麼能提高該SP。

+1

如果沒有關於表結構,現有索引,解釋計劃和一些示例數據的一些想法,這很難回答。 – GolezTrol

+0

使用查詢分析器來檢查發生了什麼。執行計劃也可以幫助解決您的問題。上傳一個,請 –

+0

@BerndOtt,但我看完執行計劃後創建了所有缺少的索引。但我仍然遇到同樣的問題 – Edit

回答

0

APPLY運算符爲查詢的外部表格表達式返回的每一行調用一個表值函數。

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://www.sqlshack.com/sql-server-query-execution-plans-understanding-reading-plans/

  1. 你嘗試從查詢中移除順序,然後檢查查詢性能。如果你需要的只是月份數,你爲什麼要在ORDER BY中格式化這麼多。 DATEADD之後可以DATEPART不能給你嗎?在大型集合中使用CONVERT和FORMAT可能會降低性能。

  2. 變化DATEDIFF在WHERE子句MONTH和,而不是DATEADD,獲得當月在頂部的整數,並加入到鈦

  3. 如果你想繼續使用OUTER APPLY,你還可以得到數據外部查詢應用於表格變量中,在表格變量上創建索引並使用OUTER APPLY,然後應用日期比較。

  4. 您是否可以將VALUES子句中的內容放入另一個表變量中,因爲您正在重複執行多個查詢。

  5. 再次在您的選擇字符串中,您的格式太多。您創建了自己的值T(i)。你可以有隻是把表變量2列

9月9日 - 17

10月10日 - 17

11月11日 - 17

然後,你就不會需要格式非常多。

  1. 而不是SELECT中的CASE語句,您可以使用ISNULL函數。

  2. 顯然,然後來索引,實際查詢執行計劃,鎖定和等待統計。您的表架構未知。

  3. 您可能需要重新編寫查詢以使用其他內容而不是OUTER APPLY,可能是CROSS APPLY或LEFT JOIN,如果這是可能的話。它們可以比OUTER APPLY更快。

https://dba.stackexchange.com/questions/75048/outer-apply-vs-left-join-performance

SQL View Outer Apply Speed

CROSS APPLY vs OUTER APPLY speed difference

  • 此外,檢查在安裝SQL服務器在PC上的任何空間的問題。檢查日誌文件清理。這些基本上可以由DBA在您的位置進行的活動。
  • +0

    可以請你給我一些提示,因爲你對我的查詢給予點? – Edit

    +0

    我也可以刪除順序,也可以設置isnull來替換大小寫,但我的查詢仍然需要更多時間。不能做任何更改請參閱 – Edit

    +0

    嘗試點號。 2&8. WHERE子句中的日期比較可能需要很長時間。此外,除此之外,您可以查找索引碎片,等待單個查詢的統計信息,以及單獨查詢所有查詢的實際查詢執行計劃。查詢執行計劃中百分比較高的點可能需要重新編寫。另外,請檢查安裝了SQL Server的PC上的任何空間問題。檢查日誌文件清理。這些基本上可以由DBA在您的位置進行的活動。 – Amit

    相關問題