44 messaggi dal 15 dicembre 2006
Salve
Ho un problema un po' complesso da risolvere; cercherò di spiegare in modo esauriente e sbrigativo.
Lavoro per un ente che effettua registrazioni di variabili ambientali (CO2, H2O, temperature etc); i valori vengono campionati con frequenza di mezzora.
Il nostro sistema (Sql Server 2008 R2) deve registrare i suddetti valori che vengono mandati da 200 e più stazioni
C'è ovviamente una tabella che memorizza tutte le stazioni
Le variabili a loro volta sono più di 200 e possono essere create di nuove, a seconda delle posizioni dei sensori.
Ciò premesso, nel sistema attuale che ho ereditato, ci sono 30 tabelle per i dati misurati; ogni colonna è una delle variabili. Quando si crea una nuova variabile, bisogna quindi aggiungere una colonna ad una di queste tabelle...e se non c'è più spazio (una tabella con 300 colonne?!), si crea una nuova tabella e così via.
Ora, avevo provato a cambiare strategia: una tabella che avesse come chiavi esterne l'ID del sito e l'ID della variabile; così non dovrei aggiungere colonne, ricreare tabelle etc etc. Ma quando ho eseguito una query ('dammi i valori della variabile x per il sito y dell'anno 2008'), col sistema attuale ci sono voluti ~0 secondi; con il 'nuovo', 3 e più. In effetti, col nuovo sistema, considerando che un anno di dati registrati ad intervalli di 30' comporta 17520 record, per 10, 200 siti e 200 variabili...
Quando ho posto la domanda ad altri forum (stackoverflow, ad es), mi hanno detto che il metodo attuale è il migliore. Io non sono ancora convinto...
Spero di essere stato chiaro
Saluti
Diego
843 messaggi dal 08 aprile 2009
Parlo non da super esperta ma quello che vuoi fare tu è un data base ad oggetti...Sql Server è un data base relazionale e quindi non adatto ad estrapolare al meglio i dati progettati come vuoi tu. Per fare quello che dici tu dovresti innanzi tutto cambiare strumento e affidarti a oggetti tipo NoSQL.
Per intenderci i social network per gestire la mole di dati in tempi brevi utilizzano questa tecnologia.
Quasi 15 anni fa ho avuto il tuo stesso problema per un progetto pilota e abbiamo optato per la tua tecnica ma i tempi di risposta erano troppi lunghi...
44 messaggi dal 15 dicembre 2006
ciao laurar181
in realtà la mia soluzione è altamente relazionale: nel senso che la tabella dei dati avrebbe una serie di riferimenti esterni. uno per l'id del sito che spedisce i dati e uno per l'id della variabile misurata.
a parte il fatto di ricorrere a join per estrapolare il nome del sito e della variabile, resta la lentezza della risposta: se considero 10 siti per 10 variabili per 10 anni di dati, una misura ogni 30', abbiamo oltre 17 milioni di record. un'inezia, ma già con 100 siti e 50 variabili arriviamo a 876 milioni di record.
se credi, potrei mandarti il (pseudo)codice sql per spiegarmi meglio
grazie
diego
44 messaggi dal 15 dicembre 2006
ciao laura
grazie per il supporto
questa è una delle 30 tabelle attuali; la chiave primaria è data dalla data di misurazione e dall'id del sito

CREATE TABLE [dbo].[fluxes](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CO2_1] [float] NULL,
[H2O_1] [float] NULL,
[ZL_1] [float] NULL,
[Fc_1] [float] NULL,
[qcFc_1] [float] NULL,
[H_1] [float] NULL,
[..................]
[site] [int] NOT NULL,
[date] [smalldatetime] NOT NULL,
CONSTRAINT [PK_fluxes] PRIMARY KEY CLUSTERED
(
[site] ASC,
[date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Questa è la nuova tabella per le misure:

CREATE TABLE [dbo].[MyMeteo](
[id_meteo] [int] IDENTITY(1,1) NOT NULL,
[varid] [int] NOT NULL,
[siteid] [int] NOT NULL,
[date] [smalldatetime] NOT NULL,
[value] [float] NULL,

come detto, varid e siteid sono chiavi esterne.
Supponiamo che venga creata la variabile CO2_2; prima si mette nella tabella delle variabili, poi si deve aggiungere una colonna alla tabella fluxes. Invece, col secondo metodo, devo solo inserire l'id della nuova variabile e i dati relativi.
Il problema è la prestazione delle query: per quanto la prima impostazione sia 'contorta' e costringa ogni volta ad intervenire sulla struttura delle tabelle (o a crearne di nuove), le SELECT ... sono più veloci.
Eppure vorrei davvero sapere se ci può essere un'alternativa
Grazie
Diego
44 messaggi dal 15 dicembre 2006
ciao laura
scusa la pausa ma ero in viaggio di nozze...
dunque, tornando al problema: la select sulla tabella originale è molto semplice, qualcosa tipo:

SELECT CO2_1 FROM fluxes WHERE site=1 AND date >= '2001-01-01' AND date<='2002-01-01' (al limite, si aggiunge qualche clausola di ordinamento, oppure richiedere più variabili per lo stesso sito, o la stessa variabile per più siti)

Per l'altro modello, dato che nella tabella dei dati il riferimento alla variabile è la chiave esterna alla tabella delle variabili, la query sarà una cosa tipo:

SELECT value, Name FROM MyFluxes
LEFT JOIN On vars.ID=MyFluxes.varid
WHERE varid=1 AND site=1
AND date >= '2001-01-01' AND date<='2002-01-01'

grazie
diego

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.