Domanda

Sto lavorando con una squadra che sta cercando di implementare un sistema EAV. Hanno deciso di dividere le tabelle attributo-valore per tipologia e stanno dibattendo utilizzando tabelle differenti per differenti intervalli di dimensioni di varchar.

EX:

  • Table_1 - fino a varchar (10)
  • table_2 - varchar (11) a VARCHAR (500)
  • table_3 - varchar (501) a VARCHAR (MAX)

Ho sempre avuto l'impressione che varchar è stato solo andando a utilizzare la dimensione che aveva bisogno.

Sai se questo sta per avere tutti i guadagni in termini di prestazioni e sarebbe il caso di un extra di codifica / logica che sarebbe necessaria?

È stato utile?

Soluzione

Il mio istinto dice che qualsiasi guadagno di prestazione che si ottiene è improbabile che sia valga la pena extra (e il potenziale per i bug) derivante dalla necessità di far rispettare la separazione e eseguire più ricerche nella vostra logica dell'applicazione.

Se si dispone di un sacco di piccoli valori e sono stati solo di loro e l'interrogazione non di tutto il resto si dovrebbe vedere un po 'di guadagno di prestazioni come più righe si adatterebbe in ogni pagina in modo complessiva dovranno essere trattati in RAM o leggere dal disco per una determinata query meno pagine. Non appena avete bisogno di tutte le proprietà in una sola volta (o solo un mix) questo vantaggio sta per essere spazzato fuori dall'acqua da una necessità di di query più tabelle separatamente o tramite un sindacato.

L'unico modo per essere sicuri, naturalmente, è quello di mettere su un grande insieme di dati ragionevolmente realistico ed eseguire alcuni test di performance contro gli accordi che si stanno prendendo in considerazione. Ma io dubito molto si vedrà alcun cambiamento vale la complessità supplementare. Se voi i dati possono essere divisi in modi più logici (cioè modi impliciti la logica di business) di quanto io suggerisco di guardare il partizionamento dei dati, in particolare se è possibile dividere le partizioni su dischi diversi. Ogni volta che vi trovate a contemplare un'ottimizzazione carico potenzialmente complessità (compreso il partizionamento) andare sempre indietro e riconsiderare la struttura complessiva dei dati e assicurarsi che non sta lavorando contro la logica di business e di controllare il vostro hardware è sufficiente per il carico che ci si aspetta - mentre non è garantito si rischia di trovare molto più significativo guadagni attraverso cercando in queste aree principali, invece.

Altri suggerimenti

Non avrete guadagni in termini di prestazioni a tutti.

pensieri rapidi, non è affatto un'analisi esaustiva:

  • Ad un certo punto dovrete UNION questi per ottenere una visione unica e quindi tutto diventa varchar (max)
  • Come si fa a decidere la lunghezza in anticipo?
  • di indicizzazione per la ricerca dei valori? Non è possibile indicizzare> 900 byte
  • posizionare il proprio vincoli "unici" in un EAV sarebbe già abbastanza grave, senza suddiviso su più tabelle

EAV contro modello : ci sono diversi articoli su come evitare di EAV

Sembra che stanno cercando di ottimizzare l'EAV per le ricerche. Tuttavia, questo suona chiaramente come non stanno cercando di ottimizzare un sistema di profilati per carenze, ma invece stanno cercando di ottimizzare tramite congetture voodoo.

Ricorda loro che la prima regola di ottimizzazione è profilazione, così come David Spillett detto, fino a quando si dispone di un paio di centinaia di milioni di righe nel EAV (considerando maggior parte delle entità che conosco sono almeno 15 attributi en-toto in modo che solo si farebbe arriva come un paio di decine di milioni di soggetti) e poi profilo non si può sapere che questo avrà alcun impatto.

Vado con "No, questo non andrà a beneficio, come pensano che si" e che il partizionamento migliore sarebbe probabilmente qualcosa dell'ordine di 50 caratteri e 100 caratteri, piuttosto che 10 e 500. Ma questo è solo un indovinare.


Ma notate che avrà l'effetto che vogliono in che consentirà una migliore performance dell'indice (tutto il partizionamento dei dati dovrebbe dare una migliore prestazioni di indicizzazione sopra non partizionamento come regola generale)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top