2016-04-07 4 views
0

У меня есть куча файлов журналов, содержащих данные различных временных рядов от датчиков (около 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 
    ) 
+0

где вы запрос 'log2_data'? – Aducci

+0

запрос для log2_data идентичен. Я добавлю пример. – TinyTheBrontosaurus

ответ

0

Для этого запроса:

SELECT utc, xpos, ypos, zpos 
FROM log_data 
WHERE imported_log_id = 7; 

Вы хотите индекс на log_data(imported_log_id). Вы также можете сохранить дополнительные столбцы в индексе.

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

Примечание: Вы можете обрабатывать два запроса как один:

SELECT imported_log_id, utc, xpos, ypos, zpos 
FROM log_data 
WHERE imported_log_id IN (7, 8); 
Смежные вопросы