![]() |
![]() |
![]() |
| Главная | Новости | Форум | Документация | Купить | Скачать | Клиенты | Ссылки |
|
Основной задачей OLEDB провайдера для InterBase, как и любой другой компоненты доступа к базам данных, является управление информацией выбранной из базы данных. Поскольку IBProvider позиционируется как движок общего назначения, в нем реализованы решения, предназначенные как для использования в тривиальных задачах, так и в задачах оперирующих большими объемами данных. Эффективность обеспечивается за счет специализированных механизмов управления множеством строк. На текущий момент вы можете использовать:
Наборы рядов только на чтениеНаборы не позволяющие модифицировать выбранные данные являются самым высокопроизводительным способом обработки информации. Основные характеристики
Автоматическое создание и использование временного файла является одной из важнейших характеристик IBProvider. Устанавливая разные значения свойства " Memory Usage", вы можете самостоятельно регулировать порог включения механизма выгрузки данных во временный файл. Этот механизм присутствует в обоих типах наборов наборов только на чтение. Это объясняется тем, что даже при однонаправленном доступе вы можете иметь доступ сразу к данным сразу нескольких рядов. Поэтому если пользователь начнет удерживать больше, чем может поместиться в указанном объеме памяти, провайдер все равно выгрузит часть данных во временный файл. Почему не используется своп-файл и поддержка со стороны операционной системы
Обновляемые наборы рядовДля задач, в которых нужно не только выбирать данные, но и иметь возможность их модифицировать и сохранять изменения обратно в базу данных, в провайдере реализованы два оптимизированных для этих целей вида наборов рядов:
Для обоих видов обновляемых наборов рядов используется идентичный механизм управления рядами. Однако реализация отложенных изменений немного более сложная, а значит и требовательная к ресурсам. Основные характеристики
Страничная организация и кэширование В процессе проектирования и тестирования производительности локального хранилища были опробованы различные схемы хранения данных. Однако после серии смелых экспериментов мы пришли к классической архитектуре хранения всех данных в рамках одного файла. Представление множества в виде списка обеспечивает хорошую производительность операций вставки и удаления рядов. Однако очень плохо увязывается с операцией скроллирования и получения ряда по абсолютному индексу. В частности при использовании метода IRowsetScroll::GetApproximatePosition для получения абсолютного индекса ряда провайдер перебирает все элементы списка. В то же время IBProvider отслеживает общее число рядов в множестве, поэтому накладные расходы, на получение этой информации, отсутствуют. Тем не менее, стандартные способы навигации по множеству с использованием последовательного доступа или закладок, обеспечивают хорошую производительность. Это достигается за счет того, что при навигации выбираются только заголовки рядов - сами данные хранятся отдельно. Список отложенных изменений обеспечивает очередность фиксации изменений в базе данных. Другой положительной стороной ведения этого списка является возможность быстрого перечисления рядов ожидающих изменения. Хранение информации в IB-формате Идентичный способ хранения используется и в наборах только на чтение, но в данном случае такое представление дает следующие преимущества
Поскольку OLEDB типы охватывают гораздо более широкий спектр данных, чем поддерживается InterBase, основная нагрузка ложится на встроенный конвертор типов. Отказоустойчивость На первый взгляд, задача установки новых значений колонок не содержит в себе ни каких сложностей. Однако принимая во внимание
возникает множество проблем, связанных с обеспечением атомарности установки данных нового ряда. В общих чертах проблема была решена следующим образом:
В целом такая схема и уровень отказоустойчивости был обеспечен с единственной целью - исключить утечку места в структурированном хранилище. Автоматический и управляемый режимы записи изменений в базу данных Для сохранения изменений в наборе рядов провайдер использует обычный интерфейс взаимодействия с сервером базы данных в виде параметризованных SQL запросов. Автоматический режим используется для задач, в которых пользователь не имеет возможности настроить создаваемый набор рядов. Например, при использовании средства просмотра таблиц базы данных через IBProvider или при использовании провайдера в качестве связанного сервера MSSQL. Поскольку, в общем случае, не возможно автоматизировать процесс генерации SQL запросов для записи изменений в базу данных, поэтому в IBProvider реализована поддержка только простейших запросов вида "select * from table", где table - таблица с первичным ключом. Для выполнения обновления множества в автоматическом режиме провайдер выполняет системные запросы для получения дополнительной информации относительно таблицы:
На основании этой информации провайдер в состоянии правильно сформировать необходимые SQL запросы. Несмотря на замкнутость автоматического процесса, вы имеете возможность делать подсказки относительно генерации запросов. См. свойства набора рядов " auto_insert_field_rule" и " auto_update_field_rule". Манипулируя этими свойствами можно корректно обрабатывать наличие колонок со значениями по умолчанию (DEFAULT) и минимизировать сетевой трафик, передавая только новые данные ряда. Кроме того, если возможность устанавливать свойства открываемого набора рядов все-таки имеется, то можно определить правила генерации первичных ключей новых рядов. Для этого набору рядов, через свойство " auto_gen_key_rule", нужно указать для каких колонок какие генераторы нужно использовать. Управляемый режим. Для преодоления ограничений автоматического режима, IBProvider позволяет явно определить запросы, которые следует использовать для обратной записи изменений в базу данных. Для этого у набора рядов определены три свойства: " delete_sql", " insert_sql", " update_sql". Для привязки SQL запросов к структуре выбранного множества используются составные параметры:
parameter = <prefix> { <param_type> | <gen_param_type> . <gen_name> } . <column_id>
При определении имен генераторов, таблиц и колонок можно использовать квотированные имена. Изменив значение свойства " named_param_prefix" (по умолчанию это двоеточие), можно изменить префикс параметров запроса. Пример:
Исходный запрос insert_sql delete_sql update_sql Для того чтобы с таблицей CUSTOMER (база данных empoyers.gdb) можно было нормально работать, нужно или удалить или переписать триггер SET_CUST_NO. Обратите внимание, что при формировании параметров запроса провайдер использует данные в формате колонки, связанной с параметром. Поэтому если тип колонки будет отличаться от ожидаемого типа параметра, то сервер должен будет самостоятельно выполнить необходимые преобразования. Среди известных ограничений механизма конвертирования некоторых версий InterBase - неспособность выполнять преобразования между BLOB и строками. Указанное ограничение не распространяется на выполнение параметризированных запросов через команды, в которых обеспечивается передача данных в том формате, в каком их ожидает сервер. Отключенный набор рядов В случае если необходимо выбрать и модифицировать данные без обратной записи изменений в базу данных, можно присвоить свойству набора рядов " disconnected_rowset" true. Одним из целевых назначений этого режима является создание внешнего механизма обратной записи изменений с использованием команд. При создании такого механизма также целесообразно включить режим отложенных изменений ( См. свойство набора рядов IRowsetUpdate), что позволяет организовывать транзакционные изменения набора рядов. Пул SQL запросов Для повышения производительности операций записи изменений в базу данных на уровне каждого набора рядов, поддерживающего обновления, функционирует пул SQL запросов. Этот механизм позволяет сохранять и повторно использовать ранее выполненные запросы. В общем случае стоимость выполнения запроса суммируется из затрат на обращение к серверу для выполнения операций:
InterBase SQL сервер позволяет:
Наиболее большой эффект от использования пула проявляется в автоматическом режиме с сохранением только модифицированных данных. Например, есть таблица с колонками (A1, A2, A3), в которой за один раз вы меняете только одну колонку. В этом случае провайдер будет генерировать запросы вида:
Дополнительно к этим запросам добавляется два системных запроса для получения
Оптимальный размер пула ( См. свойство набора рядов query_pool_size) для выполнения этой задачи равен трем.
В этом случае при дальнейшей модификации любой колонки A1...A3 есть шанс повторного выполнения уже подготовленного запроса. Поиск подходящего запроса осуществляется через сравнение текста SQL. Если идентичный запрос отсутствует в пуле, то провайдер переподготовит запрос с максимальным временем простоя. Обратите внимание, что провайдер переподготавливает запросы использованные для системных нужд. В случае использования управляемого режима, оптимальным размером пула будет сумма SQL запросов, перечисленных в свойствах " delete_sql", " insert_sql", " update_sql", и числа генераторов указанных в параметрах GEN_XXX запросов " insert_sql". Манипулируя свойством " query_pool_size" можно
Обратите внимание, что " query_pool_size" определяет максимальное число запросов. Сами запросы создаются по мере необходимости. Раздельные транзакции для чтения и записи Обновляемые наборы рядов поддерживает два способа записи изменений в базу данных - с использованием основной транзакции, в которой производится чтение данных, и с использованием отдельной короткой транзакции. Кроме того, вы можете указать "мутирующий" режим:
Вид транзакций для модификации данных определяется свойством набора рядов " modify_trans_type". Специальные возможности По умолчанию, обновляемый набор рядов обладает стандартными настройками, которые полностью обеспечивают ожидаемое поведение. Однако спецификация OLEDB определяет специфические режимы, которые могут потребоваться для некоторого класса задач:
|
|||||||||||||
| Сборка сайта № 3.0.0.1660 | |||||||||||||