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;
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
)
nereye log2_data' 'sorgulamak yok: biri olarak iki sorgu işleyebilir? – Aducci
log2_data için sorgu aynıdır. Örneği ekleyeceğim. – TinyTheBrontosaurus