Cравнение методов прямого доступа к данным: сравнение ADO и Rainbow   

Как известно, для прямого доступа к данным могут применяться различные внешние компоненты, либо может быть использована технология ADO (ActiveX Data Objects).

Рассмотрим все возможные варианты применения методов и сравним их сильные и слабые стороны.

Для начала расскажу немного о компоненте Rainbow. Ее можно загрузить здесь. Это классическая внешняя компонента (очень широко используемая) содержит большое количество функций. Интересующее нас семейство функций для доступа к данным обеспечивается объектом "ODBCQuery". Свойства и методы данного объекта позволяют выполнить запрос к базе данных SQL. Ограничения данного метода состоят в том, что нет возможностей манипулировать свойствами запроса, такими как свойства курсора и т.д. После выполнения запроса для обращения к его результатам используется серверный курсор последовательного доступа, что бывает не всегда эффективно.

Вот используемые методы объекта "ODBCQuery":
Reset() - Сбрасывает состояние объекта.
Open() - Исполняет команду. Возвращает 1, если успешно.
Close() - Закрывает выборку.
IsOK() - Возвращает 1, если есть выбранный элемент.
Prepare() - Подготавливает SQL-выражение к исполнению.
FindField() - Возвращает индекс поля из открытой выборки по его идентификатору.
GotoNext() - Переходит к следующей записи.
GetLong() - Получает целое значение из поля выборки.
GetString() - Получает строковое значение из выборки.

Как видно из приведенного списка методов объекта, не допускается установка каких бы то ни было параметров. Только выполнение запроса и последовательная выборка результатов запроса.

Вот шаблон для прямого запроса с использованием компоненты Rainbow:
ЗапросРадуги=СоздатьОбъект("ODBCQuery");
ТекстЗапроса="";
Если ЗапросРадуги.Prepare(ТекстЗапроса,1,1)=1 Тогда
    Если ЗапросРадуги.Open()=1 Тогда
        ЗапросРадуги.GotoNext();
        Пока ЗапросРадуги.IsOK()=1 Цикл
            //Считываем данные
            //... ЗапросРадуги.GetString(Номер);
            //... или
            //... ЗапросРадуги.GetString(ЗапросРадуги.FindDield("ИмяПоля"));
            //****************
            ЗапросРадуги.GotoNext();
        КонецЦикла;
        ЗапросРадуги.Close();
    Иначе
        Предупреждение("Ошибка открытия запроса!",10);
    КонецЕсли;
    ЗапросРадуги.Reset();
Иначе
    Предупреждение("Ошибка выполнения запроса!",10);
КонецЕсли;
ЗапросРадуги="";

В свою очередь, технология ADO позволяет организовать действительно полный доступ к данным. Возможности ADO по доступу к данным не ограничены только выборкой данных из последовательного курсора, а охватывают весь спектр возможностей работы с базой данных. Доступ к данным возможен на чтение, запись, исполнение хранимых процедур, изменение таблиц и т.д.

При выполнении запроса на чтение типичный шаблон запроса будет примерно таковым:
Если МонопольныйРежим()=1 Тогда
    Предупреждение("Невозможно выполнить запрос в монопольном режиме!",10);
    //Действия

    //********
КонецЕсли;
Соединение=СоздатьОбъект("ADODB.Connection");
СтрокаКоннекта="driver={SQL Server};server=Test;uid=sa;pwd=***;Database=Base1";
Соединение.ConnectionTimeOut=20;
Соединение.CursorLocation=3;
Попытка
    Соединение.Open(СтрокаКоннекта);
Исключение
    Предупреждение("Невозможно установить соединение с базой данных!");
    //Действия

    //********
КонецПопытки;
ЗапросАДО=СоздатьОбъект("ADODB.Command");
ЗапросАДО.ActiveConnection=Соединение;
ТекстЗапроса="";
ЗапросАДО.CommandText=ТекстЗапроса;
Выборка=ЗапросАДО.Execute();
Если Выборка.EOF()=-1 Тогда
    //Выборка пустая
    //Действия

    //********
Иначе
    Выборка.MoveFirst();
    Пока Выборка.EOF()=0 Цикл
        //Обработка выборки данных
        //...=Выборка.Fields(["ИмяПоля"/Номер]).Value);

        //*****************
        Выборка.MoveNext();
    КонецЦикла;
КонецЕсли;
Выборка.Close();
Соединение.Close();
Выборка="";
ЗапросАДО="";
Соединение="";

Теперь немного подробнее остановимся на сравнении и выявлении достоинств и недостатков каждой из выбранных моделей доступа к данным. Компонента Rainbow использует созданные по аналогии с работой самой "1С" режим доступа. То есть типичный запрос к базе данных выглядит следующим образом:

  • Декларирование переменных и открытие курсора.
  • Выборка из курсора.
  • Закрытие курсора.

То есть, как уже было сказано выше, выборка из базы данных идет через последовательный серверный курсор. Как известно, быстродействие курсора, мало того, что не является самым быстрым, зависит еще и от сложности текста запроса, выбранного для создания курсора.

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

Чтобы продемонстрировать разницу в скорости выполнения запросов, выполненных в ADO и Rainbow, было проведено небольшое тестирование. Было выполнено подряд три запроса, реально используемых в базе данных и в SQL-профайлере отмечены полученные результаты.

Сначала выполнялись три запроса Rainbow, затем три точно таких же запроса, но через ADO. В базе данных находился один единственный тестовый пользователь. Тексты запросов при желании можно посмотреть здесь.

На картинке внизу представлено окно SQL-профайлера (нажмите на картинку, чтобы открылась большая). Синим цветом курсора выделены строки, относящиеся к выполняемым запросам Rainbow и ADO. Как видно, 9 строчек (по 3 на каждый запрос) идет работа Rainbow. Ниже мы можем видеть как подключилось и отключилось новое соединение, через которое работали запросы ADO. В промежутке между подключением и отключением сработали три запроса ADO (представлены каждый одной строчкой).

Большая картинка!

Профайлер выдает количество чтений, потребовавшихся в процессе выполнения запроса или чтения из курсора, а также время работы команды в миллисекундах. Посчитаем время работы запросов Rainbow и ADO, а также количество чтений. Данные сведем в таблицу:

Запрос Количество чтений Время, мс
Rainbow ADO Rainbow ADO
1 1495462 1559 11566 410
2 6088665 1804 41180 400
3 1471514 1574 14730 250
Итого: 9055641 4937 67,48 c 1,06 c

Из таблицы видно, что время выполнения запросов с помощью Rainbow заняло более минуты, тогда как время выполнения запросов через ADO заняло чуть более секунды. Результирующая скорость выполнения запроса ADO получилась быстрее более чем в 60 раз!


 

Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").