Представьте себе поток данных, который является «пакетным», т. Е. Он может иметь 10 000 событий, прибывающих очень быстро, а затем ничего не ждать в течение минуты.
Ваш совет эксперта: как я могу написать код вставки C # для SQL Server, чтобы гарантировать, что SQL немедленно кэширует все в своей оперативной памяти, не блокируя мое приложение больше, чем требуется для загрузки данных в упомянутую оперативную память? Для этого вам известны какие-либо шаблоны для настройки самого SQL-сервера или шаблоны для настройки отдельных таблиц SQL, в которые я пишу?
Конечно, я мог бы сделать свою собственную версию, которая включает построение моей собственной очереди в ОЗУ - но я не хочу, так сказать, изобретать каменный топор палеолита.
Ответы:
Вы пытались просто написать и посмотреть, что происходит? У вас есть известное узкое место?
Если вам нужно предотвратить блокирование вашего приложения, то вы можете поставить записи в очередь, чтобы отложить вызов базы данных. Тем не менее, я ожидаю, что очередь очистится через секунду или 2: так вам нужна очередь, если это нормально?
Или вы можете намотать на промежуточный стол, а потом смыть? Мы используем эту технику, чтобы иметь дело с последовательной записью миллионов новых строк в минуту (мы фактически используем промежуточную БД с Простым восстановлением), но мы не реализовали ее, пока у нас не было опыта простой записи строк.
Примечание. Каждая запись в SQL Server будет выполняться на диске как часть протокола записи в журнал записи (WAL). Это относится к записи t-log для этой записи.
Страница данных со строкой в какой-то момент перейдет на диск (в зависимости от времени, использования, нехватки памяти и т. Д.), Но, как правило, ваши данные все равно будут в памяти. Это называется «контрольная точка» и не удаляет данные из памяти, а просто сбрасывает изменения (отредактировано 24 ноября 2011 г.)
Редактировать:
Из соображений повсеместности, основываясь на последнем параграфе выше, переместите LDF для этой базы данных на выделенный набор дисков для большей производительности. Так же промежуточная база данных (по одной для MDF / LDF). Для вашего сервера базы данных довольно часто иметь дюжину или 3 разных тома (обычно через SAN)
источник
Если я что-то упустил, это нарушило бы требование Durability от ACID ( http://en.wikipedia.org/wiki/ACID ). То есть, если ваше приложение «записывает» данные в ОЗУ, а затем происходит сбой сервера, ваши данные теряются.
Итак, вы ищете либо систему без базы данных, которая служит в качестве очереди для возможного хранения в базе данных, либо систему базы данных, которая достаточно быстра для того, что вы делаете. Я бы предложил сначала попробовать последнее и посмотреть, достаточно ли этого; не занимай проблем.
источник
Я использовал один раз набор данных для этого. Я вставлял строки в набор данных по мере их поступления, и был другой поток, который сбрасывал строки каждые 2 секунды или около того в базу данных. Вы также можете использовать XML-документ для выполнения кэширования, а затем передать XML-файл в базу данных за один вызов, это может быть даже лучше.
С уважением
Петр
источник