Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса. порядок джоинов  [new]
Ciget
Member

Откуда:
Сообщений: 134
ВОпрос к профи, ребят, пытаюсь оптимайзить запрос, вида
SELECT     T.MOID, T.MOCLASS, T.MOMODEL, T.USERMO, MAX(dbo.GET_USER_PRIVILEGES(ISNULL(T.GROUPID, T.USERMO), UPMO.UPMOPRIVILEGEACTION, 
                      UPMOC.UPMOCPRIVILEGEACTION, UPMODEL.UPMODELPRIVILEGEACTION, UPMODULE.UPMODULEPRIV, MOO.MOOWNER, 
                      MODELO.MODELOWNER, MODEL1.MODELOWNER)) AS PRIVILEGE
FROM         (SELECT     dbo.MO.MOID, dbo.MO.MOCLASS, dbo.MO.MOMODEL, USERS_AND_GROUPS.USERMO, USERS_AND_GROUPS.GROUPID
                       FROM          dbo.MO CROSS JOIN
                                                  (SELECT     USERMO, NULL AS GROUPID
                                                    FROM          dbo.USER_DB
                                                    WHERE      (USERMO IN
                                                                               (SELECT     USERMEMBER
                                                                                 FROM          dbo.MOC_USER_GROUP))
                                                    UNION
                                                    SELECT     dbo.USER_DB.USERMO, dbo.MOC_USER_GROUP.USERMO AS GROUPID
                                                    FROM         dbo.USER_DB LEFT OUTER JOIN
                                                                          dbo.MOC_USER_GROUP ON dbo.USER_DB.USERMO = dbo.MOC_USER_GROUP.USERMEMBER) AS USERS_AND_GROUPS) 
                      AS T LEFT OUTER JOIN
                      dbo.MOC ON dbo.MOC.MOCID = T.MOCLASS LEFT OUTER JOIN
                      dbo.USER_PRIVILEGE_MO AS UPMO ON UPMO.UPMOOBJECT = T.MOID AND UPMO.USERMO = ISNULL(T.GROUPID, T.USERMO) LEFT OUTER JOIN
                      dbo.USER_PRIVILEGE_MOC AS UPMOC ON UPMOC.UPMOCCLASS = T.MOCLASS AND UPMOC.UPMOCMODEL = T.MOMODEL AND 
                      UPMOC.USERMO = ISNULL(T.GROUPID, T.USERMO) LEFT OUTER JOIN
                      dbo.USER_PRIVILEGE_MODEL AS UPMODEL ON UPMODEL.UPMODELACCESSIBLEMODEL = T.MOMODEL AND 
                      UPMODEL.USERMO = ISNULL(T.GROUPID, T.USERMO) LEFT OUTER JOIN
                      dbo.USER_PRIVILEGE_MODULE AS UPMODULE ON UPMODULE.UPMODULE = 1 AND UPMODULE.USERMO = T.USERMO LEFT OUTER JOIN
                      dbo.MO_OWNERSHIP AS MOO ON MOO.MOOWNERMO = T.MOID AND MOO.MOOWNER = T.USERMO LEFT OUTER JOIN
                      dbo.MODEL_OWNERSHIP AS MODELO ON MODELO.MODELID = T.MOMODEL AND MODELO.MODULEOWNER = 1 LEFT OUTER JOIN
                      dbo.MODEL_OWNERSHIP AS MODEL1 ON MODEL1.MODELID = dbo.MOC.MOCMODELOWNER AND MODEL1.MODULEOWNER = 1
WHERE     (dbo.GET_USER_PRIVILEGES(ISNULL(T.GROUPID, T.USERMO), UPMO.UPMOPRIVILEGEACTION, UPMOC.UPMOCPRIVILEGEACTION, 
                      UPMODEL.UPMODELPRIVILEGEACTION, UPMODULE.UPMODULEPRIV, MOO.MOOWNER, MODELO.MODELOWNER, MODEL1.MODELOWNER) > 0)
GROUP BY T.MOID, T.MOCLASS, T.MOMODEL, T.USERMO

На сколько я знаю для оптимизации имеет огромное значение порядок джоинов и количество данных при соединении. Например сначала нужно джоинить меншее колиство данных или наоборот...
Подскажите как правильно. И еще одно какой набор гуд практис типа замени ISNULL() or cast()....на что-то другое для ускорения работы запроса.

Подскажите вещи которые следует знать, которые реально ускоряют работу.
Заранее благодарен.
18 сен 09, 13:39    [7678855]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ciget


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

Оптимизатор и так пробует соединять таблицы в различном порядке.
Если вы считаете, что он делает это неправильно, то вы можете указать ему порядок с помощью хинтов
18 сен 09, 13:45    [7678904]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
O_val
Member

Откуда:
Сообщений: 157
автор
для оптимизации имеет огромное значение порядок джоинов и количество данных при соединении. Например сначала нужно джоинить меншее колиство данных или наоборот...


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

Можно использовать
FORCE ORDER 
18 сен 09, 13:49    [7678931]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Ciget
Member

Откуда:
Сообщений: 134
хм, ок ... как тогда определить правильность порядка ?
Я запустил запрос в Database ENgine Tuning Advisor там проверил сделал все возможные шаги оптимизации, но время выполнения нереальное я жду 5 мин и не получаю результата...
что из теоретических основ оптимизации может помочь ? господа поделитесь опытом.
18 сен 09, 13:54    [7678966]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ciget
хм, ок ... как тогда определить правильность порядка ?

Ну вы же сами написали - "Например сначала нужно джоинить меншее колиство данных или наоборот"
18 сен 09, 13:55    [7678976]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Ciget
Member

Откуда:
Сообщений: 134
так как правильно ? джоинить с меньшим количеством или большим ?
18 сен 09, 13:58    [7678995]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
Оптимизатор успеет перебрать все варианты? По комбинаторике их там много. Я слышал при большом количество, он не успевает перебрать все варинты и выбирает лучший из выбраных.
18 сен 09, 14:01    [7679023]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ciget
так как правильно ? джоинить с меньшим количеством или большим ?

Вы хотите универсального решения что ли ?
Кроме порядка соединения есть еще и стратегии соединения
18 сен 09, 14:02    [7679027]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ciget,

правильно - привести план запроса и скрипты создания таблиц.
18 сен 09, 14:05    [7679057]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Ciget
Member

Откуда:
Сообщений: 134
Glory,

Где об этом можно почитать ...меня интересуют все методы. Универсального решения не жду, но хочу услышать максимально еффективные варианты.
18 сен 09, 14:08    [7679079]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Ciget, http://msdn.microsoft.com/ru-ru/library/ms176005(SQL.90).aspx
18 сен 09, 14:36    [7679299]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
Ciget,

ещё
18 сен 09, 14:40    [7679341]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. порядок джоинов  [new]
Ciget
Member

Откуда:
Сообщений: 134
PaulYoung,

Ок, спасибо почитал много прояснилось, но еще осталось пару вопросв...
Если основное что осталось не ясным - основное время тратитьсяна сортировку .. на которые (по мнению адвисора) проставлены оптимальные индексы .. что может помочь ??
18 сен 09, 15:22    [7679708]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить