Производительность при заказе по вычисляемому столбцу - PullRequest
3 голосов
/ 29 августа 2011

Мне нужно отсортировать довольно большой набор данных на основе вычисляемого столбца. Вот часть запроса, которая выполняет сортировку

Select Row_Number() over(Order By 
        CASE WHEN @sortBy Is Not Null AND @sortBy='relevance' 
        THEN 
            aRank*0.4+bRank*.2+cRank*.4 
        END DESC
        ,CASE WHEN @sortBy Is Not Null AND @sortBy='date' THEN CreateDate END DESC
        ) As rowNumber
......
from X
OUTER APPLY
    (
        Select SkillMatchRank...........
    ) SMR
Where 
SkillMatchRank>0

Проблема в том, что это работает очень медленно.

Мои наблюдения:
SkillMatchRank > 0 похоже, что вызывает проблему.

Есть идеи, как мы могли бы это улучшить?

Ответы [ 3 ]

2 голосов
/ 29 августа 2011

Взгляните на план выполнения и посмотрите, где ваши проблемные места наверняка.Если это вычисленное значение, вы можете посмотреть на создание вычисляемого столбца в вашей таблице или, возможно, на создание индексированного представления.

Оба они являются постоянными формами данных, то есть они фактически занимают место, поскольку вычисленные значения сохраняются заранее, а не вычисляются во время выполнения.

Вот несколько ссылокчтобы вы начали понимать план выполнения:

0 голосов
/ 29 августа 2011

Можно создать индекс для таблиц в памяти, если вы хотите добавить число строк в таблицу с большим количеством строк, требуется индекс.В противном случае вы будете испытывать очень медленное время отклика или, в худшем случае, он может даже потерпеть неудачу при нехватке памяти.

Не могли бы вы попробовать что-то подобное в таблицах памяти?У меня нет доступа к базе данных до завтра

Alter table <yourtable> add column sortrank cast(arank*.4 + brank*.2 + crank*.4 as real)

CREATE NONCLUSTERED INDEX Idx1 ON <yourtable>(SortRank);

CREATE NONCLUSTERED INDEX Idx2 ON <yourtable>(CreateDate);

Select Row_Number() over(Order By CASE WHEN @sortBy='relevance' THEN Sortrank END DESC 
,CASE WHEN @sortBy='date' THEN CreateDate END DESC) As rowNumber 
0 голосов
/ 29 августа 2011

Не могли бы вы сделать вычисляемый столбец частью оператора select и просто проигнорировать его?

select row_number(), computedcol = aRank*0.4+bRank*.2+cRank*.4
ORDER BY
computedcol
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...