Я написал одно приложение на С#, которое подключено к экспресс-выпуску базы данных сервера sql, с внешнего интерфейса я заполняю конкретную таблицу в базе данных каждые несколько секунд и вставляю примерно 200–300 строк в эту таблицу.
В настоящее время таблица содержит около 3,5 миллионов строк и продолжает расти, определение таблицы приведено ниже.
[DEVICE_ID] [decimal](19, 5) NULL,
[METER_ID] [decimal](19, 5) NULL,
[DATE_TIME] [decimal](19, 5) NULL,
[COL1] [decimal](19, 5) NULL,
[COL2] [decimal](19, 5) NULL,
.
.
.
.
[COL25] [decimal](19, 5) NULL
Я создал некластеризованный индекс для столбца Date_Time, и чтобы отметить, что не существует уникального столбца, если это требуется, я могу создать для него столбец идентификаторов (автоматическое увеличение), но моя логика создания отчетов полностью основана на столбце Date_Time.
Обычно я запускаю запрос в зависимости от времени, т.е. если мне нужно рассчитать изменение, произошедшее в столбце 1 за месячный период. Мне понадобится значение Col1 для первого значения 1-го дня и последнего значения последнего дня месяца, например, мне нужно запустить запрос для гибких дат, и мне обычно нужно только значение открытия и значение закрытия на основе столбца Date_Time для любого выбранного столбец.
Чтобы получить первое значение col1 за первый день, запрос
select top (1) COL1 from VALUEDATA where DeviceId=@DId and MeterId =@MId and Date_Time between @StartDateTime and @EndDateTime order by Date_Time
Чтобы получить последнее значение col1 за последний день, запрос
select top (1) COL1 from VALUEDATA where DeviceId=@DId and MeterId =@MId and Date_Time between @StartDateTime and @EndDateTime order by Date_Time desc
Но когда я запускаю вышеуказанные запросы, это занимает около 20–30 секунд, я считаю, что это можно оптимизировать, но не знаю, что делать дальше.
Одна мысль, которую я дал этому, состоит в том, чтобы создать еще одну таблицу и вставлять первую и последнюю строку каждый день и извлекать данные из нее. Но я избегу того же, если смогу что-то сделать в существующей таблице и запросе.
Очень ценно, если кто-то может предоставить исходные данные для того же.
decimal(19,5)
? Особенно дляDate_Time
это плохая идея. - person i486   schedule 11.09.2016