Эффективная специальная структура SQL OLAP - PullRequest
1 голос
/ 13 августа 2010

В течение многих лет я читал мнения многих людей о том, как повысить производительность их запросов SQL (Microsoft SQL Server, просто чтобы мы все были на одной странице ...). Однако все они, похоже, тесно связаны либо с высокопроизводительной настройкой OLTP, либо с настройкой OLAP хранилища данных (cubes-galore ...). Тем не менее, моя сегодняшняя ситуация вроде как в середине 2, поэтому моя нерешительность.

У меня есть общая структура БД [Contacts], [Sites], [SiteContacts] (таблица соединений [Sites] и [Contacts]), [SiteTraits] и [ContractTraits]. У меня есть около 3 миллионов контактов с около 50 полями (между [Контактами] и [ContactTraits]), относящимися только к контакту, и около 600 тысяч сайтов с около 150 полями (между [Сайтами] и [SiteTraits]), относящимися только к сайтам. , В основном это довольно большая сплюснутая таблица или представление ... Большинство столбцов: int , bit , char (3) или short varchar (ы). Моя проблема в том, что значительная часть этих столбцов доступна для использования пользователем в специальных запросах, и как можно быстрее, потому что основным пользовательским интерфейсом для этого будет веб-сайт. Я знаю самые распространенные фильтры, но даже при большой индексации по ним, я думаю, это все равно будет чудовищно ... Эти данные доступны только для чтения; данные не меняются в течение дня, и база данных будет обновляться только самой последней информацией во время запланированного простоя. Поэтому я вижу эту ситуацию как базу данных OLAP с требованиями чтения базы данных OLTP.

вижу 3 варианта; 1. Разбейте таблицу на более мелкие делимые единицы, выполнив подзапрос для всего, 2. создайте одну плоскую таблицу и по-настоящему отправьтесь в город для индексации 3. Создайте куб OLAP и выполните подзапрос для остальных, основываясь на значениях фильтра, которые я не помещаю как размеры куба, так и. Я не так много сделал с кубами OLAP, поэтому, честно говоря, даже не знаю, возможен ли такой вариант, но из того, что я сделал с ними в прошлом, я думаю, что это может быть вариант. Кроме того, просто чтобы уточнить, что я имею в виду, когда говорю «подзапросить все», вместо того, чтобы иметь предложение WHERE для внешнего выбора, будет один (если применимо) для каждой таблицы, вводимой в запрос, и затем таблицы ВНУТРЕННЕЕ СОЕДИНЕНИЕ, чтобы устранить действительно большой Декартовой продукт. Что касается второго варианта одной большой таблицы, я слышал и видел противоречивые результаты при таком подходе, поскольку он экономит на объединениях, но в то же время сканирование таблицы занимает гораздо больше времени.

Идеи кого-нибудь? Нужно ли мне поделиться тем, что я курю? Я думаю, что это может превратиться в довольно хорошую дискуссию, если каждый вложит свои 2 цента. Да, и не стесняйтесь сказать мне, если я далеко от базы с идеей куба OLAP, если это так, я тоже новичок в этом.

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

Ответы [ 4 ]

2 голосов
/ 13 августа 2010

Вы можете рассмотреть это как реляционное хранилище данных.Вы можете создать свои таблицы реляционных баз данных в виде звездообразной схемы (или схемы снежинки).Этот дизайн очень похож на логическую структуру куба OLAP, но физическая структура находится в реляционной базе данных.

В схеме типа «звезда» у вас будет одна или несколько таблиц фактов, которые представляют транзакции некоторого вида и обычносвязано с датой.Я не уверен, что транзакция может быть в этом случае, хотя.Фактом может быть связь сайтов с контактами и таблицей.

Таблица фактов будет ссылаться на таблицы измерений, которые описывают факт.Размеры могут быть сайтами и контактами.Измерение содержит атрибуты, такие как имя контакта, адрес контакта и т. Д. Если вы знакомы с кубом OLAP, то это будет знакомая логическая архитектура.

Добавление большой проблемы не будетмногочисленные индексы для вашей архитектуры.База данных в основном только для чтения, за исключением времени обновления.Вам не придется беспокоиться о производительности чтения во время обновления индексов.Таким образом, архитектура может вместить все необходимые индексы (при условии, что вы можете выделить достаточно времени простоя для обновления данных).

1 голос
/ 13 августа 2010

Я согласен с ответом Бобса: выбросить интерфейс OLAP и выполнить запрос через куб. Причина, по которой это будет хорошей идеей, заключается в том, что кубы очень эффективны для запроса (часто предварительно вычисленных) агрегатов по нескольким измерениям, и они хранят данные в ориентированном на столбцы формате, который более эффективен для анализа данных.

Реляционные данные под кубом будут полезны для детализации, чтобы найти отдельные факты, которые дают определенную совокупную стоимость. Но прямой запрос реляционных данных всегда будет медленным, поскольку те агрегаты, которые интересуют пользователей для анализа, могут быть получены только путем сканирования больших объемов данных. OLAP просто лучше в этом.

0 голосов
/ 13 августа 2010

Если гранулярность SiteContacts довольно близка к гранулярности контактов (т. Е. Около 3 миллионов записей - большинство контактов связано только с одним сайтом), вы можете добиться максимальной производительности из одной таблицы (с большим количеством соответствующих индексов).очевидно, разделение также следует учитывать).

С другой стороны, если большинство контактов связано со многими сайтами, может быть лучше придерживаться чего-то близкого к вашей текущей схеме.

OLAP имеет тенденцию давать лучшие результаты для агрегированных данных- это звучит так, как будто эти данные будут сравнительно мало агрегированы.

Схемы типа "звезда" состоят из таблиц фактов с висящими за ними измерениями - в зависимости от отношений между сайтами и контактами, звучит так, как если бы выиметь одну огромную таблицу измерений или два больших измерения с таблицей фактов без фактов (звучит как оксюморон, но рассматривается в методологии Кимбалла), связывающей их.

0 голосов
/ 13 августа 2010

OLAP / SSAS эффективен для агрегированных запросов, не так много для детальных данных по моему опыту.

Каковы наиболее распространенные запросы? Для отдельных частей данных или агрегатов?

...