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

Откуда:
Сообщений: 39
ПРЕДЫСТОРИЯ
-----------------------
1С не может делать выборку по условию OR в журналах документов. Не умеет и все. Разрабы положили на это большой болт. И
как альтернативу предлагают некий инструмент "Критерий отбора" который отправляет к СУБД дикий зарос с кучей джойнов:

SELECT
T1._Date_Time,
T1._Number,
T1._Fld2379,
T1._Fld407RRef,
T1._Fld777RRef,
T1._Fld2380,
T1._DocumentTRef,
T1._DocumentRRef,
T1._Marked,
T1._Posted,
T2._Description,
T3._Description
FROM _DocumentJournal406 T1 WITH(NOLOCK)
LEFT OUTER JOIN _Reference167 T2 WITH(NOLOCK)
ON T1._Fld407RRef = T2._IDRRef
LEFT OUTER JOIN _Reference63 T3 WITH(NOLOCK)
ON T1._Fld777RRef = T3._IDRRef
LEFT OUTER JOIN _Document1023 T4 WITH(NOLOCK)
ON T1._DocumentTRef = @P1 AND T1._DocumentRRef = T4._IDRRef
LEFT OUTER JOIN _Document1247 T5 WITH(NOLOCK)
ON T1._DocumentTRef = @P2 AND T1._DocumentRRef = T5._IDRRef
LEFT OUTER JOIN _Document786 T6 WITH(NOLOCK)
ON T1._DocumentTRef = @P3 AND T1._DocumentRRef = T6._IDRRef
LEFT OUTER JOIN _Document1306 T7 WITH(NOLOCK)
ON T1._DocumentTRef = @P4 AND T1._DocumentRRef = T7._IDRRef
LEFT OUTER JOIN _Document710 T8 WITH(NOLOCK)
ON T1._DocumentTRef = @P5 AND T1._DocumentRRef = T8._IDRRef
LEFT OUTER JOIN _Document1116 T9 WITH(NOLOCK)
ON T1._DocumentTRef = @P6 AND T1._DocumentRRef = T9._IDRRef
LEFT OUTER JOIN _Document1461 T10 WITH(NOLOCK)
ON T1._DocumentTRef = @P7 AND T1._DocumentRRef = T10._IDRRef
LEFT OUTER JOIN _Document1414 T11 WITH(NOLOCK)
ON T1._DocumentTRef = @P8 AND T1._DocumentRRef = T11._IDRRef
LEFT OUTER JOIN _Document3813 T12 WITH(NOLOCK)
ON T1._DocumentTRef = @P9 AND T1._DocumentRRef = T12._IDRRef
LEFT OUTER JOIN _Document924 T13 WITH(NOLOCK)
ON T1._DocumentTRef = @P10 AND T1._DocumentRRef = T13._IDRRef
LEFT OUTER JOIN _Document993 T14 WITH(NOLOCK)
ON T1._DocumentTRef = @P11 AND T1._DocumentRRef = T14._IDRRef
LEFT OUTER JOIN _Document1437 T15 WITH(NOLOCK)
ON T1._DocumentTRef = @P12 AND T1._DocumentRRef = T15._IDRRef
LEFT OUTER JOIN _Document975 T16 WITH(NOLOCK)
ON T1._DocumentTRef = @P13 AND T1._DocumentRRef = T16._IDRRef
LEFT OUTER JOIN _Document12 T17 WITH(NOLOCK)
ON T1._DocumentTRef = @P14 AND T1._DocumentRRef = T17._IDRRef
LEFT OUTER JOIN _Document511 T18 WITH(NOLOCK)
ON T1._DocumentTRef = @P15 AND T1._DocumentRRef = T18._IDRRef
LEFT OUTER JOIN _Document898 T19 WITH(NOLOCK)
ON T1._DocumentTRef = @P16 AND T1._DocumentRRef = T19._IDRRef
LEFT OUTER JOIN _Document1142 T20 WITH(NOLOCK)
ON T1._DocumentTRef = @P17 AND T1._DocumentRRef = T20._IDRRef
LEFT OUTER JOIN _Document836 T21 WITH(NOLOCK)
ON T1._DocumentTRef = @P18 AND T1._DocumentRRef = T21._IDRRef
WHERE ((T4._Fld1033RRef = @P19 OR T5._Fld1261RRef = @P19 OR T6._Fld803RRef = @P19 OR T7._Fld1319RRef = @P19 OR T8._Fld727RRef = @P19 OR T9._Fld1125RRef = @P19 OR T10._Fld1469RRef = @P19 OR T11._Fld1422RRef = @P19 OR T12._Fld3838RRef = @P19 OR T13._Fld932RRef = @P19 OR T14._Fld1001RRef = @P19 OR T14._Fld1004RRef = @P19 OR T15._Fld1445RRef = @P19 OR T16._Fld983RRef = @P19 OR T17._Fld354RRef = @P19 OR T18._Fld525RRef = @P19 OR T19._Fld907RRef = @P19 OR T20._Fld1159RRef = @P19 OR T21._Fld854RRef = @P19) AND T1._Date_Time >= @P20 AND T1._Fld607RRef = @P21 AND T1._Fld2379 = @P22)
ORDER BY T1._Date_Time, T1._DocumentTRef, T1._DocumentRRef', N'@P1 varbinary(4),@P2 varbinary(4),@P3 varbinary(4),@P4 varbinary(4),@P5 varbinary(4),@P6 varbinary(4),@P7 varbinary(4),@P8 varbinary(4),@P9 varbinary(4),@P10 varbinary(4),@P11 varbinary(4),@P12 varbinary(4),@P13 varbinary(4),@P14 varbinary(4),@P15 varbinary(4),@P16 varbinary(4),@P17 varbinary(4),@P18 varbinary(4),@P19 varbinary(16),@P20 datetime,@P21 varbinary(16),@P22 varbinary(1)', 0x000003FF, 0x000004DF, 0x00000312, 0x0000051A, 0x000002C6, 0x0000045C, 0x000005B5, 0x00000586, 0x00000EE5, 0x0000039C, 0x000003E1, 0x0000059D, 0x000003CF, 0x0000000C, 0x000001FF, 0x00000382, 0x00000476, 0x00000344, 0x93D7FB104D0FE3044CE8815AB7CD1F15, {ts '4013-02-01 00:00:00'}, 0x931300179A06253911DBD13DF9434204, 0x01


Подчеркиваю текст запроса генерит платформа (1С 8.2.15) и увы я не могу его видоизменять.
Как видите вместо того чтобы оперировать напрямую нужными колонками из таблицы T1
имеем пачку JOINов которые цепляются ко всем таблицам по ключу из T1 вытаскивают данные и только потом OR
Да поля по которым накладывается условие OR _Fld1261RRef,_Fld803RRef,.... имеют индексы


ПРОБЛЕМА
-----------------
Как не странно этот запрос-монстр работает. Но работает нестабильно.
А именно не устраивает его производительность. Когда сервер не нагружен он отрабатывает в доли секунды.
Когда на сервере куча народу и большая транзакционная нагрузка тут то начинают лаги. Вместо долей секунд
он отрабатывает минуты при небольшом количестве отбираемых данных


ВНИМАНИЕ ВОПРОС
------------------------
Как не переписывая это убожество (у меня нет исходников платформы 1с :) заставить его работать стабильно.
Чем можно крыть?
Переиндексирование всей бд и обновление статистики занимает около часа.
Возможно както перендексировать или обновлять очень прицельно и конкретно? Подскажите как.
В администрировании SQL не шибко силен. Ткните носом если надо.


Заранее спасибо за ответы.
15 май 13, 22:36    [14302289]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
ScareCrow
Member

Откуда: Белый город
Сообщений: 16921
посмотреть план запроса когда большая нагрузка и когда нет.
16 май 13, 02:18    [14302881]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
user89
Member

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

а как часто делается эта выборка?
У нас программист 1С попросил админов выделить ему не очень быстрый виртуальный сервер, где ночью, по расписанию идет Restore баз. Тяжелые запросы он выполняет на нем.
16 май 13, 10:00    [14303476]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
По моему, самое мудрое - написать в 1С о проблеме, посмотреть на их ответ, и сделать так же, как делают их разрабы. Если таких заявок будет много, им придется пошевелиться.
Пока 1С не даст механизм тюнить запросы, все подобные попытки починить черный ящик - очень трудозатратны, а отдача на копейки. В итоге... костылей очень много становиться, а нужно это все еще и поддерживать.
Вообще вижу 3 пути:
- пытаться что-то нашаманить глядя в план запроса, заранее зная, что текст запроса изменить нельзя.
- писать свои формы "журнал такой-то" со своим запросом и своим блэкджеком и механизмом OR. Но это не универсально.
- прикупить железа (это же 1С)
16 май 13, 10:30    [14303675]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
Air777
Member

Откуда:
Сообщений: 39
user89
Журнал это то что у пользователя открыто постоянно перед глазами. Основной инструмент так сказать.
Именно поэтому запрос может делаться достаточно часто.

Натолкните на мысль что можно сделать планами выполнения запроса.
16 май 13, 10:39    [14303738]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33930
Блог
Air777,

1) получаете быстрый план запроса
2) получаете медленный план запроса
3) если они отличаются, то быстрый план закрепляете за запросом, для 1с это происходит прозрачно
16 май 13, 12:30    [14304687]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
Air777
Member

Откуда:
Сообщений: 39
Как явным образом закрепить нужный план за нужным запросом?
16 май 13, 13:20    [14305108]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
Air777
Как явным образом закрепить нужный план за нужным запросом?
http://msdn.microsoft.com/ru-ru/library/bb964726(v=SQL.100).aspx
16 май 13, 13:33    [14305232]     Ответить | Цитировать Сообщить модератору
 Re: Тормозной запрос 1С LEFT OUTER JOIN  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Критик
Air777,
3) если они отличаются, то быстрый план закрепляете за запросом, для 1с это происходит прозрачно

осталось дело за малым: идентифицировать и закрепить план для 100500 разных запросов.
16 май 13, 13:46    [14305310]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить