Имя: Пароль:
1C
1C 7.7
v7: Запросец долговато выполняется
,
0 monsterZE
 
09.07.13
16:32
любопытно почему.. около 10с период день

   ТекстЗапроса = "
   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   |WHERE
   |     $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |    AND Док.IDDoc NOT IN (
   |        SELECT
   |            left(right(ДокРод.ParentVal,17),9)
   |        FROM
   |            $Документ.Счет_фактура as ДокСчф (NOLOCK)
   |        INNER JOIN
   |            _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокСчф.IDDoc
   |            AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |            AND Жур.Closed & 1 = 1
   |        INNER JOIN
   |            _1SCRDOC ДокРод (NOLOCK) ON ДокРод.ChildID = ДокСчф.IDDoc
   |            AND ДокРод.MDID = 0
   |            AND ДокРод.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |ORDER BY Жур.Date_Time_IDDoc";
1 monsterZE
 
09.07.13
16:32
цель: найти расходники на которые не сделаны счета-фактур
2 monsterZE
 
09.07.13
16:36
основной жор (по плану запроса) при поиске в срц_док
3 monsterZE
 
09.07.13
16:39
спасибо, нашел что тормозит =)
4 monsterZE
 
09.07.13
16:46
(3) нашел, что тормозит.. не нашел как победить =)
убираю "обрезание" парент_вал и запрос выполняется намного быстрее..
5 Ёпрст
 
09.07.13
16:50
(9) не верный запрос, счет фактура может не попасть в выбранный диапазон.
6 monsterZE
 
09.07.13
16:52
(5) ну тут "с некотороми оговорками" все норм, основная проблема в скорости выполнения =)
7 monsterZE
 
09.07.13
16:55
чем заменить left right substring, чтобы было быстро?
8 Mikeware
 
09.07.13
16:56
дурной запрос какой-то
9 monsterZE
 
09.07.13
16:59
(8) предложения? =)
выбираю расходники за день, выбираю документы основания счф
искомые, которых нет в табличке родителей счф
10 monsterZE
 
09.07.13
16:59
думаю выгрузка отдельно табличек и сравнение в 1се будет быстрее =)
11 Serginio1
 
09.07.13
17:00
Хуже не будет если в соединении с _1SJourn прописать соединени по виду документа

_1SJourn as Жур (NOLOCK) ON (Жур.IDDocDef=$ВидДокумента.РасходнаяНал)

Хуже не будет, а лучше будет если проход будет сначала по журналу
12 Salimbek
 
09.07.13
17:02
(8) Так то может быть, но если тупо ускорить то:
1. Можно подзапрос вынести отдельно и укладывать во временную таблицу, потом на нем построить индекс и уже затем NOT IN (SELECT iddoc FROM #tmp_Table)
2. Можно попробовать наоборот не отрезать Лево, Право, а достроить Док.IDDoc до нужного значения, префикс будет одним и тем же. (хотя вряд ли даст значительный эффект)
13 monsterZE
 
09.07.13
17:05
(12) интересно по поводу достроить =) а что там после документа у парент_вал? 8 симв
в том смысле, то там у меня пустота.. пока.. но может ли там что-то появиться?
14 Mikeware
 
09.07.13
17:08
(9) ну и выбери все в одну таблицу, и фильтруй по пустой сче-фактуре
а достраивать - "O1"+iddocdef36+iddoc - будет тебе 23
15 Serginio1
 
09.07.13
17:13
Или с условием на
ДокРод.ParentVal='O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
16 monsterZE
 
09.07.13
17:14
(14) благадорюс =) с достройкой с ванчика выполняется
потом с в одной табличке попробую
17 monsterZE
 
09.07.13
17:15
(15) вот так написал
|    AND 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc+'        ' NOT IN (
18 Serginio1
 
09.07.13
17:26
Я недавно боролся с подчиненными и понял, что такая запись

ТекстЗапроса="SELECT
   |Жур.IDDoc IDDoc,
   |Жур.IDDocDef ID10,
   |Жур.Closed & 1 Проведен,
   |Жур.ISMARK ПометкаУдаления
   |FROM
   |_1SCRDOC Отбор
   |INNER JOIN
   |_1Sjourn Жур ON   Отбор.ChildID = Жур.IDDoc
   |Where (Отбор.ParentVal = :ВыбДок)
   |And   (Отбор. MDID = 0)";

самая быстрая. Оптимизатор может не правильно план делать
19 monsterZE
 
09.07.13
17:30
(18) спасибо, возьму на вооружение =)
20 Serginio1
 
09.07.13
17:35
А может запрос составить так, что бы не было подчиненных Документ.Счет_фактура
тоесть
not exist (
SELECT *
   |FROM
   |_1SCRDOC Отбор
   |INNER JOIN
   |_1Sjourn Жур ON   Отбор.ChildID = Жур.IDDoc
   |Where (Отбор.ParentVal='O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc)
   |And   (Отбор. MDID = 0)
   |and   (Жур.IDDocDef=$ВидДокумента.Счет_фактура) ";

)
21 monsterZE
 
09.07.13
17:50
(20) сегодня уже не успеваю.. завтра буду его (запрос) причесывать =)
22 monsterZE
 
10.07.13
14:06
переписал вот в такую штуку =)

   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |     ,Отбор.ChildID as [Счф $Документ.Счет_фактура]
   |FROM
   |     _1SJourn as Жур (NOLOCK)
   |INNER JOIN
   |     $Документ.РасходнаяНал as Док (NOLOCK) ON Док.IDDoc = Жур.IDDoc
   |     AND $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |LEFT JOIN
   |     _1SCRDOC as Отбор ON Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
   |     AND Отбор.MDID = 0
   |WHERE
   |    Жур.IDDocDef = $ВидДокумента.РасходнаяНал
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   //|    AND Отбор.ChildID IS NULL

но чет не допру как Отбор.ChildID еще по виду документа отфильтровать? =)
23 monsterZE
 
10.07.13
14:11
|    Жур.IDDocDef = $ВидДокумента.РасходнаяНал
это вроде получается не обязательно, бо и так джойню с расходниками..
24 VladZ
 
10.07.13
14:15
(23) Так-то оно так... Зато есть шанс попасть в индекс...
25 monsterZE
 
10.07.13
14:23
заджойнил еще раз общий журнал.. теперь выпадают пустые значения =)

   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |     ,Отбор.ChildID as [Счф $Документ.Счет_фактура]
   |FROM
   |     _1SJourn as Жур (NOLOCK)
   |INNER JOIN
   |     $Документ.РасходнаяНал as Док (NOLOCK) ON Док.IDDoc = Жур.IDDoc
   |     AND $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |LEFT JOIN
   |     _1SCRDOC as Отбор ON Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
   |     AND Отбор.MDID = 0
   |INNER JOIN
   |    _1SJourn as ЖурТмп (NOLOCK) ON ЖурТмп.IDDoc = Отбор.ChildID  
   |     AND ЖурТмп.IDDocDef = $ВидДокумента.Счет_фактура
   |WHERE
   |    Жур.IDDocDef = $ВидДокумента.РасходнаяНал
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
26 dk
 
10.07.13
14:32
аккуратнее надо с джойнами
лучше фильтр в джойне, чем после джойна
27 monsterZE
 
10.07.13
14:34
вот это, то, что надо, тока как еще пустые значения вернуть? =)

   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |     ,Отбор.ChildID as [Счф $Документ.Счет_фактура]
   |FROM
   |     _1SJourn as Жур (NOLOCK)
   |INNER JOIN
   |     $Документ.РасходнаяНал as Док (NOLOCK) ON Док.IDDoc = Жур.IDDoc
   |     AND $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |LEFT JOIN
   |     _1SCRDOC as Отбор ON Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
   |     AND Отбор.MDID = 0
   |INNER JOIN
   |    _1SJourn as ЖурТмп (NOLOCK) ON ЖурТмп.IDDoc = Отбор.ChildID  
   |     AND ЖурТмп.IDDocDef <> $ВидДокумента.Счет_фактура
   |WHERE
   |    Жур.IDDocDef = $ВидДокумента.РасходнаяНал
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
28 monsterZE
 
10.07.13
14:35
(26) а как тогда? надо из срц_док выбрать все по нашим родителям, причем чилд_ид нужно пустое, либо вид_документа НЕ счет_фактура
29 dk
 
10.07.13
14:38
например

   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |     ,Отбор.ChildID as [Счф $Документ.Счет_фактура]
   |FROM
   |    (SELECT
   |         Жур.IDDoc
   |         ,Жур.Date_Time_IDDoc
   |     FROM
   |         _1SJourn as Жур (NOLOCK)
   |     WHERE
   |         Жур.IDDocDef = $ВидДокумента.РасходнаяНал
   |         AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |         AND Жур.Closed & 1 = 1)as Жур
   |INNER JOIN
   |     $Документ.РасходнаяНал as Док (NOLOCK) ON Док.IDDoc = Жур.IDDoc
   |     AND $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |LEFT JOIN
   |     _1SCRDOC as Отбор ON Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
   |     AND Отбор.MDID = 0
   |INNER JOIN
   |    _1SJourn as ЖурТмп (NOLOCK) ON ЖурТмп.IDDoc = Отбор.ChildID  
   |     AND ЖурТмп.IDDocDef = $ВидДокумента.Счет_фактура



должно быстрее чем (25) отрабатывать
30 viktor_vv
 
10.07.13
14:44
(29) Мне кажется в данном случае по барабану, отработает одинаково.
31 viktor_vv
 
10.07.13
14:44
(30)+ по скорости.
32 monsterZE
 
10.07.13
14:50
(30) на глаз разницу не заметно.. =)
последний иннер - коцает из таблички пустые значения, когда док.осн вобще еще нет.. вот это пока проблема №1 =)
33 Serginio1
 
10.07.13
14:51
По (0) Запросу я бы сделал так
ТекстЗапроса = "
   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   |WHERE
   |     $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |    AND Док.IDDoc NOT existst (
   |        SELECT *
   |             FROM   _1SCRDOC Отбор (NOLOCK)
   |INNER JOIN
   |             _1SJourn as Жур (NOLOCK)  Отбор.ChildID = Жур.IDDoc
   |             AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |             AND Жур.Closed & 1 = 1
   |         Where  (Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc)
   |         AND (Отбор.MDID = 0)
   |         And (Жур.IDDocDef=$ВидДокумента.Счет_фактура)
   |          )
   |ORDER BY Жур.Date_Time_IDDoc";


По (27) сделай объединение к подзапросу
либо
left  JOIN
   |    _1SJourn as ЖурТмп (NOLOCK) ON ЖурТмп.IDDoc = Отбор.ChildID
34 trad
 
10.07.13
14:56
я знаю как правильно написать, но придет Ёпрст и скажет что каскадные джойны @вно
:)
35 viktor_vv
 
10.07.13
14:57
(27) Тут действительно "<>" ?

   |    _1SJourn as ЖурТмп (NOLOCK) ON ЖурТмп.IDDoc = Отбор.ChildID  
   |     AND ЖурТмп.IDDocDef <> $ВидДокумента.Счет_фактура

тогда в selecte ты никак не увидишь

  |     ,Отбор.ChildID as [Счф $Документ.Счет_фактура]

как счет-фактуру.
36 viktor_vv
 
10.07.13
15:02
|     ,ISNULL(Отбор.ChildID,$ПустойИД) as [Счф $Документ.Счет_фактура]


   |LEFT JOIN
   |     _1SCRDOC as Отбор ON Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
   |     AND Отбор.MDID = 0
   |Left JOIN
   |    _1SJourn as ЖурТмп (NOLOCK) ON ЖурТмп.IDDoc = Отбор.ChildID  
   |     AND ЖурТмп.IDDocDef = $ВидДокумента.Счет_фактура

   |Left JOIN
   |    _1SJourn as ЖурТмп2 (NOLOCK) ON ЖурТмп2.IDDoc = Отбор.ChildID  
   |     AND ЖурТмп2.IDDocDef <> $ВидДокумента.Счет_фактура

  |WHERE
   |    Жур.IDDocDef = $ВидДокумента.РасходнаяНал
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
|   and ЖурТмп2.IDDOC is NULL

Только тормозить может :).
37 monsterZE
 
10.07.13
15:03
(35) ну это в процессе разработки, чтобы видеть чего там =)
так то нужно отобрать Расходники у которых нет документов основания, либо это не счета фактуры
38 viktor_vv
 
10.07.13
15:04
(37) Ну тогда надо наоборот условия связи в (36) поставить.
39 dk
 
10.07.13
15:05
проверил (29)
действительно выигрыша нет
40 viktor_vv
 
10.07.13
15:07
(39) Ну таки SQL декларативный язык.
41 trad
 
10.07.13
15:11
в (34) каскадные - читать вложенные
42 monsterZE
 
10.07.13
15:12
ща поковыряюсь с вариантом от Serginio1
потом дальше буду посмотреть =)
43 Ёпрст
 
10.07.13
15:13
(34) с тобой на бентли не заработаешь! ©Я
44 Ёпрст
 
10.07.13
15:14
:)
45 monsterZE
 
10.07.13
15:22
вот так фунциклирует.. =)
   |SELECT
   |      left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |     ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   |WHERE
   |     $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |     AND NOT EXISTS (SELECT *
   |                        FROM _1SCRDOC as Отбор (NOLOCK)
   |                      INNER JOIN
   |                            _1SJourn as Жур (NOLOCK) ON Отбор.ChildID = Жур.IDDoc
   |                            AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |                            AND Жур.Closed & 1 = 1
   |                    WHERE (Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc)
   |                            AND (Отбор.MDID = 0)
   |                            AND (Жур.IDDocDef=$ВидДокумента.Счет_фактура))
   |ORDER BY Жур.Date_Time_IDDoc
46 monsterZE
 
10.07.13
15:24
ну это как я первый раз хотел, когда выбранного_раз нет в выбранного_два =)
47 monsterZE
 
10.07.13
15:24
но быстро =)
48 monsterZE
 
10.07.13
15:26
2 Mikeware: с одной табличкой что-то не получилось =)
49 Serginio1
 
10.07.13
15:30
(46) Можешь вместо Exist сделать левое соединение к этому подзапросу.
50 Ёпрст
 
10.07.13
15:35
(45) в inner join воткни условие на iddocdef
51 monsterZE
 
10.07.13
15:35
Спасибо Serginio1 и коллективному разуму. =)
52 Ёпрст
 
10.07.13
15:35
везде
53 monsterZE
 
10.07.13
15:38
(52) если во второй вставить - неправильно фунциклирует
54 monsterZE
 
10.07.13
15:41
гы гы гы.. но вчерашний вариант уделывает по скорости сегодняшний =))
55 monsterZE
 
10.07.13
15:43
вот этот
   |SELECT
   |     left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |    ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   |WHERE
   |     $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |    AND 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc+'        ' NOT IN (
   |        SELECT
   |            ДокРод.ParentVal
   |        FROM
   |            $Документ.Счет_фактура as ДокСчф (NOLOCK)
   |        INNER JOIN
   |            _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокСчф.IDDoc
   |            AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |            AND Жур.Closed & 1 = 1
   |        INNER JOIN
   |            _1SCRDOC ДокРод (NOLOCK) ON ДокРод.ChildID = ДокСчф.IDDoc
   |            AND ДокРод.MDID = 0
   |            AND ДокРод.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |ORDER BY Жур.Date_Time_IDDoc";
56 Serginio1
 
10.07.13
15:49
(55) Кстати а результаты одинаковые?
Разница в соединении

'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc+'        '
и
'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc
57 monsterZE
 
10.07.13
15:53
(56) ага.. одинаковые.. хотя там еще 8 знаков
58 Serginio1
 
10.07.13
16:01
(57) Сделай одникаковыми в запросах. И большая разница на неоткэшированных запросах?
59 monsterZE
 
10.07.13
16:02
(58) делал - ничего не меняет.. разница на глаза раза в два, а то и поболее
60 monsterZE
 
10.07.13
16:04
пробывал и в "сегодняшний" + '        ' добавлять
и во "вчерашнем" этот "постфикс" убирать
на скорости никак не отражается..
т.е. сегодняшний все равно остается медленнее, вчерашний быстрее
61 Serginio1
 
10.07.13
16:05
А если добавить в 45 условие на дату
AND (Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
62 monsterZE
 
10.07.13
16:10
пока сегодняшний выполняется, успеваю до 5 досчитать
вчерашний на раз =)
(61) непонял, это куда
63 Ёпрст
 
10.07.13
16:11
(53) не используй одинаковые алиясы в тексте запроса.
64 monsterZE
 
10.07.13
16:12
к (62) если во вложенное WHERE - не удалось привязать составной идентификатор
65 monsterZE
 
10.07.13
16:12
(64) это не я =))))))
66 Serginio1
 
10.07.13
16:14
WHERE (Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc)
|AND (Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |                             AND (Отбор.MDID = 0)
   |                             AND (Жур.IDDocDef=$ВидДокумента.Счет_фактура)
67 monsterZE
 
10.07.13
16:18
(63) кстати, алиасы сменил - все равно не правильно
(66) понял, выйгрыша не дало.. или очень не значительный
68 Ёпрст
 
10.07.13
16:19
(67) покажи неправильный запрос
69 monsterZE
 
10.07.13
16:22
|SELECT
   |      left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |     ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   //|     AND Жур.IDDocDef = $ВидДокумента.РасходнаяНал
   |WHERE
   |     $Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
   |     AND NOT EXISTS (SELECT *
   |                        FROM _1SCRDOC as Отбор (NOLOCK)
   |                      INNER JOIN
   |                            _1SJourn as Жур2 (NOLOCK) ON Жур2.IDDoc = Отбор.ChildID
   |                            AND Жур2.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |                            AND Жур2.Closed & 1 = 1
   //|                            AND Жур2.IDDocDef = $ВидДокумента.РасходнаяНал
   |                    WHERE (Отбор.ParentVal = 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc)
   |                            AND (Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |                            AND (Отбор.MDID = 0)
   |                            AND (Жур2.IDDocDef=$ВидДокумента.Счет_фактура))
   |                          
   |ORDER BY Жур.Date_Time_IDDoc
70 Serginio1
 
10.07.13
16:24
SELECT
   |      left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |     ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   |    Left Join  (SELECT Отбор.ParentVal
   |                         FROM _1SCRDOC as Отбор (NOLOCK)
   |                      INNER JOIN
   |                            _1SJourn as Жур (NOLOCK) ON Отбор.ChildID = Жур.IDDoc
   |                             AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |                             AND Жур.Closed & 1 = 1
   |                     WHERE (Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |                             AND (Отбор.MDID = 0)
   |                             AND (Жур.IDDocDef=$ВидДокумента.Счет_фактура)) as Подзапрос
   |    on 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc+'        '=Подзапрос.ParentVal
   |WHERE
   |     ($Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа)
   |    and  (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
   |    and  (Подзапрос.ParentVal is null)
   |ORDER BY Жур.Date_Time_IDDoc
71 monsterZE
 
10.07.13
16:26
(70) так вроде еще чутка подольше..
72 Serginio1
 
10.07.13
16:27
Или что бы алиасы не совпадали

SELECT
   |      left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |     ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |     AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |     AND Жур.Closed & 1 = 1
   |    Left Join  (SELECT Отбор.ParentVal
   |                         FROM _1SCRDOC as Отбор (NOLOCK)
   |                      INNER JOIN
   |                            _1SJourn as Жур1 (NOLOCK) ON Отбор.ChildID = Жур1.IDDoc
   |                             AND Жур1.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |                             AND Жур1.Closed & 1 = 1
   |                     WHERE (Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |                             AND (Отбор.MDID = 0)
   |                             AND (Жур1.IDDocDef=$ВидДокумента.Счет_фактура)) as Подзапрос
   |    on 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc+'        '=Подзапрос.ParentVal
   |WHERE
   |     ($Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа)
   |    and  (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
   |    and  (Подзапрос.ParentVal is null)
   |ORDER BY Жур.Date_Time_IDDoc
73 Serginio1
 
10.07.13
16:29
Надо сравнивать планы запросов.
74 monsterZE
 
10.07.13
16:31
(72) пока лидирует "дурной запрос" =)
я хз как теперь план на него отловить - раньще он в последних ресурсоемких отражался, сейчас (после достройки) его там нет.
75 monsterZE
 
10.07.13
16:37
план медленного сохранил.. могу положить на филес.майл.ру например
76 Serginio1
 
10.07.13
16:45
(74) Почему дурной? Первый был дурным, а этот уже причесанный. Все зависит от плана запроса. Нужно смотреть различие
77 monsterZE
 
10.07.13
16:53
(76) ну Mikeware так его окрестил =)
А как выцепить план на конкретный запрос, который не ресурсоемкий?
78 Serginio1
 
10.07.13
16:57
79 Serginio1
 
10.07.13
16:59
В том же SMS можно план посмотреть
80 Serginio1
 
10.07.13
17:01
81 monsterZE
 
10.07.13
17:02
запустил в профайлере трассировку, нашел этот запрос, а как план теперь из него посмотреть? =)
82 Serginio1
 
10.07.13
17:02
(77) Поставь рс.отладка(1) вставь в SMS и смотри план запроса
83 Serginio1
 
10.07.13
17:03
84 monsterZE
 
10.07.13
17:21
из профайлера план так и не нашел как посмотреть.. поставил период побольше и из студии открыл план.
85 monsterZE
 
10.07.13
17:23
в быстром плане есть слово параллелизм =)
86 Ёпрст
 
10.07.13
17:27
дык во втором запросе надо же не расх накладную, а условие на сч. фактуру
87 monsterZE
 
10.07.13
17:30
(86) поменял.. в скорости выйгрыша не дает.. или почти не заметно
88 Ёпрст
 
10.07.13
17:31
(87) поставь условие на вид дока первым
89 Serginio1
 
10.07.13
17:31
(86) У него условие на подчиненные счет фактуры
с нормальными алиасами
(Жур1.IDDocDef=$ВидДокумента.Счет_фактура
90 Ёпрст
 
10.07.13
17:32
(89) я про "неправильный" запрос грю.. где виддока закомменчен
91 monsterZE
 
10.07.13
17:34
(90) поставил первыми - если что-то изменилось, то незначительно
92 monsterZE
 
10.07.13
17:37
93 Serginio1
 
10.07.13
17:38
Можно попробовать
SELECT
   |      left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата]
   |     ,Док.IDDoc as [Документ $Документ.РасходнаяНал]
   |     ,$Док.Сумма as Сумма
   |     ,$Док.Клиент as [Клиент $Справочник.Клиенты]
   |FROM
   |     $Документ.РасходнаяНал as Док (NOLOCK)
   |INNER JOIN
   |     _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = Док.IDDoc
   |    Left Join  (SELECT Отбор.ParentVal
   |                         FROM _1SCRDOC as Отбор (NOLOCK)
   |                      INNER JOIN
   |                            _1SJourn as Жур1 (NOLOCK) ON Отбор.ChildID = Жур1.IDDoc
   |                            
   |                     WHERE (Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |                             AND (Отбор.MDID = 0)
   |                             AND (Жур1.IDDocDef=$ВидДокумента.Счет_фактура)
   |                             AND (Жур1.Closed & 1 = 1)) as Подзапрос
   |    on 'O1'+$ВидДокумента36.РасходнаяНал+Док.IDDoc+'        '=Подзапрос.ParentVal
   |WHERE    (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |     AND (Жур.Closed & 1 = 1)
   |     and (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
   |     And ($Док.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа)
   |    and  (Подзапрос.ParentVal is null)
   |ORDER BY Жур.Date_Time_IDDoc
94 monsterZE
 
10.07.13
17:41
(93) этот выполняется моментально =)
95 monsterZE
 
10.07.13
17:44
может на долю секунды быстрее, чем "вчерашний", но заметно =)
96 monsterZE
 
10.07.13
17:45
а может и не заметно, бо я через выбратьстроку() его смотрю
а вчерашний через печатную форму =)
но разница с предъидущим вариантом очевидна
97 Serginio1
 
10.07.13
17:48
(95) Ну в нем убрано все лишнее. И тебе будет удобнее когда нужно бедет пришпондрить твой вариант с 25.
98 monsterZE
 
10.07.13
17:52
(97) вобщем доп условия внутри джойнов отжирают значительное время =) спасибо