2015-10-09 82 views
0
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 
+3

你遇到了什麼樣的性能問題?慢?鎖定?。檢查查詢執行計劃以確定瓶頸在哪裏。你有沒有檢查是否有索引需要? – jsp

回答

4
  1. 確保索引在UserId和EventDate上,也可能在EventLabel上。按下SSMS中的「包括實際執行計劃」按鈕,並使用它來搜索缺失的索引 - 這將希望與我保持一致,並且您可以精確調整查詢的索引。
  2. 對不起,我必須添加:請不要使用NOLOCK,它可以返回不準確的結果,除非您衡量性能並確實需要它。網上有很多關於它爲什麼不好的文章,這裏有其中之一http://www.jasonstrate.com/2012/06/the-side-effect-of-nolock/。 NOLOCK的替代方法通常是根據鎖定策略和鎖定升級設置正確設置DB。
+0

推薦指出nolock – jean

+0

我還想補充一點,如果您檢查執行計劃並且擁有所有必需的索引,並且它仍然很慢,那麼您可能想要檢查您的tempdb在您的服務器上是否正確配置。這種類型的查詢可能會在後臺使用tempdb,所以如果它的碎片化,空間不足或者每個cpu核心沒有一個文件,或者與其他應用程序共享磁盤IO帶寬,那麼整個服務器可能會變慢否則將會如此。 –