понедельник, 5 августа 2013 г.

Запрос. Выгрузить() vs Выбрать(). Менеджер объекта?

Недавно просматривал статью "Особенности использования динамических выборок (выборки данных с помощью методов Выбрать...)" из методических рекомендаций (или тут).
В частности, там есть такой момент, который меня удивил:
Следует учитывать, что если в процессе обхода выборки данные изменяются (в данной сессии, или другими сессиями), то могут возникать такие ситуации, как получение данных удаленного объекта, получение в выборке одного объекта два раза, не попадание некоторых записей в выборку и т.д.
Т.е. они хотят сказать, что вы высоконагруженных системах моя любимая выборка будет "глючить" и придется тянуть здоровенные таблицы в память?
Конечно, какая эта еще вероятность, того что данные изменятся в момент выборки. Но важен сам принцип.

И все-таки я сомневаюсь. С одной стороны логика подсказывает, что если оно сразу не пишется все в память, значит, читается порциями. А так как еще и зависит от скорости выполнения кода 1С, то может быть хорошо растянуто во времени.
Так же на эту рекомендацию авторитетно ссылается Радченко.

С другой стороны, все сообщения датируются 2008-2009 годом, а сама статья на ИТС и того старше, поди. Может быть что-то поменялось, просто я не знаю где почитать более актуальную статью?

Еще один, самый главный момент для сомнения в том, есть ли разница в работе методов Справочники.Номенклатура.Выбрать() и Запрос.Выполнить().Выбрать().
Да, типы возвращаются разные, но сам механизм и запросы, которые отправляются к БД? Возможно ли, что такая выборка порциями относится только к выборке при обращении к менеджеру объекта, или же с выборкой запроса механизм одинаковый?

Складывается ощущение, что я не правильно понял статью и под динамической выборкой подразумевается именно выборка из менеджера объекта, а не из результата запроса. Действительно, как, например, в сложном "навороченном" запросе выбрать строки с 25 по 50?

Коллеги, кто-то еще интересовался этим?

4 комментария:

Artem Merkulov комментирует...

Сейчас в профайлере глянул.
При использовании выборки через менеджер на сервер уходит много запросов типа:
---------------------------
exec sp_executesql N'SELECT TOP 25
T1._IDRRef,
T1._Version,
T1._Marked,
T1._PredefinedID,
T1._Code,
T1._Description
FROM dbo._Reference8 T1 WITH(NOLOCK)
WHERE T1._Description = @P1 AND T1._IDRRef > @P2
ORDER BY (T1._Description) ASC, (T1._IDRRef) ASC
OPTION (FAST 1)',N'@P1 nvarchar(4000),@P2 varbinary(16)',N'Тестовый 141',0x960FE811321B412D11E2FEC6BD356E8C
-----------------------------

То есть данные реально достаются порциями.

А при выборке запросом, на сервер уходит только запрос:
----------------------------------
SELECT
T1._IDRRef
FROM dbo._Reference8 T1 WITH(NOLOCK)
-------------------------------------

Green FiLin комментирует...

Ага! Значит предположение верное. Выборка по 25 относится к выборке из менеджера, а не к выборке результата запроса.

Спасибо.

Александр Кунташов комментирует...

Ключевые слова для курения мануалов - "грязное чтение", "уровни изоляции", "чтение в транзакции" и другие из этой серии.

Причем это не только к 1С применимо.

Что касается 1С - вот из относительно свежего - http://infostart.ru/public/157277/

Green FiLin комментирует...

Интересная публикация, многое объясняет.
Спасибо.

Отправить комментарий