Как Быстро Выполняется Запрос В Большой Базе

Тема в разделе "1C и всё что с ней связано", создана пользователем Дайнеко, 28 окт 2012.

  1. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Представим себе базку с документооборотом 50-100 документов в день. Пусть учет ведется 2 года.
    Есть вид документов с признаком "Исполнен/Нет".
    И вот человеку надо выбрать все не исполненные. Причем дата у них может быть и древняя. ну может ограничусь последним годом.
    Как быстро отработает запрос по поиску таких документов? Хватит 2-3 секунд? Стоит ли этот реквизит индексировать?

    Или думать над более изощренным механизмом типа регистр сведений.
     
  2. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Проверил.
    Примерно 50 документов вида Заказ-наряд в день (документ огромный - около 70 рекв. шапки). Базе год и 2 месяца.
    Реквизит "Закрыт" типа булево. Неидексируемый. У большинства документов значение "Истина".
    В консоле запрос по закрытым выполнился за 1-2 секунды. Правда в режиме одного пользователя на локальной SQL копии.
     
  3. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    unknown181538, конфигурация "Альфа-Авто"?


    Дайнеко, а почему регистр сведений? Может тогда регистр накопления, а к нему "исполняющий" документ тогда еще прикрутить? Перебирать документы - как-то не совсем красиво, ИМХО.
     
  4. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    УТ 11 допиленная.
    Во-первых не описана задача. Во-вторых причем тут накопление?
    Кстати, подозреваю, что при любом раскладе дальнейшая обработка запроса будет занимать гораздо больше времени.
     
  5. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    А что там накапливать? Какой ресурс придумать? Разве что устроить движение по ресурсу +1 стал на контроль, -1 ушел с контроля.
    А с регистром сведений можно было бы устроить игру по правилам:
    * ставиться на контроль - проведение вносит документ в регистр
    * снимается с контроля - перепроводится документ без записи в регистр, т.о. старая запись убирается.
    Получится, что регистр будет содержать готовый перечень "висящих" на контроле.

    Разумеется, выборка по нему будет мгновенной. Я вот и думаю стоит ли затевать, если время 1-2 секунды приемлемо даже для примитивной выборки.
    А если реквизит проиндексировать, поди в разы быстрее отработает.

    Так что спасибо ответившим.
     
  6. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    1-2 секунды - это в консоли, т.е. вместе с выводом результата.
    И вообще, как будет обрабатываться результат запроса?
    Я не понимаю, о чем вы все.
     
  7. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Я сильно расстраиваюсь, когда меня не понимают. :(
    Задача минимально проста. Пришел утром на работу начальник цеха. Говорит компу: "Дай мне список Не исполненных заказов. Всех (в смысле независимо от даты".
    Вот и думаю, достаточно ли простого запроса.
     
  8. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    ОК. Отмечу, что я выполнял запрос по наоборот исполненным, которых 95 процентов.
    Если я делаю в списке отбор по периоду, разве это не запрос с отбором по реквизиту? Если мы сделаем регистр сведений, то придется делать соединение для получение реквизитов документа?
    Завтра попробую сделать точное измерение именно запроса и в рабочее время)
     
  9. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Попробую забить гвоздь в тему.

    Код:
    Код ( (Unknown Language)):
    &НаСервере
    Процедура НаСервере(ТабДок)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   ПРЕДСТАВЛЕНИЕССЫЛКИ(ЭА_ЗаказНаряд.Ссылка) КАК пр
    |ИЗ
    |   Документ.ЭА_ЗаказНаряд КАК ЭА_ЗаказНаряд
    |ГДЕ
    |   НЕ ЭА_ЗаказНаряд.Закрыт";


    Результат = Запрос.Выполнить();

    Выборка = Результат.Выбрать();

    Пока Выборка.Следующий() Цикл
    ЭА_Сообщить(ТабДок,Выборка.Пр,1);
    КонецЦикла;

    КонецПроцедуры



    &НаКлиенте
    Процедура Команда1(Команда)
    ТабДок = Новый ТабличныйДокумент;
    НаСервере(ТабДок);
    ЭА_ПоказатьСообщения(ТабДок);
    КонецПроцедуры
    ЭА_Сообщить() выводит секцию таб дока. Правда неоптимально - макет получается в цикле, и области тоже.
    Выкладываю замер производительности.
    Видим, что запрос выполняется 0.01 с. В несколько раз быстрее, чем ТабДок.Показать().
     

    Вложения:

    • замер.jpg
      замер.jpg
      Размер файла:
      197,5 КБ
      Просмотров:
      32
  10. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Нихт, ИМХО.

    1. Обращение в запросе к реальной таблице документов
    2. Обращение в запросе к реальной таблице документов (если не проводной), то без ограничений на пометку удаления.

    Опять же - по идее:

    Документ должен быть проводной, следовательно должны быть регистры в которых документ регистратор.
     
  11. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    2 отметается. Мой документ всегда проводится, и никогда не помечается на удаление.

    Запрос к реальной таблице регистра сведений с соединением с таблицей документа для получения реквизитов чем-то лучше?
    Плодим лишние сущности для того, чтобы сэкономить 0.01 с или для выполнения догм?
    Повторю вопрос, отображение списка документов - это не запрос к реальной таблице? К тому же, запрос к виртуальной таблице как правило - соединение таблиц, т.е. менее предпочтителен, мы же не остатки считаем.
    Вообще, не видел нигде в типовых никаких регистров для вывода реестров.
    Регистры есть, но документ может и не иметь движений. Да и если бы были, обращаться к регистру накопления для отбора по реквизиту документа? Предложите свой код.
     
  12. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Молодец - забил по полной.
     
  13. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    unknown181538, стоп. Давайте не будем путать "х*й с трамвайной ручкой".
    1. Список документов или виртуальная таблица - безусловно запрос реальной таблице, но выполненный платформой. А это большая разница.
    Во-вторых никогда не говори "никогда" (про пометку удаления).
    В-третьих: изначально был вопрос про выбор документов которые не исполнены. Исполненность указывается руками в прошлых периодах? Странно.
    4. Мы гонимся за "как быстрее" или как правильно писать код? Если как быстрее, тогда да, давайте в циклах пускать запросы по физическим таблицам.

    Мой фрагмент кода - ... а я не знаю, что именно вы уже хотите получить. Тупо отобрать - индекс на "исполненность" и далее "отбор" по этому полю. Этот "фрагмент" тупо - форма списка по неведомому реквизиту исполненности.
     
  14. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    "Во-вторых никогда не говори "никогда" (про пометку удаления)."
    Ее невозможно поставить руками. И это было еще в базе 7.7 сколько -то лет назад.
    "1. Список документов или виртуальная таблица - безусловно запрос реальной таблице, но выполненный платформой. А это большая разница. "
    А этот запрос выполняется не платформой?
    "В-третьих: изначально был вопрос про выбор документов которые не исполнены. Исполненность указывается руками в прошлых периодах? Странно." У меня при простановке исполненности документ переезжает на текущую дату. Неисполненный может быть в любом периоде.
    "4. Мы гонимся за "как быстрее" или как правильно писать код? Если как быстрее, тогда да, давайте в циклах пускать запросы по физическим таблицам." Гонимся много за чем. Например, запись в лишний регистр сведений - лишнее время при проведении. Лишний код и лишний объект - это тоже жертва. В данном случае неоправданная.
    "Тупо отобрать - индекс на "исполненность" и далее "отбор" по этому полю. Этот "фрагмент" тупо - форма списка по неведомому реквизиту исполненности."
    Я опять не понимаю. Чем это отличаетс от моего варианта?
     
  15. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Спор ниочем. Поступайте как считаете нужным.
     
Загрузка...

Поделиться этой страницей