2016-04-07 21 views
0

Algılayıcılardan (bazı 1Hz, bazı 10Hz) çeşitli oranlı zaman serisi verilerine dayanan bir grup günlük dosyam var. Veriler şu anda birkaç farklı dosya ve dosya formatlarına (csv, xml, csv'nin kasıtlı sürümleri vb.) Yayılmıştır. Bu yüzden, veriyi bir veritabanına daha kolay erişebilmeyi, sorgulamayı vb. Yapmak için saklamak istiyorum.SQL Server'da zaman serisi verileri için hızlı erişim dizileri

Şimdi kurulum olarak, sensörümden her bir okuma için bir satır kullanıyorum (bkz. Aşağıdaki log_data veya log2_data). Bir günlüğünden tüm okumaları almak istiyorum ki ben büyük işler şu çağrıyı yapabilirsiniz:

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

ama birkaç dosya günlükleri almak ve aşağıdaki çünkü çalışmaz ayrılmış onları kalmasını istiyor onlar bir tablo

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

olacak

veya daha da karmaşık (ve muhtemelen) DAN SEÇ utc, xpos, YPOS, zpos log_data NEREDE imported_log_id = 7; SELECT utc, xpos, ypos, zpos log_data FRHER FRED_log_id = 8; SELECT utc, xvel, yvel, zvel log2_data'dan WHERE imported_log_id = 9; SELECT utc, xvel, yvel, zvel log2_data'dan WHERE imported_log_id = 10;

alternatif olarak ben

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; 

arayabilir ve bunları ayrı ayrı kaydedin. Bu çalışır, ancak günlüklerin sayısı büyüdüğünde çok yavaştır. Bunu hızlandırmanın bir yolu var mı? Baktığım her şey, dizileri kullanmam gerekirse, tasarımımı yeniden düşünmem gerektiğini söylüyor.

Türleri PostGres'te ARRAY türüne değiştirmeyi denedim ve harika oldu. İstenen kayıt sayısına bağlı olarak 5-10X hız. Sorun şu ki, tüm bunları PostGres'den SQL Server'a taşımak zorundayım, bu yüzden dizileri kullanamıyorum. Çok üzgün. Bunun için SQL Server'da tablo değerli parametreler elde edemedim.

Bu sorguları nasıl temiz bir şekilde hızlı bir şekilde yapabilirim? Ben, bunların hiçbiri düşündüm

Fikirler çok iyi görünüyor:

  • Anahtarı geri Postgres için (keşke)
  • kaydet virgülle ayrı VARCHAR olarak diziler (8000) daha sonra ne zaman ayrıştırmak Ben sorgularım
  • Hemen her şeyi sorgulamak (süper hokus görünüyor ve değerler kendileri varchars olduğunda çalışmaz), sonra sıralama (çok kötü olmaz, hangi python kullanırken ama yine yanlış görünüyor) imported_log_id tarafından belirlenen sonuç

Benim tabloları aşağıdaki gibidir:

-- 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

nereye log2_data' 'sorgulamak yok: biri olarak iki sorgu işleyebilir? – Aducci

+0

log2_data için sorgu aynıdır. Örneği ekleyeceğim. – TinyTheBrontosaurus

cevap

0

bu sorguyu:

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

Sen log_data(imported_log_id) üzerinde bir dizin istiyorum. Ek sütunları dizinde de tutabilirsiniz.

Verileri yükleme şekliniz göz önüne alındığında, bunu kümelenmiş bir dizin haline getirebilirsiniz ve bu, performansa büyük bir destek olmalıdır.

Not:

SELECT imported_log_id, utc, xpos, ypos, zpos 
FROM log_data 
WHERE imported_log_id IN (7, 8); 
İlgili konular