Представления работают медленно, я должен использовать выбор в временных таблицах? - PullRequest
1 голос
/ 18 апреля 2011

Итак, у меня возникла серьезная проблема, потому что мой последний запрос времени выполнения составляет 8 минут, чтобы получить 2500 узлов. И это всего лишь сочетание 2-х других видов.

Первый вид:

SELECT
   RecTime, SQL AS str, ID, 
   ROW_NUMBER() OVER(ORDER BY RecTime,ID) AS rwnb 
FROM         
   (SELECT
       A.RecTime, X.SQL, X.ID
    FROM 
       dbo.EventView AS A 
    CROSS JOIN
       dbo.Incident AS X
    WHERE      
       (PATINDEX('%' + A.Col + '%', X.SQL) > 0)) AS INC

1 секунда и 1600 узлов

Второй вид:

SELECT     
   D.RecTime, D.Event, D.ID, CAST(CASE WHEN X.[Value] IS NULL THEN 0 ELSE X.[Value] END AS bit) AS Value
FROM         
   dbo.XDependencedEvents AS D 
INNER JOIN
    dbo.EventView AS X ON X.Col = D.Event 
                          AND D.RecTime BETWEEN X.RecTime AND X.ChangedDate

3 секунды выполнения и 2100 узлов

и окончательный вид -

SELECT 
    X.[Rectime], X.[ID], X.[str], D.[Event], D.[Value],X.[rwnb] 
FROM 
    [XDependencedIncidents] AS X
INNER JOIN [XEventStates] AS D ON X.[Rectime] = D.[Rectime]
                                  AND X.[ID] = D.[ID]

8 минут и 2500 узлов.

Я даже использую RowNumber AS rwnb для ускорения работы с представлениями, но это все еще очень медленно. Должен ли я использовать select во временных таблицах для первых 2 представлений? Или я что-то тут не так делаю?

Конечной целью является получение значений для некоторых «групп» «событий» для каждого случая, когда «события» меняются

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

попробуйте это:

SELECT X.[Rectime] , X.[ID] , X.[str], D.[Event], D.[Value],X.[rwnb] 
FROM [XDependencedIncidents] AS X
INNER JOIN [XEventStates] AS D ON X.[ID] = D.[ID]
WHERE X.[Rectime] = D.[Rectime]

Если это также медленно.Проверьте XEventStates Indexing.

0 голосов
/ 18 апреля 2011

Мое странное решение - использовать RowNumber, например, изменить 2-й и последний вид, например:

SELECT     D.RecTime, D.Event, D.ID
,CAST(CASE WHEN X.[Value] IS NULL THEN 0 ELSE X.[Value] END AS bit) AS Value
,ROW_NUMBER() OVER(ORDER BY D.RecTime,D.ID) AS rwnb 
FROM         dbo.XDependencedEvents AS D 
    INNER JOIN
    dbo.EventView AS X 
        ON X.Col = D.Event 
        AND D.RecTime BETWEEN X.RecTime AND X.ChangedDate

и

SELECT X.[Rectime] , X.[ID] , X.[str], D.[Event], D.[Value],X.[rwnb], D.[rwnb]
FROM [XDependencedIncidents] AS X
INNER JOIN [XEventStates] AS D ON X.[ID] = D.[ID]
AND X.[Rectime] = D.[Rectime]

Что вы думаете об этом странном методе оптимизации? Я действительно хочу лучшего решения, если оно есть.

Кстати, добавление номера строки составляет от 8 минут -> 5 секунд.

...