У меня есть куча файлов журналов, содержащих данные различных временных рядов от датчиков (около 1 Гц, около 10 Гц). В настоящее время данные распространяются на несколько разных файлов и форматов файлов (csv, xml, bccvc и т. Д.). Поэтому я хочу хранить данные в базе данных, чтобы упростить доступ, запрос и т. Д.Массивы быстрого доступа для данных временных рядов в SQL Server
В качестве настройки сейчас я использую одну строку для каждого считывания с моего датчика (см. log_data
или log2_data
ниже). Из Я хочу, чтобы все показания из одного журнала, я могу сделать следующий вызов, который прекрасно работает:
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 7;
, но сказать, что я хочу, чтобы получить журналы из нескольких файлов и сохранить их отделили, следующий не будет работать, потому что они будут одна таблица
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 7 OR imported_log_id = 8;
или даже более сложным (и, вероятно) SELECT, МСВ, XPOS, YPos, zpos иЗ log_data ГДЕ imported_log_id = 7; SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 8; SELECT utc, xvel, yvel, zvel FROM log2_data WHERE imported_log_id = 9; SELECT utc, xvel, yvel, zvel FROM log2_data WHERE imported_log_id = 10;
в качестве альтернативы, я могу назвать
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 7;
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 8;
SELECT utc, xvel, yvel, zvel FROM log2_data WHERE imported_log_id = 9;
SELECT utc, xvel, yvel, zvel FROM log2_data WHERE imported_log_id = 10;
и сохранять их по отдельности. Это работает, но очень медленно, когда количество журналов становится большим. Есть ли способ ускорить это? Все, что я искал, говорит, что если мне нужно использовать массивы, тогда я должен передумать мой дизайн.
Я попытался изменить типы на тип ARRAY в Postgres, и это было awesome. 5-10X ускорение в зависимости от количества запрошенных записей. Проблема в том, что я должен переместить все это из Postgres на SQL Server, поэтому я не могу использовать массивы. Очень грустный. Мне не удалось заставить табличные параметры в SQL Server работать для этого.
Так как я могу сделать эти запросы быстрым способом?
Идеи Надумал, ни один из которых, кажется, очень хорошо:
- Переключитесь назад к Postgres (я хочу)
- Сохранить массивы как разделенный запятыми VARCHAR (8000), то разобрать, когда Я запрашиваю. (Кажется супер фальшивый, и не будет работать, когда значения сами VARCHARS)
- Просто запрос все, а затем отсортировать результирующий набор по imported_log_id (с помощью питона, который не будет слишком плохо, но опять же, кажется, неправильно)
Мои таблицы ниже:
-- The type of data (e.g., POS, VEL)
CREATE TABLE imported_log_type
(
imported_log_type_id INT IDENTITY(1,1) PRIMARY KEY,
imported_log_type_name VARCHAR(8000)
);
-- The raw data
CREATE TABLE imported_log
(
imported_log_id INT IDENTITY(1,1) PRIMARY KEY,
-- Type of the data
imported_log_type_id INTEGER NOT NULL REFERENCES imported_log_type(imported_log_type_id),
-- Original file name
orig_filename VARCHAR(8000) NOT NULL,
-- Blob of original data
orig_file_data VARBINARY(8000) NOT NULL
);
-- The parsed data
CREATE TABLE log_data
(
log_data_id INT IDENTITY(1,1) PRIMARY KEY,
-- Relates to a specific log. One-to-many
imported_log_id INTEGER NOT NULL REFERENCES imported_log(imported_log_id),
utc DOUBLE PRECISION,
elapsed_time DOUBLE PRECISION,
xpos DOUBLE PRECISION,
ypos DOUBLE PRECISION,
zpos DOUBLE PRECISION
)
-- The parsed data
CREATE TABLE log2_data
(
log2_data_id INT IDENTITY(1,1) PRIMARY KEY,
-- Relates to a specific log. One-to-many
imported_log_id INTEGER NOT NULL REFERENCES imported_log(imported_log_id),
utc DOUBLE PRECISION,
elapsed_time DOUBLE PRECISION,
xvel DOUBLE PRECISION,
yvel DOUBLE PRECISION,
zvel DOUBLE PRECISION
)
где вы запрос 'log2_data'? – Aducci
запрос для log2_data идентичен. Я добавлю пример. – TinyTheBrontosaurus