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

Откуда:
Сообщений: 15
Добрый день!

Господа гуру, подскажите, пожалуйста! Я уже всю голову сломал.

Вот два варианта запроса:
Этот выполняется 2 секунды:
   SELECT TAttr.F_ATTRID, S.F_ATTRID, TAttr.F_INT64VAL, S.F_OBJID FROM TAttr, (
      SELECT O1.F_OBJID, A3.F_ATTRID FROM TAttr A
         INNER JOIN TObject O ON A.F_OBJID = O.F_OBJID AND O.F_OBJTYPEID = @ObjDefId AND A.F_ATTRDEFID = @ATTR_ST_GUISTR AND O.F_VERSION = 0
         INNER JOIN TAttr A1 ON A1.F_OBJID = A.F_OBJID AND A1.F_ATTRDEFID = @ATTR_ST_ETKOM
         INNER JOIN TAttr A2 ON A2.F_OBJID = A.F_OBJID AND A2.F_ATTRDEFID = @ATTR_ST_TIPETSKR
         INNER JOIN TAttr A3 ON A3.F_OBJID = A.F_OBJID AND A3.F_ATTRDEFID = @AttrDefId
         INNER JOIN TCLassifNode C ON C.F_CLASSIFID = A2.F_INT64VAL
         INNER JOIN TObject O1 ON O1.F_OBJTYPEID = @FloorObjDefId AND O1.F_VERSION = 0
         INNER JOIN TAttr A4 ON O1.F_OBJID = A4.F_OBJID AND A4.F_ATTRDEFID = @ATTR_ST_GUISTR AND A4.F_INT64VAL = A.F_INT64VAL
         INNER JOIN TAttr A5 ON A5.F_OBJID = A4.F_OBJID AND A5.F_ATTRDEFID = @ATTR_ET_NOMER --AND A5.F_INT64VAL = A1.F_INT64VAL
         INNER JOIN TAttr A6 ON A6.F_OBJID = A4.F_OBJID AND A6.F_ATTRDEFID = @ATTR_ET_TIP
         INNER JOIN TCLassifNode C1 ON C1.F_CLASSIFID = A6.F_INT64VAL AND C.F_CODE = C1.F_CODE
         INNER JOIN add_LINKET_UNOMtable UT ON A.F_INT64VAL = UT.UNOM
      ) S WHERE TAttr.F_ATTRID = S.F_ATTRID

А вот этот несколько часов:
   SELECT TAttr.F_ATTRID, S.F_ATTRID, TAttr.F_INT64VAL, S.F_OBJID FROM TAttr, (
      SELECT O1.F_OBJID, A3.F_ATTRID FROM TAttr A
         INNER JOIN TObject O ON A.F_OBJID = O.F_OBJID AND O.F_OBJTYPEID = @ObjDefId AND A.F_ATTRDEFID = @ATTR_ST_GUISTR AND O.F_VERSION = 0
         INNER JOIN TAttr A1 ON A1.F_OBJID = A.F_OBJID AND A1.F_ATTRDEFID = @ATTR_ST_ETKOM
         INNER JOIN TAttr A2 ON A2.F_OBJID = A.F_OBJID AND A2.F_ATTRDEFID = @ATTR_ST_TIPETSKR
         INNER JOIN TAttr A3 ON A3.F_OBJID = A.F_OBJID AND A3.F_ATTRDEFID = @AttrDefId
         INNER JOIN TCLassifNode C ON C.F_CLASSIFID = A2.F_INT64VAL
         INNER JOIN TObject O1 ON O1.F_OBJTYPEID = @FloorObjDefId AND O1.F_VERSION = 0
         INNER JOIN TAttr A4 ON O1.F_OBJID = A4.F_OBJID AND A4.F_ATTRDEFID = @ATTR_ST_GUISTR AND A4.F_INT64VAL = A.F_INT64VAL
         INNER JOIN TAttr A5 ON A5.F_OBJID = A4.F_OBJID AND A5.F_ATTRDEFID = @ATTR_ET_NOMER AND A5.F_INT64VAL = A1.F_INT64VAL
         INNER JOIN TAttr A6 ON A6.F_OBJID = A4.F_OBJID AND A6.F_ATTRDEFID = @ATTR_ET_TIP
         INNER JOIN TCLassifNode C1 ON C1.F_CLASSIFID = A6.F_INT64VAL AND C.F_CODE = C1.F_CODE
         INNER JOIN add_LINKET_UNOMtable UT ON A.F_INT64VAL = UT.UNOM
      ) S WHERE TAttr.F_ATTRID = S.F_ATTRID

Разница только в AND A5.F_INT64VAL = A1.F_INT64VAL.
Подскажите, пожалуйста, в чём проблема? Как сделать чтобы запрос выполнялся несколько секунд с этим условием AND A5.F_INT64VAL = A1.F_INT64VAL, мне оно нужно.
6 апр 17, 22:11    [20375409]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
Добрый Э - Эх
Guest
malov77,

планы запросов посмотреть не пробовал?
7 апр 17, 04:03    [20375783]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
aleks2
Guest
Добрый Э - Эх
malov77,

планы запросов посмотреть не пробовал?


Нафига их смотреть?
И так фсе ясно.

Тредстатреру следует:
1) Научиться внятно (прежде всего для себя) писать запросы. Что там за бред с TAttr?
2) Глядя на внятно написанный запрос - сделать на таблах нужные индексы и наступит... шастье.

ЗЫ. На TAttr
(F_ATTRDEFID, F_OBJID, F_INT64VAL, F_ATTRID)

ЗЗЫ. Правильное переписывание запроса приносит от 10 до ста раз большее ускорение, чем многочасовое разглядывание планов...
7 апр 17, 06:14    [20375817]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
malov77
Member

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

Разработкой базы и системы, которая её использует, занимаюсь не я.
Я не могу ничего поменять, только использовать то что уже есть.
Таблицу TAttr приходится JOIN'ить несколько раз, потому что там лежат значения всех атрибутов для любых объектов. В одной таблице.
Суть этого запроса в том, чтобы найти соответствие одного объекта другому по совпадающим значениям трёх атрибутов.
Как написать запрос по другому, я не знаю.
7 апр 17, 09:33    [20376115]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
malov77,

лють конечно.. 7 self join.. если не вникать, то попробуйте добавить OTION(RECOMPILE) или OTION(OPTIMIZE FOR UNKNOWN)
7 апр 17, 09:38    [20376130]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
Владислав Колосов
Member

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

выбор во временную таблицу, фильтр результата.
7 апр 17, 11:26    [20376684]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
malov77
Разработкой базы и системы, которая её использует, занимаюсь не я.
Я не могу ничего поменять, только использовать то что уже есть.
Так пусть они скажут, как писать этот запрос.

EAV - зло.
Типичная ситуация, программисты так задизайнили свою первую базу, потому что так красиво, а использовать - это пусть другие.
7 апр 17, 15:15    [20378060]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
Addx
Member

Откуда:
Сообщений: 957
alexeyvg
malov77
Разработкой базы и системы, которая её использует, занимаюсь не я.
Я не могу ничего поменять, только использовать то что уже есть.
Так пусть они скажут, как писать этот запрос.

EAV - зло.
Типичная ситуация, программисты так задизайнили свою первую базу, потому что так красиво, а использовать - это пусть другие.


С чего бы это зло?
Вы не любите кошек? Вы просто не умеете их готовить! (с)
7 апр 17, 15:46    [20378216]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
aleks2
Guest
Addx
alexeyvg
пропущено...
Так пусть они скажут, как писать этот запрос.

EAV - зло.
Типичная ситуация, программисты так задизайнили свою первую базу, потому что так красиво, а использовать - это пусть другие.


С чего бы это зло?
Вы не любите кошек? Вы просто не умеете их готовить! (с)


Мы на них собаку съели, если повар нам не врет.
7 апр 17, 15:52    [20378260]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52442
malov77
Суть этого запроса в том, чтобы найти соответствие одного объекта другому по совпадающим значениям трёх атрибутов.
Как написать запрос по другому, я не знаю.

Перестань думать квадратно-гнездовым методом и перейди на множества. Для решения задачи "найти объекты с совпадающими значениями трёх атрибутов" не надо атрибуты разворачивать в столбцы. Достаточно найти частичное соответствие двух множеств атрибутов, что делается одним джоином:
select L.FOBJ_ID, R.FOBJ_ID from TAttr L join TAttr R
 on L.F_ATTRDEFID=R.F_ATTRDEFID -- тут соответствие типов атрибутов
 and L.F_INT64VAL=R.F_INT64VAL  -- тут соответствие значение атрибутов
 and L.FOBJ_ID <> R.FOBJ_ID -- тут запрет соответствия объекта самому себе
group by L.FOBJ_ID, R.FOBJ_ID
HAVING count(*) = 3 -- тут условие на количество совпадающих атрибутов
8 апр 17, 14:11    [20380455]     Ответить | Цитировать Сообщить модератору
 Re: Огромная разница по времени выполнения из-за одного сравнения  [new]
malov77
Member

Откуда:
Сообщений: 15
Dimitry Sibiryakov,

Спасибо! Интересный вариант!

Спасибо всем за уделённое время, в итоге переписал с использованием временных таблиц. Теперь скорость более чем удовлетворительная.
10 апр 17, 10:56    [20384062]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить