Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Otsing andmebaasist erinevate parameetrite järgi märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 08.06.2014 03:51:48 Otsing andmebaasist erinevate parameetrite järgi vasta tsitaadiga

Meil on andmebaas erinevate hotellidega puhkusereisi broneerimiseks. Otsimise loogika on selline:

Otsime kuupäeva vahemiku ja tärnide järgi
Kui tagastati tühi tulemus, siis on kaks võimalust, kas ei olnud soovitud vahemikus sobivat hotelli, või ei olnud soovitud tärnidega hotelli.
Kui ei olnud soovitud vahemikus, siis peame ignoreerima lõpukuupäeva ja tagastama hotellid alguskuupäevast edasi
Kui ei olnud soovitud tärnidega hotelli, siis peame tagastama ühevõrra suurema ja ühevõrra väiksema tärnide arvuga hotelli.

Seega et kõik see ära katta, peaksime tegema järgnevad otsingud:

Tärnide ja kuupäeva vahemikuga
Tärnide +/- 1 ja kuupäeva vahemikuga
Tärnide ja ainult algus kuupäevaga
Tärnide +/- 1 ka ainult algus kuupäevaga.

Tundub et läheb pisut kulukaks seega peaks siin kuidagi optimeerima, aga endal on kuul veidi kokku jooksnud. Kas seda kõik saaks ehk kuidagi ühte päringusse pista ?

Baasiks on mysql.
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 08.06.2014 15:24:36 vasta tsitaadiga

Ühte päringusse saad need ju kokku panna näiteks exists alampäringut kasutades, aga tõenäoliselt ei saa asja nii oluliselt efektiivsemaks.
Teine võimalus on agregeerida ja üritada having osas üleliigsed read välja visata, tõenäoliselt on mõnevõrra efektiivsem kui exists, aga peab pisut rohkem nuputama, et asi õigesti tööle saada.
Kui jõudlus reaalselt probleemiks on, üritaks mina ehitada mingi indeks tabeli, mida broneerides trigger-ga uuendatakse(igasuguste jamade vältimiseks võiks selle indeks tabeli aeg-ajalt ka üle arvutada). Kui kuulud nende hulka, kes arvavad, et trigger on saatanast, siis võib seda indeks tabelit muidugi ka äriloogikas uuendada, aga sellega tekib tegelikult suurem risk, et tabel sünkroonist välja läheb.
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
ref
Kreisi kasutaja

liitunud: 10.08.2003




sõnum 09.06.2014 22:53:17 vasta tsitaadiga

Jah, kõike seda saab ühte suurde päringusse pista.

Kuna MySQLil puudub jätkuvalt CTE tugi, siis sul on kasutada peamiselt inline view aga ka temporary ja derived tabelid mida saab siis eelpool mainitud exists jupiga kokku panna.
Veidi sarnasel teemal on kirjutatud siin (üldiselt, CTE teema) - http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysql

Laias laastus - tekitad nt temp tabelid oma päringutele ja siis nt unioniga kokku tingimustega, mis välistavad laiendavad tulemused, kui kitsad on täidetud.
Sama saavutad ka inline view-dega (sisuliselt alampäringud), aga kuna neid vaja tõenäoliselt samal kujul mitmes kohas joinida tuleb SQL lohisev ning päris pikk.
Optimaalsuse kohapealt ei tohiks vahet olla, et kas on temp. tabeli või alampäringu pealt join - mootor peaks selle ikkagi tabelite peale taandama ning joinid reaalselt nende pealt tegema.

Üks variant on päringud ka paralleelselt käima lasta, ning kui kitsad päringud juba tulemusi annavad, need laiemad lisaotsingud ära canceldada (see sõltub nüüd rohkem sellest platvormist, millelt päringuid teed).

Muidugi, kui sa juba seda teinud ei ole, tasub profileerida ja mõõta kus kitsaskohad on, enne kui ennustama hakata ja kirvega optimeerimisele läheneda (võimalik, et ka andmemudeli muutmine, kui võimalik, aitab).
Kommentaarid: 17 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 15
tagasi üles
vaata kasutaja infot saada privaatsõnum
sigakoer
Kreisi kasutaja

liitunud: 23.01.2004




sõnum 10.06.2014 02:05:06 vasta tsitaadiga

Kogu seda loogikat pole mõtet ühte SQL lausesse suruda. Tee kõigepealt kuupäeva/tärnide päring; kui see tulemusi ei anna, siis lõdvema kuupäeva ja tärnidega päringud lisaks. Pole mõttekas äriloogikat kõike ühte ulmelisse SQLi sisse vägistada, mille tööpõhimõttest pärast keegi aru ei saa ja täiendada ei oska.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 10.06.2014 11:00:44 vasta tsitaadiga

"Kogu seda loogikat pole mõtet ühte SQL lausesse suruda. Tee kõigepealt kuupäeva/tärnide päring; kui see tulemusi ei anna, siis lõdvema kuupäeva ja tärnidega päringud lisaks. Pole mõttekas äriloogikat kõike ühte ulmelisse SQLi sisse vägistada, mille tööpõhimõttest pärast keegi aru ei saa ja täiendada ei oska. " ei saa kuidagi nõustuda. Üks päring on alati kordades kiirem kui neli/viis päringut. Võimalikult palju alati kõik ühte päringusse.

Vaata üle kõigepealt andme set, mille sa aluseks võtad. Proovi põhiandmed kätte saada ühe selectiga ja neid siis kasutada järgnevates. tundub, et tärnide järgse filtreeringu saad kätte ja see kehtib kõigi tingimuste suhtes (+-1) .
Võid ka tuimalt unioniga erinevad äriloogilised selectid kokku lükata. Põhiandmeseti tõmbad viewsse ja sealt kasutad neid edasi järgmistes päringutes. Lisa filtreeringu teed juba UI või madalam tasemel.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
connor
HV kasutaja

liitunud: 19.02.2003




sõnum 10.06.2014 15:13:00 vasta tsitaadiga

serk kirjutas:
"Kogu seda loogikat pole mõtet ühte SQL lausesse suruda. Tee kõigepealt kuupäeva/tärnide päring; kui see tulemusi ei anna, siis lõdvema kuupäeva ja tärnidega päringud lisaks. Pole mõttekas äriloogikat kõike ühte ulmelisse SQLi sisse vägistada, mille tööpõhimõttest pärast keegi aru ei saa ja täiendada ei oska. " ei saa kuidagi nõustuda. Üks päring on alati kordades kiirem kui neli/viis päringut. Võimalikult palju alati kõik ühte päringusse.
Loodan et ei satu kunagi koos töötama. [iroonia]Miks mitte teha kohe kõik vajalikud päringud baasist ära, näiteks suvalises veebirakenduses kui kasutaja sisse logib. Üks päring on ju kordades kiirem...[/iroonia]
Alati tuleb hinnata tehtavat costi. Päringut, mis need 4 päringut kokku võtab ja õiged tulemused tagastab, ei debugi keegi, ka ise mitte pärast 2 kuu möödumist. Küllalt nähtud "proffe" kelle tehtud p*ska ei söö keegi.

Mina võtaks ette ja hindaks.
1.Kui tihti päringut üleüldse tehakse ja kui kallid need on. Mingit paar korda tunnis ette tulevat päringut mis võib võtta ~100ms rohkem spetsiaalselt optimeerida on jaburus.
2.Kui esimene päring ei vasta, kui tõenäoline on et teine ei anna tulemust ehk kui tõenäoline oleks halvim variant - võibolla kõiki nelja päringut tehaksegi ainult aastas 1-2 päeval ja 1 päring annaks tulemuse kohe 330 päeval aastas.
3.Proovida teismoodi teha - teha näiteks koheselt kõige laiem päring ning filtreerida hiljem.
4.Ehitada cache või indekstabel nagu eespool viidatud.
Kommentaarid: 31 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 10.06.2014 17:30:42 vasta tsitaadiga

Kindlasti ei ole pikka töösuhet mehega, kes näeb lahendusena erinevaid päringuid normaalse lahendusena- ei ole iroonia, seega kokku me töötama ei satu.

1 kasutaja puhul tehakse 4 päringut baasi
2 kasutaja puhul tehakse 8 päringut baasi
3 kasutaja puhul tehakse 12 päringut baasi
15 kasutaja puhul tehakse 60 päringut baasi

Normaalses booking süsteemis on korraga sadu kasutajaid sageli. Ja see on ainult üks baasiga suhtlemise osa. Ehitades kogu rakenduse sellises stiilis, on lõpptulemus juba eos teada.

Arhitektuurselt täiesti arulage lahendus. Pole olemas ühtegi päringut, mis ei ole loetav või debuggitav. Nagu iga java või php kood, on ka päringud vägagi debuggitavad.

Kasutades ühte main selecti andmete toomiseks, hakkab baas seda by default ühel hetkel cachima, võid ka forcida seda. Erinevate päringute puhul tekitad sa mõttetult palju IOd ja varem või hiljem maksab see kätte.
Kui me räägime mingist kodukootud eksperimentaalsest jupist, siis jumala savi kuidas sa selle probleemi lahendad. Kui ehitatad suuremat ja jätkusuutliku süsteemi, siis päringute arvu peale pead kohe alguses mõtlema hakkama.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 10.06.2014 21:01:32 vasta tsitaadiga

Enamasti on kasutajal serk õigus. Aga on ka erandeid. Näiteks ühes 4. põlvkonna keeles oli aruanne, mis kasutas päringut select a,b,c from a inner join b ....
Midagi müstiliselt keerukat selles päringus polnud ja indeksid olid ka olemas. Aga andmeid oli palju ja päring oli aeglane. Lahenduseks oli select a,b,c from a ja resultseti loopides sai iga rea kohta tabelist b päring tehtud. Tundub ebaloogiline, aga asja sai oluliselt kiiremaks. Igaks juhuks olgu täpsustuseks öeldud, et kõik toimus sünkroonselt ehk pärast ei lastud mitut päringut paralleelselt tabeli b pihta käima.
Põhjus miks kiiremaks sai oli see, et tabeleid puhverdati, aga kui mitmest tabelist päring teha, siis ei olnud puhvrist kasu.
Minu jutu point on selles, et alati peab arvestama ka konkreetse keskkonna ja vahendi iseärasustega ja mõnel juhul võib ka pealtnäha jabur lahendus parimaks osutuda.

Natuke OT aga mitte päris kontekstist välja. Serk, kui juba baasidest nii palju jagad, oskad ehk öelda kas tänapäevased baasimootorid optimeerivad asju paremini, kui teha sellest mölakast päringust view mitte kupatada otse baasi poole? Minu jaoks on see küsimus rohkem üldharivas mõttes, hetkel ma ühelegi konkreetsele probleemile lahendust ei otsi icon_smile.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 11.06.2014 17:46:31 vasta tsitaadiga

connor kirjutas:
serk kirjutas:
"Kogu seda loogikat pole mõtet ühte SQL lausesse suruda. Tee kõigepealt kuupäeva/tärnide päring; kui see tulemusi ei anna, siis lõdvema kuupäeva ja tärnidega päringud lisaks. Pole mõttekas äriloogikat kõike ühte ulmelisse SQLi sisse vägistada, mille tööpõhimõttest pärast keegi aru ei saa ja täiendada ei oska. " ei saa kuidagi nõustuda. Üks päring on alati kordades kiirem kui neli/viis päringut. Võimalikult palju alati kõik ühte päringusse.
Loodan et ei satu kunagi koos töötama. [iroonia]Miks mitte teha kohe kõik vajalikud päringud baasist ära, näiteks suvalises veebirakenduses kui kasutaja sisse logib. Üks päring on ju kordades kiirem...[/iroonia]
Alati tuleb hinnata tehtavat costi. Päringut, mis need 4 päringut kokku võtab ja õiged tulemused tagastab, ei debugi keegi, ka ise mitte pärast 2 kuu möödumist. Küllalt nähtud "proffe" kelle tehtud p*ska ei söö keegi.

Mina võtaks ette ja hindaks.
1.Kui tihti päringut üleüldse tehakse ja kui kallid need on. Mingit paar korda tunnis ette tulevat päringut mis võib võtta ~100ms rohkem spetsiaalselt optimeerida on jaburus.
2.Kui esimene päring ei vasta, kui tõenäoline on et teine ei anna tulemust ehk kui tõenäoline oleks halvim variant - võibolla kõiki nelja päringut tehaksegi ainult aastas 1-2 päeval ja 1 päring annaks tulemuse kohe 330 päeval aastas.
3.Proovida teismoodi teha - teha näiteks koheselt kõige laiem päring ning filtreerida hiljem.
4.Ehitada cache või indekstabel nagu eespool viidatud.


Täiesti nõus, ainult baasi piires kõik vajalik ära toimetada tuleb enamasti odavam. Aga tänud ideid genereerimast eks ma mõtlen nende pakutud valikute peale.
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
wiinanina
HV kasutaja

liitunud: 27.02.2003




sõnum 11.06.2014 19:08:54 vasta tsitaadiga

Kas t6esti on mysql selline 6nnetu andmebaas, kus puduvad protseduurid??? Annad parameetrid ette ja saad vastuse. Protseduuri sees juba otsustad, kui palju, mis tabelitest ja missugusi päringuid teed.
Endal seni kogemusi mssql ja oracle basidega ning nii eluv66ras kogu seda threadi lugeda.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 11.06.2014 21:51:21 vasta tsitaadiga

wiinanina, miks küsida, kui ei vaata ise? On olemas täitsa protseduurid alates 5.0 versioonist.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
wiinanina
HV kasutaja

liitunud: 27.02.2003




sõnum 11.06.2014 23:39:47 vasta tsitaadiga

mikk36 kirjutas:
wiinanina, miks küsida, kui ei vaata ise? On olemas täitsa protseduurid alates 5.0 versioonist.


Siis minu soovitus on need päringuparameetrid anda protseduuri sisendisse ja protseduuri väljundiks genereerida vastus, mis teeb minimaalse vajaliku hulga päringuid baasist.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Otsing andmebaasist erinevate parameetrite järgi
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.