2015-10-09 4 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 обычно настраивает БД правильно с точки зрения стратегии блокировки и настроек блокировки продвижения.
+0

upvoated для указания о nolock – jean

+0

Я также хотел бы добавить, что если вы проверите план выполнения и имеете все необходимые индексы, и все еще медленно, вы можете проверить, правильно ли настроен ваш tempdb на вашем сервере. Этот тип запроса мог бы использовать tempdb совсем немного за кулисами, поэтому, если его фрагментированный, не хватает места или у вас нет одного файла на ядре процессора, или для совместного использования дискового пространства с другими приложениями, то весь ваш сервер может быть медленнее чем было бы иначе. –

Смежные вопросы