Natrag   Forum.hr > Informatička tehnologija > Za napredne korisnike > Programiranje

Programiranje Za programere i one koji to žele postati ...

Odgovor
 
Tematski alati Opcije prikaza
Old 21.07.2016., 13:42   #1
index ili tablica za situaciju

Pozdrav,

imamo recimo tablicu "oglas" koja ima veliki broj unosa. Recimo 1 000 000+
I sada želimo recimo cca 10 oglasa iz te tablice posebno označiti. Recimo da ih želimo definirati kao "crveni_oglasi"

Znači broj crvenih oglasa je jako mali spram ukupnog broja oglasa. A među svim oglasima nema zelenih, plavih ..itd. nego samo "crveni" ili ništa.

Dali je logično dodati polje "crveni" u tablicu, koje može poprimiti vrijednost 1 ili 0. I to polje bi trebalo onda indeksirati..

Ili je logičnije napraviti tablicu crveni_oglasi, pa u nju trpati ID-ove oglasa koje želimo deklaritati kao crvene.


S jedne strane razmišljam da index nema smisla jer čemu indeksirati 1 000 000+ oglasa , radi samo 10 oglasa koje želimo označiti crvenima.

S druge strane možda zbog male kardinalnosti indeksa (1 | 0) ... taj index zapravo nije skup?? ..a pri čitanju pomaže ekvivalentno kao posebna tablica? U tom slučaju bi ipak index bio praktičniji...
bozoou is offline  
Odgovori s citatom
Old 21.07.2016., 14:02   #2
Ovisno o frekventnosti korištenja, tako se barem meni čini. Ako bi se često čitalo crvene onda svakako tablica, u slučaju da se to događa jako rijetko onda je bit polje dovoljno.
__________________
Ne očajavamo, zato što se ne nadamo nikom. Ničemu dobrom, ničemu lošem tu ne nada se niko.
I sa tom diplomom, i sa šljakom sam se slik’o. Rintao k'o magarac, sve dok nisam rikn'o.
mr-crime is offline  
Odgovori s citatom
Old 21.07.2016., 14:45   #3
Ah, dileme database modeliranja, dobra tema

One-to-one relationship je obično indikacija da nešto ne štima. Ili je dizajner nešto krivo shvatio ili nešto ne štima sa domenom. Opcija B su razni performance razlozi (više o tome ovdje). Kad bi izdvojio te crvene u zasebnu tablicu imao bi optional one-to-one relationship sa glavnom tablicom.

Ja bi osobno izabrao indeks. Ali pazi kako ćeš popunjavati tu kolonu o kojoj pričaš. S obzirom da imaš +1.000.000 redova. Ako ćeš stavljati u svako polje 0 ili 1, onda će se sve non-NULL vrijednosti indeksirati. To je dosta redova. Rađe onda ostavi sve redove prazne osim onih u kojima će biti 1. Tako ćeš samo njih nekoliko indeksirati.

Disclaimer: pričam o Oracle bazi. Možda tvoja baza ima drugi pristup indeksiranju NULL vrijednosti. Ako ima, napiši malo o tome, baš me interesira kako je izvedeno.
paprat984 is offline  
Odgovori s citatom
Old 21.07.2016., 16:47   #4
Particioniraj tablicu.

Oracle dokumentacija veli

Quote:
Partitioning enhances the performance, manageability, and availability of a wide variety of applications and helps reduce the total cost of ownership for storing large amounts of data. Partitioning allows tables, indexes, and index-organized tables to be subdivided into smaller pieces, enabling these database objects to be managed and accessed at a finer level of granularity.
__________________
Ako krades, kradi pomalo i sigurno.
Ministar obrane Seva, 2012
logit is offline  
Odgovori s citatom
Old 21.07.2016., 20:45   #5
U ovakvim slučajevima se koriste parcijalni indeksi:

Npr. za PostgreSQL
Kod:
CREATE INDEX idx_crveni_oglasi ON oglasi(crveni)
    WHERE crveni is true;
https://www.postgresql.org/docs/9.5/...s-partial.html

Svaki indeks je skup ako se ne koristi...
__________________
Ne to!
Florest Glimp is offline  
Odgovori s citatom
Old 21.07.2016., 20:49   #6
Quote:
logit kaže: Pogledaj post
Particioniraj tablicu.
Pariticioniranje je nepotrebni overhead za ovu situaciju.
__________________
Ne to!
Florest Glimp is offline  
Odgovori s citatom
Old 21.07.2016., 21:43   #7
Quote:
S obzirom da imaš +1.000.000 redova. Ako ćeš stavljati u svako polje 0 ili 1, onda će se sve non-NULL vrijednosti indeksirati. To je dosta redova. Rađe onda ostavi sve redove prazne osim onih u kojima će biti 1.
To možda Oracle tako radi, ali što ako se npr. radi o MySQL bazi?
__________________
Ne to!
Florest Glimp is offline  
Odgovori s citatom
Old 22.07.2016., 14:03   #8
Quote:
Florest Glimp kaže: Pogledaj post
To možda Oracle tako radi, ali što ako se npr. radi o MySQL bazi?
A onda mu nema pomoći od mojeg posta. Imaš disclaimer dolje.
paprat984 is offline  
Odgovori s citatom
Old 22.07.2016., 14:05   #9
Quote:
logit kaže: Pogledaj post
Particioniraj tablicu.
Slažem se za Florestom ovdje.

Particija 1: 999.990 redova
Particija 2: 10 redova.

Neka ideja sa particijama je da se velika tablica rastavi na više manjih, ne da se velika tablica rastavi na veliku i minijaturnu tablicu.
paprat984 is offline  
Odgovori s citatom
Old 22.07.2016., 14:42   #10
Quote:
paprat984 kaže: Pogledaj post
A onda mu nema pomoći od mojeg posta. Imaš disclaimer dolje.
Nema mu pomoći ni od mojega ako se radi o MySQL bazi, jer MySQL nema parcijalnih indeksa.
__________________
Ne to!
Florest Glimp is offline  
Odgovori s citatom
Old 24.07.2016., 00:20   #11
Da, radi se o mySql bazi.

Ako nema ničeg sličnog ko parcijalni indexi, onda po ovome što vidim, nebi bio čudan pristup da se za takve neke sekcije odabere posebna tablica i u nju potrpaju željeni ID-ovi.
bozoou is offline  
Odgovori s citatom
Old 25.07.2016., 18:30   #12
Čudnost ovisi o situaciji, nije po knjizi ali tvoj posao je da učiniš sve što možeš kako bi ta baza bila sigurna i brza. Kako ćeš to napraviti, tvoj je problem.
__________________
Ne očajavamo, zato što se ne nadamo nikom. Ničemu dobrom, ničemu lošem tu ne nada se niko.
I sa tom diplomom, i sa šljakom sam se slik’o. Rintao k'o magarac, sve dok nisam rikn'o.
mr-crime is offline  
Odgovori s citatom
Old 25.07.2016., 21:18   #13
Kad god kreneš u izradu malo ozbilnije aplikacije sa nekom kompleksnijom logikom od običnog CMS-a, tipom podatka (spatial) u bazi ili na izlazu (JSON), mogućnošću autenticiranja korisnika na nekom backendu kao što je LDAP, AD ili pak mogućnosti kreiranja stora bez frustracija, MySQL je pain in the ass. PostgreSQL je super alternativa i za Oracle i za MSSQL, i nije mi jasno zašto se ne koristi češće. Minimalni peformance gain, koji je neusporediv u odnosu na situaciju pred 10 godina, nije vrijedan u usporedbi sa svim tim mogućnostima koje ima PostgreSQL. Ja kad gledam neki poslovni proces koji bi pokrio sa open source softverom, a koristi relacijsku bazu, ako u backendu nema PostgreSQL kao opciju zaobilazim u širokom luku.
__________________
Ne to!
Florest Glimp is offline  
Odgovori s citatom
Old 30.08.2016., 15:34   #14
Uz sve mudre odgovore gore, zapravo nitko nije pitao kako se sustav koristi i koji mu je hardverski kapacitet, koliko ima insertova na toj tablici, itd... Npr.

* Use case #1: Ne fali ti RAM-a
Indeksiras element i zaboravis

* Use case #2: Fali ti rama, imas stotinjak tisuca upita prema bazi dnevno ili manje
Jednostavno ne indeksiras taj element ak je presporo kupis jos rama.

* Use case #3: Imas preko 500M upita per machine dnevno koji bi mogli zavrsiti na bazi
Koristis neki pametni key-value cache servis poput npr. redisa koji cuci prije upita na bazu i cuva je da ne izgori

I nemoj zaboraviti da read queriji nisu nikad skupi, indeksi "kostaju" samo rama. Pitanje je koliko imas insert statementa nad tom bazom koji bi ti mogli klat insertanje indeksa.

Uzivaj

I.

P.S.
Milijun rekorda je takva sica po pitanju bilo koje baze da uopce ne kuzim cemo overinzinjirati stvari Kad dodjes neke finije brojke od recimo 20-30M rekorda gledaj kako splitat tablicu prema nekom drugom parametru koji ti nece razbijati tablice u omjeru 99.9% - 0.1%
igorl is offline  
Odgovori s citatom
Old 31.08.2016., 07:48   #15
Quote:
igorl kaže: Pogledaj post
I nemoj zaboraviti da read queriji nisu nikad skupi, indeksi "kostaju" samo rama. Pitanje je koliko imas insert statementa nad tom bazom koji bi ti mogli klat insertanje indeksa.
Ovo je netočno. Nasuprot tome i da je samo reporting baza, ako se indeks metne na polje koje nije dovoljno selektivno kod SELECT-a query optimizer može odabrati index scan koji ima random access pattern pristupu disku, pa onda čitati ponovno tabelu - također random access. I da su svi podaci u cache-u to će biti dvostruko sporije od sekvencijalnog scan-a na cijelu tabelu. Loš index je uvijek skup. I ako fali RAM-a na selektivnom polju je indeks uvijek ispravan odabir, a pogotovo ako je puno upita i ako je tabela velika.

Ovo je jedan od gorih savjeta u povijesti foruma.hr - da ukoliko se ima malo RAM-a da se ne treba indeksirati. Bože oslobodi. Polje koje je dovoljno selektivno a koristi se u upitu uvijek treba indeksirati, a pogotovo ako ima malo RAM-a i ako su tabele izrazito velike, jer u tom slučaju možemo očekivati da nije čitava baza u RAM-u i da će doći od intenzivnog čitanja sa diska. Indeksi koštaju i diska jer ne što im treba prostora, nego se trebaju čitati sa diska.

Da - baza radi bolje ako se stavi više RAM-a i brži diskovi ali ispravna (engineering) rješenja se moraju raditi uvijek, a ne samo kada smo u stisci sa resursima.

P.S. Indeksi se ažuriraju i kod UPDATE-a i DELETE-a...
__________________
Ne to!

Zadnje uređivanje Florest Glimp : 31.08.2016. at 08:05.
Florest Glimp is offline  
Odgovori s citatom
Old 30.10.2016., 20:40   #16
Nova tablica i nemaš se šta mislit. Veza 1:1 je loša ako imaš dvije jednakobrojne tablice, npr jednu s osnovnim podacima, drugu za detalje.
A ovdje ćeš još imat i uštedu memorije šta nećeš uvoditi dodatnu kolonu koja će u 99.99% redaka imat identičnu vrijednost
IllegalArgument is offline  
Odgovori s citatom
Odgovor



Kreni na podforum




Sva vremena su GMT +2. Trenutno vrijeme je: 16:46.