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

  • Автор темы Дайнеко
  • Дата начала
Д

Дайнеко

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

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

unknown181538

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

Darlock

unknown181538, конфигурация "Альфа-Авто"?


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

unknown181538

unknown181538, конфигурация "Альфа-Авто"?
УТ 11 допиленная.
Дайнеко, а почему регистр сведений? Может тогда регистр накопления, а к нему "исполняющий" документ тогда еще прикрутить? Перебирать документы - как-то не совсем красиво, ИМХО.
Во-первых не описана задача. Во-вторых причем тут накопление?
Кстати, подозреваю, что при любом раскладе дальнейшая обработка запроса будет занимать гораздо больше времени.
 
Д

Дайнеко

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

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

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

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

unknown181538

1-2 секунды - это в консоли, т.е. вместе с выводом результата.
И вообще, как будет обрабатываться результат запроса?
Я не понимаю, о чем вы все.
 
Д

Дайнеко

И вообще, как будет обрабатываться результат запроса?
Я не понимаю, о чем вы все.

Я сильно расстраиваюсь, когда меня не понимают. :(
Задача минимально проста. Пришел утром на работу начальник цеха. Говорит компу: "Дай мне список Не исполненных заказов. Всех (в смысле независимо от даты".
Вот и думаю, достаточно ли простого запроса.
 
U

unknown181538

Я сильно расстраиваюсь, когда меня не понимают. :(
Задача минимально проста. Пришел утром на работу начальник цеха. Говорит компу: "Дай мне список Не исполненных заказов. Всех (в смысле независимо от даты"
Вот и думаю, достаточно ли простого запроса.
ОК. Отмечу, что я выполнял запрос по наоборот исполненным, которых 95 процентов.
Если я делаю в списке отбор по периоду, разве это не запрос с отбором по реквизиту? Если мы сделаем регистр сведений, то придется делать соединение для получение реквизитов документа?
Завтра попробую сделать точное измерение именно запроса и в рабочее время)
 
U

unknown181538

Попробую забить гвоздь в тему.

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

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


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

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

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

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



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

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

Вложения

  • замер.jpg
    замер.jpg
    115,3 КБ · Просмотры: 534
D

Darlock

Нихт, ИМХО.

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

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

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

unknown181538

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

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

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

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

Darlock

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

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

unknown181538

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

Darlock

Спор ниочем. Поступайте как считаете нужным.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!