2013-04-12 2 views
0

Каков наилучший способ хранения большого количества (нескольких миллионов) записей, используемых для создания отчетов? Характер приложения требует, чтобы каждая запись, соответствующая поиску, отправлялась в приложение для обработки, поэтому для нас важны как скорость выполнения запроса, так и скорость передачи результатов запроса.Лучший способ хранения большого количества datarow для запросов

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

Решение SQL дает нам неплохую производительность, но меня интересует, есть ли другие альтернативные альтернативы, например, это базы данных NoSQL - это правильное решение для начала поиска?

Наши запросы сделаны против небольшого количества столбцов, но результаты могут отличаться по размеру (количество строк, необходимое для каждого исполнения в зависимости от периода и некоторых других параметров).

Заранее благодарим за помощь в получении новых перспектив.

Поскольку мы являемся магазином .NET, любые решения/идеи, которые хорошо подходят с .NET и серверами Windows, являются большим плюсом для нас, но я ценю все материалы, которые я могу получить от этого. И решениями я имею в виду некоторые другие бэкэнды, чем MSSQL или другие реляционные-dbs?

+0

Не следует. «может хранить записи только в одном столбце, так как данные не являются реляционными в нем сами». «Наши запросы сделаны против небольшого числа столбцов». Если записи находятся в одном столбце, как вы запрашиваете более одного столбца? – Paparazzi

+0

Мне очень жаль, его следует сказать «один стол». Сообщение теперь отредактировано. Спасибо, что указали это. – jmw

ответ

1

Эффективность запроса на основе запросов и индексы

Для передачи данных клиента:

  • Просто прямо DataReader является очень эффективным
  • Drapper также быстро, но у меня есть не используется

У меня была достоверная интерпретация того, что результаты запроса должны быть сохранены для повторного запуска
запрос выполняется только один раз

Data 
int ID iden 
varchar Value1 
varchar Value2 

SavedQuery 
int ID iden 
varchar name 

SavedQueryResults 
int QueryID PK 
int DataID PK 

Select [Data].[Value1], [Data].[Value2] 
From [Data] 
Join [SavedQueryResults] 
    on [SavedQueryResults].[DataID] = [Data].[ID] 
and [SavedQueryResults].[QueryID] = x 

с ПК на SavedQueryResults это должно привести к индексу искать и не может сделать лучше, чем это.

При создании SavedQueryResults использовать заказ DataID во вставке, чтобы фрагментация вниз

+0

См. Обновление ..... – Paparazzi

+0

Хорошо, это звучит как хорошее решение, но в моем случае, когда создается отчет для набора данных, обработанный результат данных сохраняется в приложении (как агрегированный результат), поэтому тот же запрос почти никогда не выполняется более одного раза. В противном случае, я думаю, это было бы хорошим решением. Но понимаете ли вы, что правильно хранить данные в таблице mssql является «правильным» решением для моего случая, хотя есть способы ускорить выполнение запросов с помощью решений, подобных описанным вами? – jmw

+0

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

0

Почему вы не достаточно иметь несколько таблиц отчетов, обновляется с триггерами, это было бы намного более эффективным. То же, что и модели просмотра в мире CQRS.

+0

Можете ли вы подробнее рассказать о своем ответе? Почему это было бы лучшим решением для этого случая, я не понимаю эту выгоду? – jmw

+0

Сколько таблиц вы должны присоединиться, чтобы получать отчеты? И в зависимости от блокировки таблицы, которую вы используете, при выполнении этих запросов вы, возможно, хорошо переносите всю производительность системы. Что делать, если два клиента запрашивают один и тот же отчет? Просмотр моделей работает как таблицы кэширования, которые содержат точные данные, которые нужны отчету, поэтому, если клиент запросит его, он сразу же появится. – Marco

+0

Существует только таблица, на которой расположены все данные для отчета. И каждый отчет (запрос) почти всегда выполняется только один раз, поэтому я не думаю, что подход «кэширования» подходит для нас. Так как в нашем случае запись никогда не меняется после того, как ее в таблице и невоспроизводимые чтения и т. Д. Не проблема в нашем приложении, нам не нужно использовать какую-либо строку или таблицу при чтении (READ UNCOMMITTED). – jmw

Смежные вопросы