« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга



ПнВтСрЧтПтСбВс
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
    Популярное
Комплексные числа в .NET

Сборки

ASP.NET Atlas – внедрение технологии AJAX (Asynchronous JavaScript + XML)

Выбор маршрута в Cisco роутерах

Использование Winsock контрола

Функция UnionRect

Cookies - булочки для браузера

Как Дон Бокс HTTP "похоронил"

Переменная

Графический счётчик на PHP




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 196
Пользователей: 0

Статьи:: Базы данных :: Oracle :: Секционирование и сжатие в хранилищах данных Oracle. Профессионалу-разработчику



отправить ссылку другу версия для печати  Обсудить на форуме

Секционирование и сжатие в хранилищах данных Oracle. Профессионалу-разработчику




Екатерина Кондратьева
ekondratieva@bk.ru

СОДЕРЖАНИЕ


Введение Сегодня на многих предприятиях идет активное внедрение информационно-аналитических хранилищ данных. В результате обозначались и сформировались подходы и принципы, позволяющие оптимизировать построение систем подобного рода на платформе Oracle Database. Один из таких подходов и будет рассмотрен в статье.

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

Учитывая вышеописанное свойство хранилища данных, в качестве метода для поддержки больших объмов данных информации, чаще всего применяют опцию Partitioning СУБД Oracle. При этом происходит разбиение (секционирование) больших таблиц на относительно небольшие разделы (секции). Каждая секция может храниться в отдельном табличном пространстве, что позволяет повысить управляемость, доступность и производительность системы.

Описание проблемы

К основным проблемным местам хранилища относят следующие:

  • Постоянно растущий объем данных по мере эксплуатации системы, и как следствие, высокие требования к объему дискового пространства;
  • Трудно прогнозируемое время выполнения запросов, и длительное время их выполнения, как следствие, большая нагрузка на дисковую подсистему.


Предлагаемое решение

Для "борьбы" со вышеперечисленными недостатками хранилищ данных предлагается разбивать факторные таблицы на секции и периодически сжимать архивные секции. Необходимо отметить, что в хранилищах данных основной объем информации приходится именно на факторные таблицы.

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

На схеме приведена структура факторной таблицы sample, которая содержит данные по продажам.


Рис.1 Структура факторной таблицы "Sample"

Данные по продажам формируются по четырем аналитикам: – "Время", "Продукт", "Клиент", "Отдел продаж". Минимальный уровень по измерению "Время" – год. Данные факторной таблицы можно разбить на логические диапазоны по годам. Т.е. в каждой секции таблицы sample будут содержаться данные за определенный год. Наибольшая производительность при работе с секционированными таблицами достигается при равномерном распределении данных по секциям. На схеме представлена таблица sample, секционированная по годам. Каждый раздел хранится в отдельном табличном пространстве. Секция year_current является загрузочной, то есть в текущий период времени (на рисунке - за 2007 год) данные из информационных источников поступают только в эту секцию; в остальных секциях хранятся архивные данные.


Рис.2 Секционирование факторной таблицы "Sample"

Перед созданием таблицы необходимо сформировать табличные пространства для ее секций.

Пример:
  create tablespace wh_fact_2001_data datafile 'с:oracleoradatadwawwh_fact_2001_data01.dbf'
  size 50M autoextend on next 10M maxsize 2048M
  extent management local
  segment space management auto;
  ... ... ...

В прилагаемом файле приведен полный cкрипт по созданию табличных пространств.

Далее создаем факторную таблицу sample.

Пример:
 create table  sample
 (
  time_id       number(9),
  product_id    number(9),
  customer_id   number(9),
  department_id number(9),
  sale          number 
 )
  nologging
  partition by range(time_id)
  (
   partition year_2001values less than   (-3995) nocompress tablespace wh_fact_2001_data,
  ... ... ...

В целях эксперимента, индексы на столбцы таблицы отсутствуют.
Законченный скрипт создания факторной таблицы приведен в файле.

Следующим шагом заполняем факторную таблицу sample случайными значениями.
Приведенный ниже код служит лишь для заполнения данных в таблицу Sales; в реальной производственной системе загрузка данных будет происходить с помощью специализированных ETL-процедур.

Код для загрузки данных в факторную таблицу:
  ... ... ...
   for v_xTimeId in 1..1005
   loop
     for v_xVersionId in 1..10
     loop
       for v_xProductId in 1..10
       loop
         for v_xCustomerId in 1..10
         loop
           for v_xDepartmentId in 1..20
           loop
            v_xCount := v_xCount + 1;
            v_xFactValue := to_number(to_char(sysdate,'ss'));

            v_xTimeIds(v_xCount)       := v_xTimeId;            
            v_xProductIds(v_xCount)    := v_xProductId;      
            v_xCustomerIds(v_xCount)   := v_xCustomerId;    
            v_xDepartmentIds(v_xCount) := v_xDepartmentId;
            v_xFactValues(v_xCount)    := v_xFactValue;

             if v_xCount = v_xCountLimit  then
              v_xCount := 0;

               forall v_xIndex in 1..v_xCountLimit
                 insert into sample  values(v_xTimeIds(v_xIndex),
                                           v_xProductIds(v_xIndex),
                                           v_xCustomerIds(v_xIndex),
                                           v_xDepartmentIds(v_xIndex),
                                           v_xFactValues(v_xIndex));
             end if;
           end loop;
         end loop;
       end loop;
     end loop;
  end loop;
  ... ... ...

Законченный скрипт приведен в файле по следующей ссылке.

Далее проверяем: какое количество записей содержится в секции year_current.

  select count(*) from sample partition (year_current);

Итак, сейчас в таблице samples содержится 20 миллионов записей.

После вставки записей собираем статистику для таблицы sample. Для этого необходимо вызвать процедуру GATHER_TABLE_STATS из пакета DBMS_STATS.

Код для сбора статистики:
begin
   DBMS_STATS.GATHER_TABLE_STATS (ownname => 'DEMO', tabname => 'sample');
end;
/

Скрипт сбора статистики приведен в файле по следующей ссылке.

Повторно запускаем sql-запрос на подсчет количества записей в секции year_current и sql-запрос на поиск записи с кодом клиента для полного сканирования всей таблицы и анализируем время выполнения этих запросов.

select count(*) from sample partition (year_current);

select * from sample partition (year_2007) where customer_id = 999;

Скрипты представлены в файле.

Время выполнения запроса А – 7,77 секунд (время сканирования секции year_current), время выполнения запроса B – 21,20 секунд (время полного сканирования таблицы).

Следующим шагом, с помощью оператора split partition секцию year_current разбиваем на две – на секцию year_2007, куда относятся значения показателя для 2007 года, и на секцию year_current, готовую для следующей порции загружаемых данных. Предварительно создаем табличное пространство для данных 2007 года.

create tablespace wh_fact_2007_data
  datafile 'c:oracleoradatadwawwh_fact_2007_data01.dbf'
       size 50M autoextend on next 10M maxsize 2048M
       extent management local
       segment space management auto;

Скрипт по созданию табличного пространства приведен в файле.

Расщепляем партицию year_current на две, использую диапазон значений поля time_id, принадлежащих 2007 году.

alter table sample split partition year_current at (1005)
into  
    (
      partition year_2007 tablespace wh_fact_2007_data, 
      partition year_current
    );

Скрипт приведен в файле.

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

select * from dba_segments where owner  = 'DEMO';

Размер секции year_2007 составляет 464 Мб.

Далее, с помощью оператора, move partition производим сжатие секции year_2007.

alter table sample move partition year_2007 tablespace wh_fact_2007_data compress;

Повторно выясняем размер секции year_2007. Теперь, после сжатия, размер секции year_2007 составляет 240 МБ. Таким образом, коэффициент сжатия равен 1,93.

После того, как поступит уведомление о том, что данные 2007 года больше модифицироваться не будут (т.е. этот период в учетных системах закрыт), для ускорения времени выполнения запросов на чтение, и контроля на изменение данных, переведем табличное пространство wh_fact_2007_data в режим "только для чтения" (read only).

alter tablespace wh_fact_2007_data read only;

Проверяем как изменилось время выполнения тестовых запросов (файл).

Время выполнения запроса А – 3,11 секунд, время выполнения запроса B – 9,06 секунд.

Время выполнения запросов существенно сократилось - примерно в 2,5 раза !

Далее выполняем команду на уменьшение файла данных вновь полученного табличного пространства с архивными данными.

alter database datafile 'C:oracleoradatadwawwh_fact_current_data01.dbf' resize 245M;
Заключение

Были получены следующие положительные результаты:

  • Достаточно большой коэффициент сжатия секции, что позволяетт уменьшить размер табличного пространства;
  • Увеличение скорости выполнения запросов;
  • Контроль на DML-операции после завершения формирования загрузки.

Законченные скрипты, использованные в статье, можно загрузить по следующей ссылке.

.




Рубрика: Oracle




Подгрузка через AJAX HTML-кода, содержащег....

AJAX

При разработке CMS S.Builder наша команда активно использовала AJAX. Теперь вот решили поделиться накопленным опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в S.Builder написана библиотека sbAJAX. Можете качать и пользоваться :). В этом файле есть функция sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет или полезут баги. Эта функция как раз решает поставленную задачу.


Подробнее... | Рубрика: AJAX | Добавлено: 19.11.2008

Обзор нового релиза самой мощной Ajax библ....

AJAX

Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все внимание на флагманский продукт — Dojo 1.2.


Подробнее... | Рубрика: AJAX | Добавлено: 19.11.2008

Firebug 1.3 и 1.4 alpha — что нового и инт....

Вебмастеру

Если вы профессиональный веб-разработчик и постоянно имеете дело с разработкой и отладкой сложных AJAX приложений, то наверняка знаете и используете Firebug — плагин для браузера Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем, которые могут возникнуть при разработке. Но и этот инструмент не лишён если не недостатков, то некоторых фич, которые могли бы облегчить работу. И даже идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.


Подробнее... | Рубрика: Вебмастеру | Добавлено: 19.11.2008

Остальные статьи:

Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новы...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейс...
Генераторы отчетов FastReport 4 и QuickRep...
День программиста — набор стерeотипов
Индусские програмисты
Вышел Django 1.0
Портативная версия Google Chrome Portable
Исходные коды .Net Frameword 3.5 SP1 для о...
Пишем правильный online WYSIWYG-редактор


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия