Классика баз данных - статьи



         

Проблема частичных объектов и парадокс времени загрузки


Давно известно, что для сетевого взаимодействия, типа того, который требуется при выполнении традиционного запроса на SQL, требуется значительное время. (Грубые тесты показывают, что это время на три-пять порядков превосходит время, требуемое для обработки одного вызова метода на платформе Java или .NET. (В этом случае сравнивалось время вызова метода через Java RMI со временем локального вызова. Similar results are pretty easily Аналогичные результаты можно получить для доступа к данным на основе SQL, сравнив время выполнения межпроцессных вызовов со временем внутрипроцессных вызовов с использованием средства управления базами данных, в котором поддерживаются оба типа вызовов, например, Cloudscape/Derby или HSQL (Hypersonic SQL). Примерная аналогия состоит в следующем: если время пути из дома на работу составляет двадцать минут, и мы будем считать, что это время соответствует времени обработки локального вызова метода, то время, соответствующее времени обработки сетевого вызова составит пятнадцать лет. За это время можно добраться от Земли до Плутона.) Очевидно, что эти расходы нетривиальны, и поэтому разработчики пытаются минимизировать их за счет оптимизации числа проходов по сети и объема выбираемых данных.

В SQL эта оптимизация достигается путем тщательной структуризации SQL-запросов, обеспечивающей выборку только требуемых столбцов и/или таблиц, а не таблиц целиком или наборов таблиц. Например, при построении традиционного пользовательского интерфейса для детализации данных разработчик представляет пользователю сводное отображение всех записей, из которых он может выбрать одну запись, и тогда разработчик отобразит полный набор данных для этой конкретной записи. Если, например, требуется произвести детализацию описанного раньше реляционного типа Persons, то это можно сделать с помощью следующих двух запросов (в предположении, что пользователь выбирает первую запись):

SELECT id, first_name, last_name FROM person;

SELECT * FROM person WHERE id = 1;

Заметим, в частности, что на каждом шаге этого процесса выбираются только требуемые данные.


Содержание  Назад  Вперед