2010-06-30 11 views
6

Trovo che sto usando molte query di join, soprattutto per ottenere statistiche sulle operazioni degli utenti dal mio database. Le query di questo tipo non sono rari:Unisciti alle query e quando è troppo

from io in db._Owners where io.tenantId == tenantId 
    join i in db._Instances on io.instanceId equals i.instanceId 
    join m in db._Machines on i.machineId equals m.machineId 
    select ... 

mia app non è ancora attivo, quindi non ho modo di giudicare se queste query saranno computazionalmente proibitivo nella vita reale. La mia query:

  1. C'è un limite a quando si fanno troppi "join" è troppo, e può essere descritto senza ottenere statistiche di funzionamento della vita reale?
  2. Quali sono le mie alternative? Ad esempio, è meglio creare solo tabelle aggiuntive per contenere le statistiche che sono aggiornate mentre vado, piuttosto che riunire diverse origini di tabelle ogni volta che voglio le statistiche?
+3

I join a tre vie non sono affatto insoliti. Le app del mondo reale possono diventare molto più grandi di così, facilmente. –

+1

Le risposte che state assumendo presuppongono che questi join vengano eseguiti all'interno di SQL. È importante quando si lavora con LinqToSql per verificare le query effettive inviate per assicurarsi di non aver inavvertitamente sollevato l'elaborazione sul client. – hemp

risposta

13

Se non si dispone di informazioni sulle prestazioni, non ottimizzare.

L'ottimizzazione prematura è la radice di tutto il male.

1) Non penso che raggiungerai mai il "limite". 2) Si chiama denomalizzazione, la denormalizzazione prematura è solo uno sforzo inutile se non si sa se esiste un problema.

Direi che la query sembra abbastanza normale.

0

1) C'è un limite a quando si fa troppi 'unisce' è troppo

No, il numero di join non è un problema, quanto la struttura dei dati all'interno di ogni tabella, presenza e uso di indici e cosa è necessario fare per ottenere dati.

I dati normalizzati sono comunemente un obiettivo primario nella progettazione di DB relazionali. Generalmente si considera la denormalizzazione come un mezzo per ottimizzare le query solo se necessario a causa dello sforzo aggiuntivo necessario per mantenere la coerenza dei dati.

Se si è veramente preoccupati, inserire il modello di dati ERD (tabelle database & in che modo si riferiscono) e il database che si sta utilizzando per il progetto (perché non tutti i database sono uguali).

+0

@Ponies: per curiosità, perché hai contrassegnato la tua risposta come wiki? –

+1

@Ken: In modo che potessi modificarlo, ovviamente! – hemp

+1

I pony lo sistemano; la canapa lo guida a casa. –

0

A meno che non si abbia un traffico molto elevato e che gli indici siano impostati correttamente, ecc., Non si dovrebbero avere problemi.

Per la segnalazione/analisi, alcune posizioni creeranno un data warehouse che nella sua forma più semplice è una copia [parzialmente] denormalizzata del database principale. Sono più facili da segnalare in quanto una tabella di solito contiene la maggior parte, se non tutti, i dati necessari in un report. Possono anche essere molto più veloci da leggere visto che non devi unirti così tanto. Tuttavia, richiederanno più spazio su disco (dati duplicati). Se le scritture sono consentite, saranno più lente (devono aggiornare tutti i dati duplicati) e avrai il problema di mantenere coerenti i dati duplicati.

In altre parole, a meno che non si stia solo facendo report (o accesso in sola lettura), mantieni i join.