![]() |
|
v7: Прямой запрос. Виснет хотя раньше работал. | ☑ | ||
---|---|---|---|---|
0
AMKahm
17.01.14
✎
09:01
|
рс = СоздатьОбъект("ODBCRecordset");
тз = СоздатьОбъект("ТаблицаЗначений"); ТекстЗапроса = " |SELECT | TabSpr.id [Номенклатура $Справочник.Номенклатура] | , TabSpr.DESCR As Наименование | , TabSpr.CODE As Код | , Партии.id As [Партия $Справочник.Партии] | , $Партии.СвойствоПартии As СвойствоПартии | , ПартииНаличие.МОЛ As [МОЛ $Справочник.ФизЛица] | , ПартииНаличие.КоличествоОстаток As Остаток | , РезервыТМЦ.КоличествоОстаток As Резерв |FROM $Справочник.Номенклатура As TabSpr (nolock) | LEFT JOIN $РегистрОстатки.ПартииНаличие(:КонДата~,,,(Номенклатура,Партия,МОЛ),(Количество)) AS ПартииНаличие ON (TabSpr.ID = ПартииНаличие.Номенклатура) | LEFT JOIN $Справочник.ФизЛица As ФизЛица (nolock) ON ФизЛица.id = ПартииНаличие.МОЛ | LEFT JOIN $РегистрОстатки.РезервыТМЦ(:КонДата~,,,(Номенклатура,Партия,Склад),(Количество)) AS РезервыТМЦ ON ((РезервыТМЦ.Партия = ПартииНаличие.Партия) AND (РезервыТМЦ.Склад = $ФизЛица.Склад)) | LEFT JOIN $Справочник.Партии As Партии (nolock) ON Партии.id = ПартииНаличие.Партия |WHERE (TabSpr.IsMark = 0) AND (TabSpr.IsFolder = 2) AND ($TabSpr.НеВключатьВпрайс = 0) AND ($TabSpr.ФлИнтернет = 0) AND (TabSpr.ID IN (SELECT Val FROM #спЭлементов)) |ORDER BY Наименование |"; рс.УстановитьТекстовыйПараметр("КонДата", ТекущаяДата()); рс.УложитьСписокОбъектов(Константа.ГруппаКабеля.Родитель, "#спЭлементов", "Номенклатура"); тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); В моей "рабочей" базе, являющейся копией главной все работает. В главной раньше тоже работало. Вчера вечером перестало. SQL 2005 В мониторе пишет статус "suspended" и Тип ожидания(Wait type) "CXPACKET" и "IO_COMPLETION" Если удалить джойн по РезервыТМЦ - работает. Удалить джойн по ПартииНаличие - работает. Вместе нехочут. Я конечно могу 2 запроса сделать вместо одного но... Выслушаю все советы как лучше убиться обстенку |
|||
1
aka AMIGO
17.01.14
✎
09:06
|
ТИИ
больше ничего не знаю :) |
|||
2
dk
17.01.14
✎
09:08
|
было такое - база кирдык
|
|||
3
AMKahm
17.01.14
✎
09:09
|
Ну не кирдык - остальное вроде пашет...
в выходные решили выгрузить/загрузить там и ТИИ попробуем |
|||
4
Salimbek
17.01.14
✎
09:15
|
(0) SQL профайлером посмотреть - в какой конкретно запрос оно разворачивается, потом потестить этот запрос, на предмет плана выполнения, в Query-аналайзере.
А еще лучше, то собрать запросы, начиная с того, как оно в эту таблицу начнет выкладывать: #спЭлементов, чтобы и одинаковый набор данных был. ИМХО, тяжко ему РезервыТМЦ прикручивать. Вариант, как упростить работу SQL-ю - Резервы ТМЦ сформировать ранее без фильтров и джойнов, и уложить во временную таблицу, на ней создать индексы по полям "Партия" и "Склад". Потом в этом запросе делать джойн к этой таблице. |
|||
5
toypaul
гуру
17.01.14
✎
09:22
|
обновить статистику. и заметить что такое происходит после массового изменения данных в базе.
|
|||
6
toypaul
гуру
17.01.14
✎
09:23
|
(3) после загрузить-выгрузить обязательно обновить статистику
|
|||
7
AMKahm
17.01.14
✎
09:31
|
У меня 7.7 и модель SIMPLE
|
|||
8
AMKahm
17.01.14
✎
09:33
|
(5)"происходит после массового изменения данных в базе."
сейчас поспрашивал. оказывается после свертки базы в праздники ее не выгружали-загружали :( |
|||
9
ЧеловекДуши
17.01.14
✎
09:34
|
(0) Ресурсов не хватает. (как вариант)
Зачем тут поле "Номенклатура"? :) LEFT JOIN $РегистрОстатки.РезервыТМЦ(:КонДата~,,,(Номенклатура,Партия,Склад),(Количество)) AS РезервыТМЦ ON ((РезервыТМЦ.Партия = ПартииНаличие.Партия) AND (РезервыТМЦ.Склад = $ФизЛица.Склад)) |
|||
10
ЧеловекДуши
17.01.14
✎
09:36
|
+(0) А для его тут поля: "Партия" и "МОЛ"??
| LEFT JOIN $РегистрОстатки.ПартииНаличие(:КонДата~,,,(Номенклатура,Партия,МОЛ),(Количество)) AS ПартииНаличие ON (TabSpr.ID = ПартииНаличие.Номенклатура) |
|||
11
ЧеловекДуши
17.01.14
✎
09:37
|
(10) А все увидел...
LEFT JOIN $Справочник.Партии As Партии (nolock) ON Партии.id = ПартииНаличие.Партия |
|||
12
ДенисЧ
17.01.14
✎
09:38
|
(6) после загрузки статистика сама обновится...
|
|||
13
ЧеловекДуши
17.01.14
✎
09:39
|
+(0)Тогда вопрос, почему ты так уверен, что справочник
LEFT JOIN $Справочник.Партии As Партии (nolock) ON Партии.id = ПартииНаличие.Партия Есть в двух остатках? $РегистрОстатки.ПартииНаличие и $РегистрОстатки.РезервыТМЦ Это же разные регистры и тогда уж и партия у них может быть у одного заполнена, а у второго нет. |
|||
14
ЧеловекДуши
17.01.14
✎
09:40
|
+ В общем запросик лучше разбить на два запроса :)
|
|||
15
AMKahm
17.01.14
✎
09:45
|
(0) да я наверно скопировал откудато где надо было...
убрал Номенклатура - заработало. (13) так Партии.id = ПартииНаличие.Партия и РезервыТМЦ.Партия = ПартииНаличие.Партия Если партия есть то и резерв быть могет. А вот наоборот - никак. Такие дефицитные резервы по другому ставятся. Блин. Спасибо. Надо смотреть че копипастиш. Раньше правдо работало такчто хз чего щас нехотело. |
|||
16
ЧеловекДуши
17.01.14
✎
09:47
|
(15) Запрос по остатком избыточен.
Ты же понимаешь, что там выполняется Запрос в Запросе :) |
|||
17
AMKahm
17.01.14
✎
09:51
|
Снова ниче не работает. Через раз в общем. Как повезет.
Ладно, после выходных посмотрим |
|||
18
ЧеловекДуши
17.01.14
✎
09:57
|
||||
19
AMKahm
17.01.14
✎
09:58
|
(18)
Спасибо. Если после выходных косяки продолжаться буду копать :D |
|||
20
Salimbek
17.01.14
✎
10:01
|
(17) Просто твоя одна строчка: $РегистрОстатки.РезервыТМЦ разворачивается в SQL-е в огромную портянку, а еще к ней рисуются джойны, которые SQL пытается соптимизировать. Ну и на каком-то наборе данных у него, видимо, сносит крышу. Можно, конечно, помолиться и на статистику, но я предпочитаю подготовить данные для SQL-я чтобы ему не было так уж тяжко. Тем более что никакой сложности тут нет:
рс.ВыполнитьСкалярный("SELECT Номенклатура,Партия,Склад,КоличествоОстаток INTO #tmpRez FROM $РегистрОстатки.РезервыТМЦ(:КонДата~,,,(Партия,Склад),(Количество)) AS РезервыТМЦ"); и LEFT JOIN #tmpRez AS РезервыТМЦ ON ((РезервыТМЦ.Партия = ПартииНаличие.Партия) AND (РезервыТМЦ.Склад = $ФизЛица.Склад)) Кстати, как это ты собираешь Резервы и при этом не соединяешь по Номенклатуре? У тебя на каждую Номенклатуру своя Партия рисуется??? |
|||
21
AMKahm
17.01.14
✎
10:10
|
(20) Действительно просто! Попробую так. Заработает конечно.
Не понял про "на каждую Номенклатуру своя Партия" Партии - это под чиненый номенклатуре справочник. Тоесть у номенклатуры могет партий быть дофига. А у партии только одна номенклатура. Такто когда вяжем по партии вязать по номенклатуре не надо. |
|||
22
Salimbek
17.01.14
✎
10:14
|
(21) Ясно, у нас просто Партия - это докУмент, и в нем может быть куча Номенклатуры. Потому и уточнил.
|
|||
23
trad
17.01.14
✎
11:01
|
(0)
есть ли у регистра РезервыТМЦ по измерению Партия отборы итогов и движений? какое измерение в регистре первое? |
|||
24
AMKahm
17.01.14
✎
11:30
|
(23) с чего бы им не быть? это как посмотреть?
Измерения: Фирма, Номенклатура, Склад, Договор, Заявка, Партия, Очередность |
|||
25
trad
17.01.14
✎
11:33
|
(24) "это как посмотреть?" в свойствах измерения
|
|||
26
AMKahm
17.01.14
✎
11:35
|
ааа, ты по это - нет, стоят отбор итогов только у Номенклатуры и Заявки
|
|||
27
trad
17.01.14
✎
11:39
|
Тогда рекомендую, все таки, в соединение добавить условие РезервыТМЦ.Номенклатура = ПартииНаличие.Номенклатура
И для подобных запросов не плохо бы иметь еще и отбор движений по Номенклатуре |
|||
28
AMKahm
17.01.14
✎
11:45
|
База итак очень раздута... еще индексы добавлять...
Хотя можно попробовать. Надо будет на тестовой поиграться. Здесь у меня больше всего удивляет что этот запрос год почти работал нормально и вдруг перестал. |
|||
29
AMKahm
17.01.14
✎
11:46
|
На тестовой он за ~0.4 проходит. И пользуется нечасто.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |