Я импортирую данные о бразильском фондовом рынке в базу данных SQL Server. Прямо сейчас у меня есть таблица с информацией о ценах трех видов активов: акции, опционы и форварды. Я все еще нахожусь в данных за 2006 год, и таблица содержит более полумиллиона записей. У меня есть более 12 лет данных для импорта, поэтому таблица наверняка превысит миллион записей.
Теперь мой первый подход к оптимизации состоял в том, чтобы сохранить данные до минимального размера, поэтому я уменьшил размер строки в среднем до 60 байт со следующими столбцами:
[Stock] [int] NOT NULL
[Date] [smalldatetime] NOT NULL
[Open] [smallmoney] NOT NULL
[High] [smallmoney] NOT NULL
[Low] [smallmoney] NOT NULL
[Close] [smallmoney] NOT NULL
[Trades] [int] NOT NULL
[Quantity] [bigint] NOT NULL
[Volume] [money] NOT NULL
Теперь второй подход к оптимизации заключался в создании кластеризованного индекса. На самом деле первичный индекс автоматически кластеризуется, и я сделал его составным индексом с полями Stock и Date. Это уникально, у меня не может быть двух данных котировок для одной и той же акции в один и тот же день.
Кластерный индекс гарантирует, что котировки из одной и той же акции остаются вместе, и, вероятно, упорядочено по дате . Верна ли эта вторая информация?
Сейчас, имея полмиллиона записей, требуется 200 мс , чтобы выбрать 700 кавычек из определенного актива. Я считаю, что это число будет расти с ростом таблицы.
Теперь о третьем подходе, который я подумываю разделить на три таблицы, каждая для определенного рынка (акции, опционы и форварды). Это, вероятно, сократит размер стола на 1/3. Теперь этот подход поможет или он не имеет большого значения? На данный момент размер таблицы составляет 50 МБ, поэтому он может без проблем помещаться в оперативной памяти.
Другим подходом было бы использование функции секционирования SQL Server. Я не знаю много об этом, но я думаю, что он обычно используется, когда таблицы большие, и вы можете распределить по нескольким дискам, чтобы уменьшить задержку ввода-вывода, я прав? Будет ли полезным в этом случае разделение? Я полагаю, что могу разделить самые новые значения (последние годы) и самые старые значения в разных таблицах. Вероятность поиска самых новых данных выше, и с небольшим разделом это, вероятно, будет быстрее, верно?
Какие были бы другие хорошие подходы, чтобы сделать это максимально быстрым? Основное использование таблицы выбирается для поиска определенного диапазона записей по конкретному активу, например за последние 3 месяца актива X. Будут другие варианты использования, но это будет наиболее распространенным способом, который может быть выполнен более чем на 3 тыс. пользователи одновременно.