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

Откуда: Murom
Сообщений: 1007
Всем доброго дня!
На веб страничке выполняется запрос. Тормоза с открытием страницы нехилые. 3 джойна в принципе нормально по скорости работают, но потом добавил в БД таблиц и смотрю стало очень медленно страница открываться. SQL Server CE.

Вот сам запрос:

var sqlSelect = "SELECT P.productID, P.article, P.title, P.price, P.LongSize, P.WidthSize, P.HeightSize, P.size, P.description, C.categoryName, CL.ColorTitle, CM.CountryName, T.MixTextileTitle, MT.TransformType, SH.ShellTitle, " +
                    "SM.StuffingTitle, F.FootTitle, P.BoxLinen, P.PillowStuff " +
                    "FROM FootElements AS F LEFT OUTER JOIN (StuffingMaterials AS SM LEFT OUTER JOIN " +
                    "(MebelShells AS SH LEFT OUTER JOIN (MechanismeTransforms AS MT LEFT OUTER JOIN (Colours AS CL LEFT OUTER JOIN " +
                    "(CountryManufacture AS CM LEFT OUTER JOIN(MixTextiles AS T LEFT OUTER JOIN " +
                    "(Categories AS C LEFT OUTER JOIN Products AS P ON C.categoryID=P.categoryID)ON T.TextileID=P.TextileID)ON CM.CountryID=P.CountryID)ON CL.ColorID=P.ColorID ) ON MT.TransformID=P.TransformID) " +
                    "ON SH.ShellID=P.ShellID) ON SM.StuffingID=P.stuffingID) ON F.FootID=P.FootID " +
                    "WHERE productID = @0";


Подскажите, как его оптимизировать. Или может сам запрос не гуд?
27 окт 16, 12:45    [19827826]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
trew
Member

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

У вас фильтр productID = @0, значит первая таблица после слова FROM должна быть Products и к ней присоединяйте остальные таблицы.
Запись LEFT JOIN идентична LEFT OUTER JOIN.

Условие WHERE productID = @0 поместите в JOIN т.е. будет (подставьте свои таблицы и поля):

FROM Таб1 LEFT JOIN Таб2 ON Таб1.f = Таб2.a AND Таб1.productID = @0
27 окт 16, 13:11    [19827985]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
план выполнения приложите
27 окт 16, 13:13    [19827994]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
orehov_i
Member

Откуда: Murom
Сообщений: 1007
Slava_Nik
план выполнения приложите


Под рукой нет Management Studio
27 окт 16, 13:27    [19828091]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
trew
orehov_i,

У вас фильтр productID = @0, значит первая таблица после слова FROM должна быть Products и к ней присоединяйте остальные таблицы.
Запись LEFT JOIN идентична LEFT OUTER JOIN.

Условие WHERE productID = @0 поместите в JOIN т.е. будет (подставьте свои таблицы и поля):

FROM Таб1 LEFT JOIN Таб2 ON Таб1.f = Таб2.a AND Таб1.productID = @0

секта перестановки условий расширяется...
27 окт 16, 13:31    [19828123]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1090
trew
orehov_i,

У вас фильтр productID = @0, значит первая таблица после слова FROM должна быть Products и к ней присоединяйте остальные таблицы.
Запись LEFT JOIN идентична LEFT OUTER JOIN.

Условие WHERE productID = @0 поместите в JOIN т.е. будет (подставьте свои таблицы и поля):

FROM Таб1 LEFT JOIN Таб2 ON Таб1.f = Таб2.a AND Таб1.productID = @0


отпимизатор должен смотреть на where из from?
27 окт 16, 13:38    [19828182]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
aleks2
Guest
Slava_Nik
план выполнения приложите

Нафига тут план?

План не нужен - нужны индексы.

ЗЫ. Скобочки - не нужны.
27 окт 16, 13:41    [19828202]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31957
trew
У вас фильтр productID = @0, значит первая таблица после слова FROM должна быть Products и к ней присоединяйте остальные таблицы.
Запись LEFT JOIN идентична LEFT OUTER JOIN.

Условие WHERE productID = @0 поместите в JOIN т.е. будет (подставьте свои таблицы и поля):

FROM Таб1 LEFT JOIN Таб2 ON Таб1.f = Таб2.a AND Таб1.productID = @0
У него же смысл запроса тогда полностью поменяется.

У него же из за присутствия условия productID = @0 в WHERE часть LEFT JOIN - ов превращаются в INNER JOIN?

Запрос действительно "не гуд".

Нагромождение вложенных LEFT OUTER JOIN со скобочками и вынесение условий - зачем это?
Как этот запрос выразить на русском языке?
SQL - это же простое условие на русском, переведённое на английский.
Как я понимаю, LEFT OUTER JOIN потому что "у них всегда так писали", а соединения обычные, не OUTER?.
27 окт 16, 19:17    [19830335]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
Владислав Колосов
Member

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

автор
Нагромождение вложенных LEFT OUTER JOIN


left join ... left join ... left join ... on .. on .. on ..

синтаксически эквивалентно

left join ... on ..
left join ... on ..
left join ... on ..
28 окт 16, 09:50    [19831927]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
o-o
Guest
Владислав Колосов
alexeyvg,

автор
Нагромождение вложенных LEFT OUTER JOIN


left join ... left join ... left join ... on .. on .. on ..

синтаксически эквивалентно

left join ... on ..
left join ... on ..
left join ... on ..

уже ж сказали, у него там inner join,
т.к. он фильтрует по полю правой таблицы
28 окт 16, 10:14    [19832104]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
o-o,

не совсем так, во-первых, я написал о синтаксисе "нагромождения", во вторых там INNER и не пахнет.

Там
F->P (наложен фильтр)
P->C
P->MT
P->
P->
P->
28 окт 16, 13:09    [19833222]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
o-o,

не совсем так, во-первых, я написал о синтаксисе "нагромождения", во вторых там INNER и не пахнет.

Там
F->P (наложен фильтр)
P(наложен фильтр) ->C
P(наложен фильтр) ->MT
P(наложен фильтр) ->SM
P(наложен фильтр) ->SH
P(наложен фильтр) ->CL
P(наложен фильтр) ->CM
P(наложен фильтр) ->T
28 окт 16, 13:10    [19833237]     Ответить | Цитировать Сообщить модератору
 Re: жутко тормозят outer join  [new]
orehov_i
Member

Откуда: Murom
Сообщений: 1007
Чуть переписал запрос. Индексы добавил. Вроде рассосалась проблема.

var sqlSelect ="SELECT P.productID, P.article, P.title, P.price, P.LongSize, P.WidthSize, P.HeightSize, P.size, P.description,P.BoxLinen,  P.PillowStuff, C.categoryName, " +
"MT.MixTextileTitle, CL.ColorTitle, CM.CountryName, T.TransformType, SH.ShellTitle, SM.StuffingTitle " +
"FROM  ((((((Categories AS C LEFT JOIN Products AS P ON C.categoryID=P.categoryID) LEFT JOIN MixTextiles AS MT ON P.TextileID=MT.TextileID) " +
"LEFT JOIN  Colours AS CL ON P.ColorID=CL.ColorID) LEFT JOIN CountryManufacture AS CM ON P.CountryID=CM.CountryID) " +
"LEFT JOIN MechanismeTransforms AS T ON P.TransformID=T.TransformID) LEFT JOIN MebelShells AS SH ON P.ShellID=SH.ShellID ) LEFT JOIN StuffingMaterials AS SM ON P.StuffingID=SM.StuffingID " +
"WHERE productID = @0";
1 ноя 16, 13:13    [19845832]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить