Имя: Пароль:
1C
1C 7.7
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
(17) Вот держи, вдруг поможет...
Может чего слетело на SQL

http://yadi.sk/d/2DSqEyuAE57iJ
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 проходит. И пользуется нечасто.