|
Программирование >> Sql: полное руководство
компании ШМ. Ьсли СУБД заранее знает , что указатель наоора записей оудет использоваться не для обновления данных, а только для их выборки, она может извлечь из этого огромное преимущество, т.к. выборка данных осуществляется гораздо проще. Предложение for update обеспечивает такое предварительное уведомление и де-факто может считаться стандартным элементом встроенного SQL. В связи с широким применением предложения for update, в стандарте SQL2 подобное ему предложение было включено как необязательный параметр в инструкцию declare cursor. Однако, в отличие от СУБД компании IBM, в стандарте SQL2 автоматически считается, что набор записей открывается для обновления, если он не предназначен для произвольного доступа или явно не объявлен как for read only. Предложение for read only в инструкции declare cursor располагаются точно на том же месте, что и предложение for update, и явно информирует СУБД о том, что программа не будет выполнять позиционные операции delete или update для данного набора записей. Так как в результате использования этих инструкций может повышаться нагрузка на СУБД и снижаться ее производительность, программисту следует хорошо понимать, какие предположения делает ваша конкретная СУБД по поводу обновляемости набора записей и с помощью каких инструкций и предложений можно легче всего достичь поставленной цели. Наборы записей и обработка транзакций То, как ваша программа работает с наборами записей, может оказать большое атияние на производительность СУБД. Вспомним, что модель транзакций, описанная в главе 12, гарантирует непротиворечивость данных в течение всей транзакции. По отношению к наборам записей это означает гарантию того, что если ваша программа объявляет набор записей, открывает его, принимает результаты запроса, закрывает набор записей, открывает его опять и снова принимает результаты запроса, то оба раза результаты будут идентичными. Программе также гарантируются идентичные результаты в том случае, если она извлекает одну и ту же строку с помощью двух различных наборов записей. Фактически непротиворечивость данных гарантируется до тех пор, пока программа не закончит транзакцию с помощью инструкции commit или rollback. Так как непротиворечивость между данными в различных транзакциях не гарантируется, то инструкции commit и rollback автоматически закрывают все открытые наборы записей. С технической точки зрения, СУБД гарантирует непротиворечивость данных путем блокирования всех строк результатов запроса, предотвращая их модификацию другими пользователями. Если запрос извлекает много записей, то может быть заблокирована большая часть таблицы. Более того, если после получения каждой строки программа ожидает от пользователя ввода информации (например, чтобы Пользователь провергш данные, увиденные им на экране), то отдельные области базы данных могут быть заблокированы в течение весьма длительного времени. Не Исключено, что пользователь может не завершить транзакцию и уйти на обед, блокируя доступ других пользователей к информации в течегше часа или даже больше! Чтобы свести к минимуму количество требуемых блокировок, при написании интерактивных программ следует руководствоваться следующими принципами: делайте транзакции как можно более короткими; выполняйте инструкцию commit сразу же после каждого запроса и как можно скорее после изменения данных программой; избегайте программ, в которых осуществляется интенсивное взаимодействие с пользователем или выполняется просмотр большого количества записей; если вы знаете, что программа не будет повторно обращаться к какой-либо записи, используйте один из наименее жестких режимов изоляции, описанных в главе 12; это позволит СУБД разблокировать запись, как только начинает выполняться следующая инструкция fetch; избегайте применения наборов записей с произвольным доступом, если вы не предприняли никаких мер, исключающих или сводящих к минимуму избыточные блокировки, вызываемые такими наборами записей; если есть возможность, явно определяйте набор записей как for read only. Резюме Язык SQL применяется для осуществления не только интерактивного, но и программного доступа к реляционным базам данных: Наиболее распространенной разновидностью профаммного SQL является встроенный SQL, в котором инструкции SQL встраиваются в прикладную программу, смешиваясь с инструкциями базового языка программирования, такого как С или COBOL Встроенные инструкции обрабатываются специальным препроцессором SQL Они начинаются со спецификатора (обычно exec sql) и заканчиваются ограничителем, которые неодинаковы в различных базовых языках. Везде, где во встроенных инструкциях SQL могут стоять константы, вместо них можно использовать переменные из базовой прикладной программы, которые называются базовыми переменными. С помощью этих, входных, переменных в базу данных можно передавать значения, вводимые пользователем. Базовые переменные применяются также и для получения результатов запросов Значения этих, выходных, переменных могут затем обрабатываться прикладной программой. Запросы, которые извлекают одну запись, могут быть реализованы посредством одиночной инструкции select, входящей во встроенный SQL. Одиночная инструкция select содержит как запрос, так и базовые переменные, в которые передаются извлекаемые данные Запросы, которые извлекают несколько записей, реализуются во встроенном SQL с помощью указателей наборов записей. Инструкция declare cursor определяет запрос, инструкция open начинает выполнение запроса, инструкция fetch последовательно извлекает строки из таблицы результатов запроса, а инструкция close заканчивает выполнение запроса. Позиционные инструкции update и delete используются для обновления или удаления строки, на которую в данный момент ссьиается указатель набора записей. ---- Динамический SQL *
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |