Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос и ТП
,
0 monsterZE
 
10.01.14
16:51
есть вот такой запрос (из дебагера)

select top 20
Т.ПрихДок as Док,
0 as Маркер,
(Т.Проведен - Т.Удален) as Статус,
left(Т.ДатаДок, 8) as ДатаДок,
dbo.formatTime(SUBSTRING(Т.ДатаДок,9,6),':') as ВремяДок,
Т.ПризнакНакладной as ПризнакНакладной,
Т.НомерДок as НомерДок,
Т.Клиент as Клиент,
Т.Основание as Основание,
Т.Закреплен as Закреплен
from (
    SELECT DISTINCT
    ДокП.IDDoc as ПрихДок
    ,ДокП.sp217 as Клиент
   ,ДокП.sp226 as ПризнакНакладной
    ,Жур.Date_Time_IDDoc as ДатаДок        
    ,Жур.Closed & 1 as Проведен
    ,Жур.ISMARK as Удален
    ,Жур.DocNo as НомерДок
    ,0 as Основание
    ,ДокП.sp1447 as Закреплен
    FROM
        dh214 as ДокП (NOLOCK)
    INNER JOIN
        _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокП.IDDoc AND (Жур.Date_Time_IDDoc BETWEEN '20140110' AND '20140110Z')
    INNER JOIN
        dt214 as ДокПСтр (NOLOCK) ON ДокПСтр.IDDoc = ДокП.IDDoc
    INNER JOIN
        sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227 AND СпрТов.sp1181 IN ('     5   ')    
WHERE
    ДокП.sp216 = '     2   '

    ) as Т

order by Т.ПрихДок
43 viktor_vv
 
11.01.14
14:22
(42) да не должно оно тупить, там же дергаться будет только то, что на экран влезло.
Это если тупняк действительно из-за строки с неограниченной длиной.
44 viktor_vv
 
11.01.14
14:23
(43) + имхо.
45 monsterZE
 
11.01.14
14:35
(43) Если будут еще затупы - перенесу в при_выводе_строки
пока очень помогло в старый запрос добавить условие по типу документа
46 viktor_vv
 
11.01.14
14:56
(45) Я тоже сомневаюсь что из-за строки.
Плюс запросы с журналом обычно делаю таблицу журнала основной с условиями в where и левым уже к ней леплю, как-то с inner периодически на грабли наступал. Оно конечно от перемены мест план не должен поменяться, но когда несколько соединений могу быть нюансы.
47 trad
 
11.01.14
19:13
(30) добавь в селект позицию документа Жур.Date_Time_IDDoc
и в ключе порядка укажи позицию
48 monsterZE
 
13.01.14
12:56
(47) хм - плюсов не дало..
поменял AND EXISTS на AND ДокП.IDDoc IN
примерно сравнялось по скорости с дестинкт-вариантом..
49 ADirks
 
13.01.14
13:53
я бы как-то так нарисовал

select top 20

    ДокП.IDDoc as Док,
    0 as Маркер,

    (Жур.Closed & 1 - Жур.ISMARK) as Статус,
    left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
    dbo.ВремяСтрокой(Жур.Date_Time_IDDoc) Время,

    ДокП.Фирма as ПризнакНакладной,
    Жур.DocNo as НомерДок,
    ДокП.Контрагент as Клиент,
    CAST(ДокП.Комментарий as VarChar(100)) as Основание,
    ДокП.Договор as Закреплен
from
    ЖурналДокументов Жур
    LEFT JOIN докЗаявка as ДокП ON ДокП.идДок9 = Жур.идДок9

where
    Жур.IDDocDef = 15124
    AND (Жур.Date_Time_IDDoc BETWEEN '20130901' AND '20140111Z')
    AND ДокП.Фирма = '     2   '

    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
          докТЧЗаявка as ДокПСтр
          INNER JOIN спрНоменклатура as СпрТов  ON
            СпрТов.ид13 = ДокПСтр.Товар
            AND СпрТов.ТипКонструкции IN ('   V7O   ')

        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        )

    and Жур.Date_Time_IDDoc > '20130912'
order by
    Жур.Date_Time_IDDoc


-----------------------------------------
Заметь, вместо ДокП.IDDoc везде надо использовать Жур.IDDoc
и ключ порядка обязательно по Жур.Date_Time_IDDoc - это кардинально меняет план запроса.
50 ADirks
 
13.01.14
13:57
И ещё, может быть в данном случае стоит задуматься о некоей избыточности данных, в целях ускорения.
Т.е. завести например справочник с полями Документ, СкладТ. Заполнять этот справочник при записи документа. А ещё лучше SQL-табличку с такими же колонками, но с кластерным индексом (СкладТ, Документ)
51 monsterZE
 
13.01.14
14:40
пасиб! попробую и этот вариант.
я делал для расходников отдельный справочник
из него отбирает моментально (но там немного больший функционал)
если приспичит со скоростью и здесь - буду думать над (50)
52 trad
 
13.01.14
14:52
(48)далее мне сложно что-либо советовать. Нужно изучать планы выполнения.
53 Принт
 
13.01.14
14:52
(0) ТП, простите, что?
54 trad
 
13.01.14
14:59
(53) см (2), (4)
55 trad
 
13.01.14
15:00
(53) ТП - табличное поле в семерке
56 monsterZE
 
13.01.14
15:19
Всем спасибо за участие =) третий вариант работает примено также как второй с екзистс - вот так получается быстрее, но вобщем на уровне с дистинки и вторым запросом

select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
dbo.formatTime(SUBSTRING(Жур.Date_Time_IDDoc,9,6),'':'') as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
    AND (ДокП.sp216 = ''     2   '')
where Жур.IDDocDef = 214
AND (Жур.Date_Time_IDDoc BETWEEN ''20131201'' AND ''20131213Z'')
    AND Жур.IDDoc IN
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
order by Жур.Date_Time_IDDoc
57 Ёпрст
 
13.01.14
15:23
забавное условие на iddoc
58 Ёпрст
 
13.01.14
15:24
+ в подзапросе условие на него же еще и коррелированное
59 monsterZE
 
13.01.14
15:26
гы.. поставил в этот вариант два месяца - все также быстро
поставил два месяца в запрос с дистинкт и 1с умерла =)
60 monsterZE
 
13.01.14
15:27
(57)что за условие? чет не вижу =)
61 Ёпрст
 
13.01.14
15:36
(60)

AND Жур.IDDoc IN (select iddoc ... where IDDoc = Жур.IDDoc)
62 monsterZE
 
13.01.14
15:42
(61) хм, ну да.. =)
меняю его на екзистс и с двух месячным периодом получаю так-же вылет 1сы
63 Ёпрст
 
13.01.14
15:44
а так ?

AND exists (select * from ... where IDDoc = Жур.IDDoc)
64 monsterZE
 
13.01.14
15:53
(63) в смысле так - ? вылет

            |    AND exists (
            |        select *
            |        from
            |            $ДокументСтроки.ПриходнаяНал as ДокПСтр (NOLOCK)
            |          INNER JOIN
            |            $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокПСтр.Товар
            |            AND $СпрТов.СкладТ IN (:СписСкладов)
            |        where
            |            IDDoc = Жур.IDDoc)
65 Ёпрст
 
13.01.14
15:56
так:

|    AND exists (
            |        select *
            |        from
            |            $ДокументСтроки.ПриходнаяНал as ДокПСтр (NOLOCK)
            |          INNER JOIN
            |            $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокПСтр.Товар
            |            AND $СпрТов.СкладТ IN (:СписСкладов)
            |        where
            |            ДокПСтр.IDDoc = Жур.IDDoc)
66 monsterZE
 
13.01.14
16:02
вобщем вот подзапрос
        ПодзапросОтбораПоСкладам = "
        |    AND EXISTS
        //|    AND Жур.IDDoc IN
        |        (
        |        SELECT
        |            ДокПСтр.IDDoc
        |        FROM
        |            $ДокументСтроки.ПриходнаяНал as ДокПСтр (NOLOCK)
        |          INNER JOIN
        |            $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокПСтр.Товар
        |            AND $СпрТов.СкладТ IN (:СписСкладов)
        |        WHERE
        |            ДокПСтр.IDDoc = Жур.IDDoc
        |        )
        |";
67 monsterZE
 
13.01.14
16:03
смотрю с дебаг(1)
с ексзистс:
если пролетает аск деск - то работает
но медленно
если аск деск не видно - как будто на одном месте крутится
68 Ёпрст
 
13.01.14
16:04
(67) а как в (65) что ?
69 monsterZE
 
13.01.14
16:08
(65) циклится и вылетает
70 Ёпрст
 
13.01.14
16:21
не верится, что (66) работает, а (65) нет.
71 monsterZE
 
13.01.14
16:22
(70) нет - (66) тоже не работает =)
если относительно большой период ставишь - тоже самое
72 monsterZE
 
13.01.14
16:23
если условие с IN - пролетают два запроса и ТП обновляется
если условие с EXISTS - лезет бесконечный цикл из запросов и 1с валится
73 Ёпрст
 
13.01.14
16:26
а че за реквизит СкладТ ? Накой он в товарах.. ?
74 monsterZE
 
13.01.14
16:29
(73) это физический склад товара
75 Ёпрст
 
13.01.14
16:32
(74) это как ?
:)
76 monsterZE
 
13.01.14
16:34
(75) вот так =) оптовая база
5 сторон по несколько складов на каждой
А1, А2, Б3, Г1,...
77 Ёпрст
 
13.01.14
16:37
Дык чего за товар такой, что он всегда на одном складе ?
78 Ёпрст
 
13.01.14
16:37
конкретном ?
79 monsterZE
 
13.01.14
16:39
позиции товары закреплены за определенными складами (конкретными) электрика, сантехника, стройка, посуда, пластмасса, швейка, ...
80 trad
 
13.01.14
17:15
(72)
1.покажи отладочный запрос с exists
2.не могу вкурить запрос (56) из-за лишней скобки в конце
81 ADirks
 
13.01.14
17:31
А кстати, настройка 'max degree of parallelism' какое значение имеет? А то бывает, что распараллеливание даёт такие эффекты :)

exec sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
exec sp_configure 'max degree of parallelism'
82 Ёпрст
 
13.01.14
17:32
(81) дык, наверняка 1..
83 ADirks
 
13.01.14
17:33
(82) почему наверняка?  по умолчанию то 0.
84 Ёпрст
 
13.01.14
17:38
(83) та обычно все первым делом паралелизм отключають ;)
85 Ёпрст
 
13.01.14
17:39
мне вот непонятно, чего с экзистом не работает, а с ин работает..
86 ADirks
 
13.01.14
17:41
(84) не все такие хитрые :)

(85) это да, я пробовал и так и так - результат вообще идентичный
87 monsterZE
 
13.01.14
17:43
нормальный запрос из 56
        ТекстЗапроса = "    
        |SELECT
        |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
        |    ,Жур.DocNo as НомерДок
        |    ,Жур.Date_Time_IDDoc as ПозДок
        |    ,(Жур.Closed & 1 - Жур.ISMARK) as Статус
        |    ,dbo.formatTime(SUBSTRING(Жур.Date_Time_IDDoc,9,6),':') as ВремяДок
        |   ,Жур.IDDoc as [Док $Документ.ПриходнаяНал]
        |   ,$ДокП.ПризнакНакладной as [ПризнакНакладной $Перечисление.ПризнПрихНакл]
        |    ,$ДокП.Клиент as [Клиент $Справочник.Клиенты]
        |    ,CAST(ДокП.$ОбщийРеквизит.Основание as VarChar(100)) as Основание
        |    ,$ДокП.ЗакрепленЗа as [Закреплен $Справочник.ЗакрепДокЗа]
        |    ,0 as Маркер
        |FROM
        |    _1SJourn as Жур (NOLOCK)
        |LEFT JOIN
        |    $Документ.ПриходнаяНал as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
        |    AND ($ДокП.Склад = :ОснСклад)
        |";
        
        // указан клиент
        Если ВыбКлиент.Выбран()=1 Тогда              
            ТекстЗапроса = ТекстЗапроса + " AND ($ДокП.Клиент = :ВыбКлиент)";  
            Источник.УстановитьТекстовыйПараметр("ВыбКлиент", ВыбКлиент);  
        КонецЕсли;
        
        ТекстЗапроса = ТекстЗапроса + "        
        |WHERE
        |    Жур.IDDocDef = $ВидДокумента.ПриходнаяНал
        //|    AND Жур.Closed & 1 = 1
        |";
        
        Источник.УстановитьТекстовыйПараметр("ОснСклад", Константа.ОснСклад);  
        
        // указан период
        Если (НачДата<>"") и (КонДата<>"") Тогда
            ТекстЗапроса = ТекстЗапроса + " AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)";  
            Источник.УстановитьТекстовыйПараметр("НачДата", НачДата);  
            Источник.УстановитьТекстовыйПараметр("КонДата", КонДата);  
        КонецЕсли;    
        
        ПодзапросОтбораПоСкладам = "
        //|    AND EXISTS
        |    AND Жур.IDDoc IN
        |        (
        |        SELECT
        |            ДокПСтр.IDDoc
        |        FROM
        |            $ДокументСтроки.ПриходнаяНал as ДокПСтр (NOLOCK)
        |          INNER JOIN
        |            $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокПСтр.Товар
        |            AND $СпрТов.СкладТ IN (:СписСкладов)
        |        WHERE
        |            ДокПСтр.IDDoc = Жур.IDDoc
        |        )
        |";
                                          
        // указан склад            
        //Если РазмерСпискаСклад>0 Тогда      
        //    ТекстЗапроса    = ТекстЗапроса + "AND $СпрТов.СкладТ IN (:СписСкладов)";  
        //    Запрос.УстановитьТекстовыйПараметр("СписСкладов", СписВыбСкладСтр);  
        //КонецЕсли;

        // указан склад
        РазмерСпискаСклад = СписВыбСклад.РазмерСписка();
        Если СписВыбСклад.РазмерСписка()>0 Тогда    
            ТекстЗапроса    = ТекстЗапроса + ПодзапросОтбораПоСкладам;  
            СписВыбСкладСтр = "";
            
            Для ъ=1 По РазмерСпискаСклад Цикл
                СписВыбСкладСтр = СписВыбСкладСтр+МД.ЗначениеВСтрокуБД(СписВыбСклад.ПолучитьЗначение(ъ))+?(ъ<РазмерСпискаСклад,"','","");
            КонецЦикла;
            
            Источник.УстановитьТекстовыйПараметр("СписСкладов", СписВыбСкладСтр);  
        КонецЕсли;
        
        Источник.УстТекстЗапроса(ТекстЗапроса);
        
        Источник.УстИДПоле("Док");
        //Источник.УстКлючПорядка("Док");
        Источник.УстКлючПорядка("ПозДок");
88 monsterZE
 
13.01.14
17:43
параллелилизм = 0
89 ADirks
 
13.01.14
17:44
(88) попробуй в 1 выставить

exec sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
sp_configure 'max degree of parallelism', 1
RECONFIGURE WITH OVERRIDE
exec sp_configure 'max degree of parallelism'
90 monsterZE
 
13.01.14
17:57
(89) ок, но уже завтра
я в студии мышковозюканьем выставляю =)
91 monsterZE
 
14.01.14
10:10
итак, параллелилизм тут не при чем. =)
92 monsterZE
 
14.01.14
10:12
можно видео на тф записать.. мож по нему чего понятнее будет?
93 trad
 
14.01.14
10:19
Покажи все таки отладочный запрос с exists.
Интересно почему из-за него циклится.
Точнее понятно, что циклится из-за неуникальности КП, но почему возникает эта неуникальность непонятно.
94 monsterZE
 
14.01.14
10:21
(93) я могу тока его, если на тф записать =)
ибо он циклится и 1с падает.
в тяжелых запросах в студии его нет
95 trad
 
14.01.14
10:55
а не в тяжелых? фильтры же другие есть
96 monsterZE
 
14.01.14
11:10
(95) чет ковырял трассировки в профайлере - не ловит ничего =(
97 monsterZE
 
14.01.14
11:13
..нашел себя по пиду =) не туда номер подставлял
98 monsterZE
 
14.01.14
11:14
от периода похоже не зависит..
сразу ставлю два месяца - норм
три месяца - норм
пару дней - каюк =)
99 monsterZE
 
14.01.14
11:16
последние запросы из профайлера от не последних ничем не отличаются
select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
dbo.formatTime(SUBSTRING(Жур.Date_Time_IDDoc,9,6),':') as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
    AND (ДокП.sp216 = '     2   ')
where Жур.IDDocDef = 214
AND (Жур.Date_Time_IDDoc BETWEEN '20131201' AND '20140114Z')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN ('     5   ')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        )
order by Жур.Date_Time_IDDoc desc
100 monsterZE
 
14.01.14
11:20
на маленьких периодах не заметно.. можно долго перебирать
а на больших - как будто буфер какой-то переполняется =\
101 monsterZE
 
14.01.14
11:44
в профайлере не все смотрю - пакеты не включил
ща еще раз
102 monsterZE
 
14.01.14
12:21
вобщем вот это последние повторяющиеся запросы:
exec sp_executesql N'
select
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
    AND (ДокП.sp216 = ''     2   '')
where (Жур.Date_Time_IDDoc = @OKParam_0) and (Жур.IDDocDef = 214
AND (Жур.Date_Time_IDDoc BETWEEN ''20131001'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
',N'@OKParam_0 char(23)','2013122679VQ5C  Y3DY   '
----
exec sp_executesql N'
select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
    AND (ДокП.sp216 = ''     2   '')
where (Жур.Date_Time_IDDoc > @OKParam_0) and (Жур.IDDocDef = 214
AND (Жур.Date_Time_IDDoc BETWEEN ''20131001'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
order by Жур.Date_Time_IDDoc
',N'@OKParam_0 char(23)','2013122679VQ5C  Y3DY   '
103 trad
 
14.01.14
12:51
LEFT JOIN dh214 замени на INNER JOIN dh214
либо условие
AND (ДокП.sp216 = ''     2   '')
перенеси в where
104 trad
 
14.01.14
12:52
иначе Жур.IDDoc as Док, может быт null
105 monsterZE
 
14.01.14
13:01
(104) - ага, уже сделал.
а то лезли доки с не основного склада
106 Ёпрст
 
14.01.14
14:46
откуда там )) в конце ?
107 monsterZE
 
14.01.14
15:13
(106) - хороший вопрос
108 monsterZE
 
14.01.14
15:17
вот тут она должна быть

where (Жур.IDDocDef = 214
AND (Жур.Date_Time_IDDoc BETWEEN ''20140114'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        )) and (Жур.IDDoc = @IDFieldParam)
order by Жур.Date_Time_IDDoc
109 monsterZE
 
14.01.14
15:23
чета как-то странно оно условия выстраивает
110 monsterZE
 
14.01.14
15:30
оно собирает все мои условия в скобки.. видимо иногда что-то идет не так =)
111 monsterZE
 
14.01.14
15:35
да нет.. может глюк какой, сейчас немного условия переделал - с екзист все равно валится

exec sp_executesql N'
select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where (Жур.Date_Time_IDDoc > @OKParam_0) and ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
order by Жур.Date_Time_IDDoc
',N'@OKParam_0 char(23)','201312269Q1DOW  Y438   '
112 monsterZE
 
14.01.14
15:36
в 102 все правильно
вот открывающая скобка
where (Жур.Date_Time_IDDoc = @OKParam_0) and (Жур.IDDocDef = 214
113 trad
 
14.01.14
15:45
(106)
(Жур.IDDocDef = 214
...
AND EXISTS
        (
...
        ))
114 monsterZE
 
14.01.14
15:56
в профайлере

exec sp_executesql N'
select top 1
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        )) and (Жур.IDDoc = @IDFieldParam)
order by Жур.Date_Time_IDDoc
',N'@IDFieldParam char(9)','  YJBL   '
-
exec sp_executesql N'
select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where (Жур.Date_Time_IDDoc > @OKParam_0) and ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
order by Жур.Date_Time_IDDoc
',N'@OKParam_0 char(23)','201401147ZKD6O  YJBL   '
-
exec sp_executesql N'
select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where (Жур.Date_Time_IDDoc < @OKParam_0) and ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
order by Жур.Date_Time_IDDoc desc
',N'@OKParam_0 char(23)','201401148IFT28  YJHG   '
-
exec sp_executesql N'
select
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where (Жур.Date_Time_IDDoc = @OKParam_0) and ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
',N'@OKParam_0 char(23)','201312269Q1DOW  Y438   '
-
exec sp_executesql N'
select top 20
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where (Жур.Date_Time_IDDoc > @OKParam_0) and ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
order by Жур.Date_Time_IDDoc
',N'@OKParam_0 char(23)','201312269Q1DOW  Y438   '
-
exec sp_executesql N'
select
Жур.Date_Time_IDDoc as ПозДок,
Жур.IDDoc as Док,
0 as Маркер,
(Жур.Closed & 1 - Жур.ISMARK) as Статус,
left(Жур.Date_Time_IDDoc, 8) as ДатаДок,
0 as ВремяДок,
ДокП.sp226 as ПризнакНакладной,
Жур.DocNo as НомерДок,
ДокП.sp217 as Клиент,
CAST(ДокП.sp1008 as VarChar(100)) as Основание,
ДокП.sp1447 as Закреплен
from _1SJourn as Жур (NOLOCK)
LEFT JOIN
    dh214 as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
where (Жур.Date_Time_IDDoc = @OKParam_0) and ((Жур.IDDocDef = 214)
    AND (ДокП.sp216 = ''     2   '')
AND (Жур.Date_Time_IDDoc BETWEEN ''20131101'' AND ''20140114Z'')
    AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        ))
',N'@OKParam_0 char(23)','201312269Q1DOW  Y438   '

и погнал
115 trad
 
14.01.14
16:11
заколдованное какое-то ТП

проверь это

select date_time_iddoc, count(*)
from _1sjourn (nolock)
group by date_time_iddoc
having count(*) > 1

select iddoc, count(*)
from dh214 (nolock)
group by iddoc
having count(*) > 1

чем черт не шутит
116 trad
 
14.01.14
16:12
и еще, версия 1c++ не сильно древняя?
117 monsterZE
 
14.01.14
16:15
кста, это проявляется только, если запрос используется в ТП
т.е., если отдельно запускать - с екзист работает беспроблем
118 monsterZE
 
14.01.14
16:16
(116) 3.2.3.1
119 Ёпрст
 
14.01.14
16:16
(118) вот на этой пробуй
http://www.1cpp.ru/forumfiles/Attachments/icpp-3-2-4-1.rar
120 Ёпрст
 
14.01.14
16:17
там ТП точно правили
121 monsterZE
 
14.01.14
16:24
(119) ок, попробую эту версию.. но ток в конце раб-дня
122 monsterZE
 
15.01.14
10:09
проверил на новой версии - все ок!
и работает быстрее.. заметно на глаз =)
123 monsterZE
 
15.01.14
10:10
сегодня обновлю на рабочей базе, посмотрю как будут себя вести остальные отчеты
124 monsterZE
 
15.01.14
10:13
мля, поторопился - без отбора по складу проверял %-)
125 trad
 
15.01.14
10:17
(124) т.е. проблема проявляется при наличии условия AND (ДокП.sp216 = ''     2   '') ?
126 monsterZE
 
15.01.14
10:25
(125) не не не
sp216 - это просто основной склад товара
с которого ведется торговля
проявляется, когда к основному запросу добавляется подзапрос
причем с использованием екзистс
127 monsterZE
 
15.01.14
10:25
проверил с новой версией - тоже самое
128 monsterZE
 
15.01.14
10:26
когда добавляется вот этот кусочек

AND EXISTS
        (
        SELECT
            ДокПСтр.IDDoc
        FROM
            dt214 as ДокПСтр (NOLOCK)
          INNER JOIN
            sc33 as СпрТов (NOLOCK) ON СпрТов.ID = ДокПСтр.sp227
            AND СпрТов.sp1181 IN (''     5   '')
        WHERE
            ДокПСтр.IDDoc = Жур.IDDoc
        )
129 monsterZE
 
15.01.14
10:31
(125) схема такая - торгуют с одного склада, на котором лежат остатки в 1с
но физически товар лежит на разных удаленных складах
документы выписываются без деления по складам,
а складских работников интересует именно ихний товар
130 trad
 
15.01.14
11:10
повторил в точности твой запрос, поменяв идентификаторы метаданных на свои - все отлично крутится.
можешь проверить http://rghost.ru/51663691
131 monsterZE
 
15.01.14
12:02
(130) я ща заюзаю по твоему примеру, но! ты пропустил - у меня тоже запрос выполняется. н-ное количество раз и при очередном обновлении - циклится. т.е. 3 запроса проходят нормально, на 4м завал.
132 monsterZE
 
15.01.14
13:03
..ну что, после часовых поползновений:
екзистс - работает существенно медленние
это как-то связано со столбиком картинок (иконки статуса)
133 monsterZE
 
15.01.14
13:14
вот мое ПриВыводеСтроки:

Процедура ТППриВыводеСтроки(ТП, ОформлениеСтроки, ДанныеСтроки, ТипРегиона)
                      
    Если ТипРегиона = 3 Тогда
        ОбъектЯчейка = ОформлениеСтроки.Ячейки.Получить("Статус");
        ТекДанные    = ДанныеСтроки.Получить("Статус");    
        Если ТекДанные = -1 Тогда
            ТекДанные  = 2;
        КонецЕсли;    
        ОбъектЯчейка.ОтображатьТекст    = 0 ;
        ОбъектЯчейка.ОтображатьКартинку = 1 ;
        ОбъектЯчейка.ИндексКартинки     = ТекДанные;
    КонецЕсли;
    
КонецПроцедуры
134 monsterZE
 
15.01.14
13:31
валится, даже если вот так только оставляю:

    Если ТипРегиона = 3 Тогда
        ОбъектЯчейка = ОформлениеСтроки.Ячейки.Получить("Статус");
    КонецЕсли;
135 monsterZE
 
15.01.14
13:33
даже если просто проверку на тип региона оставить.. пустую
136 monsterZE
 
15.01.14
21:58
trad, попробуй из интереса добавить
и погонять на больших периодах 1-2-3 мес

Процедура ТППриВыводеСтроки(ТП, ОформлениеСтроки, ДанныеСтроки, ТипРегиона)
а=1;
КонецПроцедуры
137 trad
 
16.01.14
09:00
попробовал - все ОК
138 trad
 
16.01.14
09:02
для некоторого ускорения можно еще такую конструкцию добавить
... as СпрТов (NOLOCK index=idd) ON ...
и обязательно отключить параллелелизм
139 monsterZE
 
18.01.14
10:21
(138) ап, для размышления =)
добавляю index=idd
и начинает также падать с Жур.IDDoc IN
140 monsterZE
 
18.01.14
10:26
мож у меня чего не так с индексами?
каждую ночь делается:
-проверка целостности
-реорганизация индекса
-обновление статистики
средствами скл.
141 monsterZE
 
18.01.14
10:32
к (139) но как-то реже что-ли падает.. как-то нет четкой взаимосвязи =(
142 monsterZE
 
18.01.14
10:48
я хз короче.. =) екзистс с индекс идд
падает реже. работает быстрее.
обновил 1с++
отключил параллелизм
заметил что как-то кэширование что-ли "заработало" =)
делаешь одинаковые запросы - повторные выполняются почти моментально.