Наша компания разрабатывает внутренний проект для разбора текстовых файлов.
Эти текстовые файлы состоят из метаданных, которые извлекаются с использованием регулярных выражений.
Десять компьютеров круглосуточно анализируют текстовые файлы и загружают в базу данных Intel Xeon SQL Server 2005 высокого класса извлеченные метаданные.
Упрощенная схема базы данных выглядит следующим образом:
<b>Items</b>
| Id | Name |
|----|--------|
| 1 | Sample |
<b>Items_Attributes</b>
| ItemId | AttributeId |
|--------|-------------|
| 1 | 1 |
| 1 | 2 |
<b>Attributes</b>
| Id | AttributeTypeId | Value |
|----|-----------------|-------|
| 1 | 1 | 500mB |
| 2 | 2 | 1.0.0 |
<b>AttributeTypes</b>
| Id | Name |
|----|---------|
| 1 | Size |
| 2 | Version |
Существует много различных типов текстовых файлов с различными метаданными внутри. Для каждого текстового файла у нас есть Item
, а для каждого извлеченного значения метаданных у нас есть Attribute<code>.</p>
<p><code>Items_Attributes
, что позволяет нам избежать дублирования значений Attribute
, что позволяет избежать увеличения размера базы данных x ^ 10.
Эта конкретная схема позволяет нам динамически добавлять новые регулярные выражения и получать новые метаданные из новых обработанных файлов независимо от того, какая у них внутренняя структура.
Кроме того, это позволяет нам фильтровать данные и получать динамические отчеты на основе пользовательских критериев. Мы фильтруем по Attribute
и затем поворачиваем набор результатов (http://msdn.microsoft.com/en-us/library/ms177410.aspx). Так что этот пример псевдо-sql запроса
SELECT FROM Items WHERE Size = @A AND Version = @B
</code>
вернет поворотную таблицу, как это
| ItemName | Size | Version |
|----------|-------|---------|
| Sample | 500mB | 1.0.0 |
Приложение работало в течение нескольких месяцев, и его производительность ужасно снизилась в тот момент, когда он больше не используется. Отчеты должны занимать не более 2 секунд, а таблица Items_Attributes увеличивается в среднем на 10 000 000 строк в неделю.
Все правильно проиндексировано, и мы потратили много времени на анализ и оптимизацию планов выполнения запросов.
Итак, мой вопрос, как бы вы масштабировали это, чтобы уменьшить время выполнения отчета?
Мы пришли с такими возможными решениями:
- Купите больше оборудования и настройте кластер SQL Server. (нам нужен совет по правильной стратегии «кластеризации»)
- Использовать базу данных ключ / значение, такую как HBase (мы не знаем, решит ли она нашу проблему)
- Используйте СУБД, а не СУБД (мы рассматривали db4o)
- Переместите наше программное обеспечение в облако (у нас нет опыта)
- Статически генерировать отчеты во время выполнения. (мы не очень хотим)
- Статические индексированные представления для общих отчетов (производительность практически одинакова)
- Денормализация схемы (в некоторых наших отчетах используется до 50 таблиц в одном запросе)