
- •Отличия хранилищ данных от систем oltp
- •Связь olap и хд
- •Структура информационно-аналитической системы и место olap в ней
- •Логическая многомерная модель
- •Архитектуры olap
- •О преимуществах и недостатках различных архитектур Реляционное хранилище
- •1.1.2.1.Явное указание списка значений
- •1.1.2.2.Формирование значений при помощи оператора select
- •1.1.4.Оператор delete Формат оператора удаления записей
- •1.1.5.Работа с просмотрами (view) Понятие просмотра как виртуальной таблицы
- •1.1.5.1.Способы формирования просмотра
- •1.1.5.2.Обновляемые и не обновляемые просмотры
- •1.1.5.3.Дополнительные параметры просмотра
- •1.1.6.Создание хранимой процедуры Хранимая процедура создается оператором:
- •1.1.7.Алгоритмический язык хранимых процедур Формат объявления локальных переменных:
- •Операторные скобки :Используются для указания границ составного оператора begin ... End ;
- •Оператор for select … do
- •1.1.8.Изменение хп
- •Оператор execute procedure Оператор вызова другой хранимой процедуры:
- •1.1.9.Создание триггеров
- •1.1.10.Изменение существующего триггера:
- •1.2.1.Уровни изоляции транзакций
- •1.3.1.Денормализация для оптимизации
- •Целесообразность создания индексов. Их необходимо создавать в случае, когда по столбцу или группе столбцов:
- •Уменьшение общего количества индексов.
- •Компоненты для доступа к данным, реализующие:
- •Визуальные компоненты, реализующие интерфейс пользователя;
1.2.1.Уровни изоляции транзакций
При одновременной работе нескольких клиентов с одной и той же БД возникают проблемы одновременного изменения данных. Пусть пользователь A получил данные из таблицы RASHOD и впоследствии изменил их. В это же время с той же записью в таблице RASHOD работает пользователь B. Он также изменил записи в той же записи, что и A, и пытается подтвердить их. Пользователь C работает с таблицей RASHOD в режиме «только для чтения». Сразу же возникает группа вопросов:
Позволять или не позволять B изменять запись, если A еще не подтвердил ее изменение?
Позволять ли C видеть изменения, внесенные A и B?
Может ли A видеть изменения, внесенные B, и наоборот?
Для разрешения указанных проблем на стороне клиента определены три уровня изоляции транзакций.
При уровне изоляции транзакций Dirty Read («грязное чтение») конкурирующие транзакции видят изменения, внесенные, но не подтвержденные текущей транзакцией. Если текущая транзакция откатит сделанные изменения, другие транзакции будут обладать недостоверными данными. Этот уровень изоляции может привести к серьезным ошибкам и применяется крайне редко – фактически он не изолирует конкурирующие транзакции.
При уровне Read Committed («подтвержденное чтение») конкурирующие транзакции работают с данными, какими они были на момент старта транзакции A. однако, если транзакция A внесла изменения в запись и подтвердила их, а незавершенная транзакция вновь прочитала эти данные, она увидит изменения.
Уровень изоляции Repetable Read («повторяющееся чтение») заставляет конкурирующие транзакции оперировать с собственными (локальными) версиями одной и той же записи. Если транзакция A читает какую-то запись, она, как и при уровне ReadCommited, получит последнюю подтвержденную ее версию. Однако, если другая транзакция изменит эту запись, а транзакция A вновь прочитает ее, она не увидит внесенных изменений, т.е. A видит всегда одну и ту же версию записи. Изменения, которые вносят конкурирующие транзакции в одну и ту же запись, могут конфликтовать. В этом случае фактически изменит данные первая завершенная транзакция, а попытки подтвердить свои изменения второй и всеми другими незавершенными транзакциями, изменившими те же записи, будут отвергнуты.
Разные серверы БД различным образом интерпретируют уровни изоляции транзакций.
Для InterBase с учетом управляющих параметров формат оператора начала транзакции выглядит следующим образом:SET TRANSACTION [ имя транзакции ]
[READ WRITE | READ ONLY]
[WAIT | NO WAIT]
[[ISOLATION LEVEL] {SNAPSHOT [TABLE STABILITY]
| READ COMMITTED [[NO] RECORD_VERSION]}]
READ WRITE | READ ONLY WAIT– устанавливает уровень доступа к данным (по умолчанию READ WRITE )
WAIT | NO WAIT – определяет поведение при возникновении конфликта при обновлении записи данной транзакции с другой транзакцией, ранее сделавшей изменение в той же записи: WAIT (по умолчанию) побуждает данную транзакцию ожидать завершения конкурирующей транзакции; NO WAIT определяет аварийное завершение данной транзакции.
ISOLATION LEVEL – определяет уровни изоляции транзакций на сервере (по умолчанию SNAPSHOT, что соответствует уровню REPETABLE READ.
READ COMMITTED разрешает стартующей транзакции читать только подтвержденные записи: NO RECORD_VERSION (по умолчанию) – читается последняя версия записи, даже если она не подтверждена другой транзакцией; при этом если указан параметр WAIT, стартующая транзакция будет ожидать подтверждения последней версии; RECORD VERSION – читается последняя подтвержденная версия записи.
40. Физическое проектировании БД. Способы повышения производительности работы с БД. Определение структуры индексов. Денормализация. Оптимизация запросов.
1.3.Физическое проектирование баз данных. Основная часть проблем физического проектирования баз данных в большой степени зависит от особенностей используемого сервера баз данных. В частности, это относится к планированию размещения в дисковой памяти различных частей базы данных: таблиц, индексов, журналов и т.д. Чем больше индексов существует над таблицами базы данных, тем более вероятным будет выполнение запросов по выборке данных и тем медленнее будут выполняться операции модификации базы данных.
В большинстве систем индекс создается автоматически для каждого определенного в таблице первичного, возможного и внешнего ключа. Что касается дополнительных индексов, вводимых для целей более эффективного выполнения запросов, то с ними нужно быть очень аккуратным. Требуется тщательный предварительный анализ наиболее важного набора запросов (к сожалению далеко не всегда это возможно). Нужно также отдавать себе отчет в том, что создание нового индекса для большой заполненной таблицы - это серьезная дорогостоящая операция (как правило, СУБД выполняет сортировку строк таблицы в соответствии со значением ключевого атрибута).
Далее, хотя в языке SQL и в большинстве его реализаций допускается динамическое изменение реляционной схемы базы данных, не все такие изменения выполняются дешево и безопасно. Дешево и безопасно можно создать новую таблицу с набором индексов и добавить столбец к существующей заполненной таблице. Дорого и опасно уничтожается большая заполненная таблица или ее отдельный столбец.
Достаточно часто абсолютно правильно спроектированная реляционная схема базы данных мешает эффективному выполнению транзакций в конкретной прикладной области при использовании конкретного сервера баз данных. Обычно это связано с особенностями синхронизации параллельно выполняемых транзакций.
Предположим, например, что для синхронизации используется механизм блокировки строк таблиц, и существует дополнительный оператор LOCK TABLE, позволяющий явно блокировать таблицу целиком. В базе данных содержится таблица с информацией о сотрудниках большой компании, каждый из которых приписан к отделу, включающему большое число сотрудников. В большинстве транзакций приложения работа происходит только с одним отделом, но из-за большого числа строк, относящихся к этому отделу, используется оператор LOCK TABLE (иначе таблицы синхронизатора могли бы переполниться). Тем самым, в других транзакциях нельзя будет изменить информацию о сотруднике, работающем совсем в другом отделе. Одно из возможных решений проблемы состоит в том, чтобы завести столько отдельных таблиц, сколько существует отделов. Это позволит приложению в целом работать более эффективно, хотя и не оправданно с точки зрения теории.