1С 8.1 Два одинаковых запроса, разный результат. Помогите разобраться. #517947


#0 by Ayne
1С 8.1 15-я версия платформы, конфигурация УТ 10.3. Делаю запрос с участием свойств номенклатуры (на примере упростил). В первоначальном варианте 1С в результате запроса находила свойства товарам непонятным макаром. У каких-то товаров свойства в отчете появлялись, у каких-то нет (будем считать, что абсолютно у всех товаров нужное свойство заполнено). Может бы, я чего-то недопонимаю? Объясните, пожалуйста. Работающий вариант. А теперь неработающий вариант Отличия в запросах - в реализации левого соединения регистра со свойствами.
#1 by shishkin1966
c точки зрения MS SQL, это абсолютно два разных запроса !!! Причем второй запрос может заставить серьезно напрячь сервак, если не будет индекса по полю ЗначенияСвойствОбъектов.Свойство. Во втором случае у тебя пропадает ЛЕВОЕ СОЕДИНЕНИЕ.
#2 by Ayne
Эмм, с каких это пор левые соединения пропадают при использовании подзапросов? Часто ими пользуюсь, у 1С-ников тоже есть отчеты с такими вещами.
#3 by Defender aka LINN
Давай без "упростил". Запусти конкретно эти 2 запроса и сравни результат. Будет отличаться - приходи еще. Будет одинаковый - думай.
#4 by Immortal
они "пропадают", если ты условие накладываешь в секции ГДЕ итогового запроса ну т.е. в таком случае левое равносильно внутреннему
#5 by Ayne
Повторяю. Я намучался с первоначальным запросом из сотен строк, начал искать неработающий кусок и в результате упростил до см. первое сообщение. Вот результат именно этих двух запросов и отличается, хотя теоретически должен быть одинаковым. Именно про эти конкретные два запроса из первого сообщения без никаких изменений я и спрашиваю. Так сойдет? Во втором запросе очепятка, последнюю строку "ПодзапросПродажиОстатки.Номенклатура = ПодзапросНужноеСвойство.Объект" заменить на Кстати, замерил сейчас производительность - второй запрос выполняется в пять раз быстрее первого, поле "значение свойства" не индексировано. Не знаю, как там с точки зрения скл серверов, но с точки зрения 1С я давным-давно вроде читал, что использование подзапросов может ускорить время выполнения запроса (только что вспомнил). А одинаковыми запросы я назвал с точки зрения результата запроса, безо всяких там технических тонкостей.
#6 by Ayne
Однако результат-то не одинаковый получается. Вот я и думаю, посыпать ли голову пеплом и в расход меня или же погодить чутка.
#7 by SOAD
А что значит неработающий вариант? Вообще ни чего не выдает, или как?
#8 by SOAD
У меня и тот и другой вариант отрабатывают одинаково. Результат одинаковый..
#9 by SOAD
в чем фишка.. как заставить их выводить разные данные?
#10 by Ayne
Работающий вариант запроса - отчет с этим запросом показывает правильные данные. Неработающий вариант - соответственно, отчет косячит. Гы, сегодня два часа мучился, тоже результат был одинаковый. Только мудрил на пытошной базе, которую получил таким вот макаром - сделал архивную копию (*.dt) рабочей базы, в пытошную загрузил эту архивную копию. В пытошной все замечательно, оба запроса работают как часы (как запросы в первом сообщении без изменений, так и с условиями по, допустим, номенклатуре и складу в поле ГДЕ или же с условиями в скобках у регистра остатков товаров). Думаю, совсем озверел Черный Абдула. Полез в рабочую базу, итого -в рабочей базе второй запрос косячит. Что-то с базой не то по ходу дела, буду делать тестирование, реиндексацию и чего там еще.
#11 by dimoff
ПО ПодзапросПродажиОстатки.Номенклатура = ПодзапросНужноеСвойство.Объект
#12 by dimoff
Смотрим внимательно имена таблиц в соединении
#13 by Ayne
Еще пояснение - отчет косячит тем, что свойства в результате запроса присоединяются не ко всем товарам, у которых это свойство есть. Данные по остаткам правильные (в изначальном запросе куча подзапросов с группировками, левыми соединениями и прочими прелестями, но косячит именно эта часть со свойствами). Вот такие тараканы с базой. Ну, хоть выяснил, что я не такой уж и косячер :)
#14 by Ayne
dimoff, это очепятка. Выше я уже поправил. Просто начал синонимы править в блокноте, чтобы народ не путать, да в одном месте не подправил.
#15 by Dem1urg
Запросы у тебя разные. В первом случае сначала отработает левое соединение, а уже потом на результат будет наложен фильтр. В итоге у тебя останутся только те позиции, для которых задано значение нужного свойства. А во втором случае выбираются все позиции которые есть на остатках и те для которых есть свойство выводится его значение.
#16 by Fragster
нифига
#17 by Fragster
а если во втором варианте еще и в ГДЕ добавить ЗначенияСвойствОбъектов.Объект ССЛЫКА Справочник.Номенклатура добавить - то будет еще быстрее. а вообще - при чем здесь индект на значениесвойства? + много. может база побилась?
#18 by Fragster
кстати да, в первом случае используются индексы таблицы регистра со свойствами, а во втором - нет. переиндексация должна помочь.
#19 by Ayne
Fragster, вот за доп. условие ГДЕ спасибо. "при чем здесь индект на значениесвойства?" - ой, точно, не то ляпнул, совсем озверел Черный Абдула со всеми этими свойствами! Короче да, база немножко сбрендила. Однако я так и не понял, почему тупит именно второй запрос. При слете индексов разве не первый должен был косячить? Ты же вот сам пишешь, что во втором запросе индексы не используются.
#20 by Fragster
ты же в пишешь, что неправильный результат дает первый запрос. а то, что вариант со вложенным запросом тупит - это нормально, ведь индексы не используются, да.
#21 by Defender aka LINN
Значит, переиндексировать базу и все.
#22 by Ayne
Эм, в первом сообщении совершенно чОтко прописано, что как раз-таки первый запрос работает нормально в любом случае, даже со сбитыми индексами. Получается, что это первый запрос не зависит от состояния с индексами, а второй тупит без переиндексации. Но ведь во втором запросе индексы-то не используются! Вы меня совсем запутали, мужики!
#23 by Стас_1С
И ПодзапросНужноеСвойство.Свойство = &Свойство это как это???
#24 by Ayne
А это есть секретная запатентованная мной фишка. Но лично тебе, камрад, разрешаю ей пользоваться бесплатно!
#25 by Стас_1С
я почему то думал, что после слова По связи таблиц пишутся?
#26 by Fragster
не, секретная фишка - это Таблица.Поле В (&Значение1, &Значение2)
#27 by Fragster
а чем тебе это не связь таблиц?
#28 by Адинэснег
ВЫБРАТЬ ИЗ
#29 by Стас_1С
сделаешь ее в конструкторе запросов?
#30 by Адинэснег
ВЫБРАТЬ ИЗ
#31 by Fragster
легко
#32 by Fragster
чойта?
#33 by dimoff
Тогда между запросами разницы нет вообще никакой, либо чего-то не договариваешь, однако
#34 by Стас_1С
спасибо, у меня без твоих секретных фишек запросы работают, в отличие от твоих)
#35 by Адинэснег
ну он в запросе вродь хочет получить остатки номенклатуры с определенным свойством), эт запрос, который ему нид)
#36 by Стас_1С
сделай и отпишись пожалуйста
#37 by acsent
На фйловой второй будет быстрее выполняться
#38 by acsent
На сиквеле должны быть одинаковы
#39 by Fragster
такой подход позволяет обойтись без временных таблиц - это раз, облегчает построение плана запроса серверу (и соответственно, он его чаще строит правильно) - это два. ну и всякое интересное кунгфу на запросах позволяет делать
#40 by Fragster
ну, раз пожалуйста, то на:
#41 by Fragster
нифига, я проверял - вариант с соединением у меня в любом режиме (кроме скульной на постгре) был не медленнее варианта с ГДЕ
#42 by Стас_1С
сорри эт я от 7.7 уже начал тупеть
#43 by acsent
План смотрел?
#44 by Fragster
скульную на постгре не проверял
#45 by Fragster
я проверял на немного другом запросе :) там вариант с вложенным запросом попадал в тэйбл скан, а с соединением - в индекс скан
#46 by Ayne
Объясни для дураков (для меня) чего это ты там понаписал. Запрос на самом деле посложнее будет, в конторе вовсю идут мутки с использованием свойств не по прямому назначению, меня не слушают! Бедный я нестчастный! Ты о чем про "нифига"? Не вижу никакой нифигы, ты же наоборот подтверждаешь слова того человека, которому отвечаешь. Мужики, так мне кто-нибудь ответит на вопрос? Черт с ней, со скоростью, лично мне на нее наплевать. Это все умник перевел обсуждение в другое русло.
#47 by Леха Дум
Прочувствуйте разницу: 1) отобрать записи в регистре ЗначенияСвойствОбъектов по полям Объект и Свойство и соединить с таблицей товаров - левое соединение 2) выбрать все записи из регистра ЗначенияСвойствОбъектов, отобрав их по полю Свойство, затем, потеряв возможность соединения по индексу, соединить с таблицей товаров - каг бэ левое соединение с результатом вложенного запроса
#48 by dimoff
Мужик, запросы абсолютно идентичны и работать сами по себе должны абсолютно одинаково.
#49 by dimoff
+48 Разве что скорость первого будет быстрее
#50 by Ayne
"Казалось бы, при чем тут" сбитые индексы?
#51 by Ayne
у меня второй в ПЯТЬ раз БЫСТРЕЕ работает. Это уже на пытошной базу, исправленной так сказать.
#52 by dimoff
Прикольно, хотя учитывая что целиком запрос ты не выкладываешь может быть что угодно. Только вопрос то в не про скорость а про то что результаты разные, а в это уже верится с трудом.
#53 by Ayne
Умник, я с самого начала хотел попросить тебя сначала прочитать всю тему, а уже только потом блистать интеллектом/отвечать. Разве это так сложно? Конечно же я сравнивал именно запросы из безо всяких изменений. Запросы абсолютно одинаковые, но тогда почему при слетевших индексах первый запрос продолжает работать нормально, а второй, якобы независящий от индексов, начинает косячить?
#54 by dimoff
Извини, мужик, я не в курсе что такое "слетевшие индексы"
#55 by Леха Дум
это твой ответ? в разжевал, теперь будем глотать: товаров в справочнике - 10000 позиций и по всем есть твое свойство, товаров на остатках - 2000 позиций в первом запросе соединяя таблицы, отбираешь в регистре не только по свойству, но и по объекту, причем делаешь это с использованием индекса - через индекс скан во втором запросе выбираешь ВСЕ 10000 записей из регистра свойств, теряешь индексы, соединяешь две таблицы и в момент соединения отбираешь по объекту, только уже через скан таблицы Вопрос - для чего придумали все эти индексы?
#56 by dimoff
теперь понял что такое слетевшие индексы и понял
#57 by Ayne
Что-то не глотается и даже не жуется. Ответь на свой вопрос сам. Все еще не понимаю, к чему ты это все. Ок, нормальным языком. Почему второй запрос выдавал некорректный результат до переиндексирования базы, и заработал только после него? Почему первый запрос корректно работал как до переиндексирования, так и после него?
#58 by Леха Дум
план запроса смотреть нужно было
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С