CREATE PROC [dbo].[GetDataForReports]
(
@userID INT,
@startDate DATE,
@endDate DATE,
@reportType INT, -- 1: Search, 2: UnsuccessfulSearch, 3: SkuViewed
@eventLabel NVARCHAR(400) = NULL,
@level INT = NULL,
@pageNumber INT = NULL,
@pageSize INT = NULL,
@isAll TINYINT = NULL -- 1 for exporting reports
)
AS
BEGIN
IF ISNULL(@isAll,0) = 0
BEGIN
IF @level = 1
BEGIN
SELECT
EventLabel,
TotalCount = COUNT(*) OVER()
FROM
(SELECT DISTINCT EventLabel
FROM ClickStreamData WITH(NOLOCK)
WHERE EventDate BETWEEN @startDate AND @endDate
AND UserID = @userID
AND EventCategoryID = CASE
WHEN @reportType = 1
THEN 1
WHEN @reportType = 2
THEN 5
WHEN @reportType = 3
THEN 2
END
AND Eventlabel = ISNULL(@eventLabel, Eventlabel)
) T
ORDER BY
EventLabel
OFFSET ((@pageNumber - 1) * @pageSize) ROWS
FETCH NEXT @pageSize ROWS ONLY
END
0
A
回答
4
- 確保索引在UserId和EventDate上,也可能在EventLabel上。按下SSMS中的「包括實際執行計劃」按鈕,並使用它來搜索缺失的索引 - 這將希望與我保持一致,並且您可以精確調整查詢的索引。
- 對不起,我必須添加:請不要使用NOLOCK,它可以返回不準確的結果,除非您衡量性能並確實需要它。網上有很多關於它爲什麼不好的文章,這裏有其中之一http://www.jasonstrate.com/2012/06/the-side-effect-of-nolock/。 NOLOCK的替代方法通常是根據鎖定策略和鎖定升級設置正確設置DB。
+0
推薦指出nolock – jean
+0
我還想補充一點,如果您檢查執行計劃並且擁有所有必需的索引,並且它仍然很慢,那麼您可能想要檢查您的tempdb在您的服務器上是否正確配置。這種類型的查詢可能會在後臺使用tempdb,所以如果它的碎片化,空間不足或者每個cpu核心沒有一個文件,或者與其他應用程序共享磁盤IO帶寬,那麼整個服務器可能會變慢否則將會如此。 –
相關問題
- 1. 存儲過程提高性能
- 2. 提高存儲過程性能
- 3. 如何提高存儲過程的執行性能?
- 4. 如何提高存儲過程的性能?
- 5. 如何提高此功能的性能?
- 6. 使用存儲過程提高Crystal Reports的性能
- 7. 優化存儲過程的循環來提高性能
- 8. 哪種方法更適合提高存儲過程的性能
- 9. 使用存儲過程的性能會提高
- 10. 如何提高此查詢的性能?
- 11. 如何提高此查詢的性能?
- 12. 如何提高此控件的性能?
- 13. 如何提高此代碼的性能?
- 14. 如何提高此代碼的性能?
- 15. 如何提高此查詢的性能?
- 16. 如何提高此查詢的性能?
- 17. 如何提高此代碼的性能?
- 18. 提高存儲過程
- 19. 爲什麼存儲過程和函數會提高性能?
- 20. 如何使用多個if else語句提高存儲過程性能?
- 21. 如何提高此查詢的性能?它超過一分鐘?
- 22. Oracle存儲過程性能
- 23. 提高SQL Server中的過程性能
- 24. 提高SQL過程的性能
- 25. 提高SQL Developer中的存儲過程的性能 - 嵌套循環
- 26. 改善此存儲過程的性能在MySQL
- 27. 如何提高性能來存儲數據?
- 28. 如何優化此存儲過程?
- 29. 如何創建此存儲過程?
- 30. ASP.NET如何調用此存儲過程
你遇到了什麼樣的性能問題?慢?鎖定?。檢查查詢執行計劃以確定瓶頸在哪裏。你有沒有檢查是否有索引需要? – jsp