Hirdetés

2024. május 2., csütörtök

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  SQL kérdések (kiemelt téma)

Hozzászólások

(#4601) tm5 válasza bambano (#4600) üzenetére


tm5
tag

Ez teljesen igaz és azt volt az első dolgom, hogy körbenézzek a cégnél, hogy milyen "dobozos" system monitoring cuccok vannak már beüzemelve(Grafana, ELK, stb.) , hogy ne az n+1-et telepítsem. Viszont egyik sem arra lett kitalálva, hogy azt monitorozza amit nekem kell.
Egy tesztelő kolléga már össze is rakott valamit regression teszt gyanánt pythonban.
Na ez megtetszett nekem és én is lejutottam oda, hogy akarok csinálni egy dashboardot a cuccaimnak. Na ebből lett az idei smart goal-om. Ha multinál dolgozol akkor érted, hogy mire gondolok. :)
Igen, DIY lesz, de mértékkel, mert az üzleti logikára akarok fókuszálni és nem az infrastruktúrára. De néha össze kell koszolni a kezünket, ha tanulni akarunk.

(#4602) martonx válasza Louro (#4597) üzenetére


martonx
veterán

Kismillió statisztikai függvény van, ami nincs SQL-ben, hogy messzire ne is menjünk: medián
SQL tök jó meg minden adat lekérdezéshez, de mihelyst picit is magasabb szintű elemzés kell, arra az SQL totál alkalmatlan.

Én kérek elnézést!

(#4603) bambano válasza martonx (#4602) üzenetére


bambano
titán

postgresql-ben egyszerűen lehet mediánt számolni.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#4604) martonx válasza bambano (#4603) üzenetére


martonx
veterán

hja, most nézem MSSQL is tud, a 2017-es verzió óta, csak valami fura okból PERCENTILE_DISC-nek hívják. Mindenesetre csak egy példát akartam hozni, hogy az SQL analitikus függvényei erősen korlátosak, próbálj meg ilyen-olyan eloszlásokat számolni velük, vonalakat illeszteni, azok meredekségét figyelni stb...

Én kérek elnézést!

(#4605) Louro válasza martonx (#4604) üzenetére


Louro
őstag

Emlékeim szerint Oracle-ben volt medián, de értem mire akarsz utalni és köszönöm!

Végülis rengeteg beimportálható forrás áll rendelkezésre Py-ban, míg SQL-ben a szoftver készletéből kell gazdálkodni, ami nem bővül túl sűrűn.

Mess with the best / Die like the rest

(#4606) martonx válasza Louro (#4605) üzenetére


martonx
veterán

Ha megnézed, hogy ez mit tud: https://pandas.pydata.org/ vs ehhez képest az SQL mit tud, akkor nincs mit tovább magyarázni. 1-2 sor kóddal tudsz trend vonalakat illeszteni adat pontokra, ezt vizualizálni stb...

Én kérek elnézést!

(#4607) bambano válasza martonx (#4606) üzenetére


bambano
titán

egyetértek, nincs mit magyarázni, a postgresql legalább annyit vagy többet tud, mint ez a pandas. mondjuk ez így csak a statisztikai funkciókra igaz, mert ha melléteszed például a geometriai funkcióit is, akkor a python a fasorban sincs a postgresql-hez képest.

az utóbbi időben az a vélemény alakult ki bennem a postgresql-ről, hogy a legjobb, ha hagyod az adatbáziskezelőt dolgozni.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#4608) martonx válasza bambano (#4607) üzenetére


martonx
veterán

Viszont nem csak postgresql van a világon (ami egyébként tényleg nem rossz). Data Science-ként sokszor nem is igazi sql-ből jönnek az adatok (lehet nosql, vagy data lake vagy bármi), azaz kell egy nyelv az sql-en kívül, amivel egységesen meg lehet valósítani a statisztikákat, elemzéseket.

Én kérek elnézést!

(#4609) Louro


Louro
őstag

Kicsit olyan ez, hogy mindkettő jó a feladatok nagy részére (, gondolok itt arra, hogy a rollup-ra pl. egy kezemen meg tudom számolni, hogy mennyiszer volt szükségem). De pl. a senior analyst kollégával nem bírom megérttetni, hogy miért felesleges Excel-ben pivotálni, miért nem bízza az erősebb SQL szerverre. Persze elbírja az Excel, csak kicsit lassabb és a felhasználói élmény csorbul.

Úgy látom bőven van mit tanulnom még. De ez jó, mert izgalmas terület :)

[ Szerkesztve ]

Mess with the best / Die like the rest

(#4610) OldBoyDev


OldBoyDev
újonc

Sziasztok, segítséget szeretnék kérni:

Van két táblám:

Project tábla
projectID
projectName

ProjectCost tábla
projectID
costCategory
cost

Hogy tudok ebből egy olyan lekérdezést készíteni, ahol a project neve mellett felsorolásra kerülnek (külön oszlopokban) a kategóriánkénti költségek.



Fontos, hogy egy projecthez több azonos kategóriájú költség sor is tartozhat, ezek összegének kéne szerepelni a lekérdezésben.

(#4611) Louro válasza OldBoyDev (#4610) üzenetére


Louro
őstag

SELECT 
    Project.ProjectName AS 'Project Name',
    cost.CostCategory1 AS 'Cost category1',
    cost.CostCategory2 AS 'Cost category2'
FROM Project
INNER JOIN ProjectCost
    ON Project.projectID = ProjectCost.projectID

Ha egy projektnek több költsége is lehet, akkor....
SELECT 
    Project.ProjectName AS 'Project Name',
    SUM(cost.CostCategory1) AS 'Cost category1',
    SUM(cost.CostCategory2) AS 'Cost category2'
FROM Project
INNER JOIN ProjectCost
    ON Project.projectID = ProjectCost.projectID
GROUP BY
    Project.ProjectName

[ Szerkesztve ]

Mess with the best / Die like the rest

(#4612) nyunyu válasza OldBoyDev (#4610) üzenetére


nyunyu
félisten

Sorok oszlopokká forgatásához a PIVOT függvény kell, de azt nem minden DB kezelő ismeri.

Szintaxisa valahogy így néz ki:

SELECT p.projectName, pc.costCategory, pc.cost
FROM Project p
LEFT JOIN ProjectCost pc
ON pc.projectID=p.projectID
PIVOT(
SUM(pc.cost) sum
FOR(pc.costCategory)
IN('Cost category1', 'Cost category2', 'Cost category3', 'Cost category4')
)
ORDER BY p.projectName;

Gyakorlatilag a FOR-nál megadott costCategory mező értékkészletét válogatja szét, és csinál belőlük új oszlopokat az IN-nél megadott sorrendben, és ezekbe az oszlopokba teszi a FOR előtti oszlopfüggvény értékét.

PIVOT()-on belül sehol nem említett oszlopok (projectName) pedig maradnak úgy ahogy van.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4613) nyunyu válasza Louro (#4611) üzenetére


nyunyu
félisten

Ez így nem jó, mivel ő az egyes costCategory alá tartozó tételek összegét külön-külön oszlopban szeretné látni.

Meg lehet csinálni PIVOT() nélkül is, oszloponként külön JOINnal:
SELECT p.projectName 'Project Name',
SUM(pc1.cost) 'Cost category1',
SUM(pc2.cost) 'Cost category2',
SUM(pc3.cost) 'Cost category3',
SUM(pc4.cost) 'Cost category4'
FROM Project p
LEFT JOIN ProjectCost pc1
ON pc1.projectID=p.projectID
AND pc1.costCategory='Cost category1'
LEFT JOIN ProjectCost pc2
ON pc2.projectID=p.projectID
AND pc2.costCategory='Cost category2'
LEFT JOIN ProjectCost pc3
ON pc3.projectID=p.projectID
AND pc3.costCategory='Cost category3'
LEFT JOIN ProjectCost pc4
ON pc4.projectID=p.projectID
AND pc4.costCategory='Cost category4'
GROUP BY p.projectName
ORDER BY p.projectName;

Itt az egyes JOINoknál szűröm a costCategory értékét, hogy az adott oszlopban melyik értékhez tartozó tételek látszanak (amiket aztán szummázunk).

PIVOT()-tal rövidebben, tömörebben lehet ugyanezt megcsinálni, viszont a mit írjak a FOR és IN részekhez megértése elsőre nehéz lehet.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4614) nyunyu válasza nyunyu (#4613) üzenetére


nyunyu
félisten

Közben találtam egy másik megoldást, ami nem a JOINnál szűr, hanem CASE WHEN-ekkel pakolja külön oszlopokba az egyes tételeket:

SELECT p.projectName 'Project Name',
SUM(CASE WHEN pc.costCategory='Cost category1' THEN pc.cost ELSE 0 END) 'Cost category1',
SUM(CASE WHEN pc.costCategory='Cost category2' THEN pc.cost ELSE 0 END) 'Cost category2',
SUM(CASE WHEN pc.costCategory='Cost category3' THEN pc.cost ELSE 0 END) 'Cost category3',
SUM(CASE WHEN pc.costCategory='Cost category4' THEN pc.cost ELSE 0 END) 'Cost category4'
FROM Project p
LEFT JOIN ProjectCost pc
ON pc.projectID=p.projectID
GROUP BY p.projectName
ORDER BY p.projectName;

De ez sem sokkal olvashatóbb :DDD

Jut eszembe, hasonló példával szívatott a mostani főnököm 3 éve állásinterjún.
Aztán nemsokkal később belebotlottam kolléga kódjába, ami 10 attribútum nevét és értékét feszíti ki egy termék sorra ugyanígy :))
Azóta sem mertem átírni PIVOTra.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4615) Ispy válasza nyunyu (#4614) üzenetére


Ispy
veterán

Én így szoktam, csak annyi, hogy általában egy tárolt eljárásban, ezért az első select csak kategóriákat adja vissza értékkel, a második meg oszlopokba rendezi summal. Így egy fokkal olvashatóbb.

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#4616) OldBoyDev


OldBoyDev
újonc

Nagyon köszönöm a segítséget. A PIVOT()-os megoldást választottam.
Még egyszer köszönöm!

(#4617) kw3v865


kw3v865
senior tag

Üdv!

PostgreSQL 10-ben egy függvényt írok, melyben szeretnék létrehozni egy view-t. A problémám az, hogy nem tudok a view létrehozásakor változót használni.
Tehát példuál a WHERE feltételnél: a "x BETWEEN valtozo1 AND valtozo2" rész problémás. Azt írja hibaként, hogy column "valtozo1" does not exist. Ha a select ugyanez, de nem view-t hozok létre, hanem táblát, akkor tökéletesen működik.

Van erre valami megoldás? Vagy tényleg nem lehet PostgreSQL függvényben lévő VIEW létrehozásakor változóra hivatkozni?

(#4618) nyunyu válasza kw3v865 (#4617) üzenetére


nyunyu
félisten

Ha az a cél, hogy egy külső alkalmazás paraméterezetten hívjon egy eljárást/függvényt, akkor nem tudod refcursorral visszaadni a szűrt halmazt?

Legalábbis mi Oracle 11g alapon így szoktuk visszaadni az adatokat:
procedure get_order_status(p_group_id number, p_posting_id number, p_id number, p_order_num varchar2, c out sys_refcursor) is
begin
open c for
select
i.group_id,
i.posting_id,
i.id,
i.order_num,
o.status as status,
to_char(o.status_dt,'yyyy-mm-dd hh24:mi:ss') as status_ts
from input i
left join s_order o
on o.order_num= i.order_num
where i.id = p_id
or i.group_id = p_group_id
or i.posting_id = p_posting_id
or i.order_num = p_order_num;
end;

Aztán Javaban fetchelik a kurzort.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4619) bambano válasza kw3v865 (#4617) üzenetére


bambano
titán

execute?

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#4620) Louro válasza nyunyu (#4618) üzenetére


Louro
őstag

Látom te is hasonló módon tördeled a kódjaid....annyira hiányzik az SQL nyelvre egy clean code iránymutatás :)

Kollégák, amikor egy sorba behánynak mindent, attól a falra tudnék mászni.

Mess with the best / Die like the rest

(#4621) nyunyu válasza Louro (#4620) üzenetére


nyunyu
félisten

Pár éve az egyik mobilszolgáltató adattárházának betöltő jobjait kellett géppel feldolgoznom, ott láttam mindenféle cifra tördelést, meg extrém szintaxist a huszonéve toldozott kódban.*

Mostani melóhelyen is látom a kollégák kódolási stílusa közti különbségeket:
- kulcsszavak kis vagy nagybetűvel (select vs SELECT)
- hány szóközt használ behúzásra 2? 3?
- egy oszlopba rendezi-e a mezőneveket, aliasokat, kommenteket, vagy ahogy esik, úgy puffan
- hova teszi a vesszőt felsorolásnál:
a,
b

vagy
a
, b

(utóbbit nem szeretem, mert ronda, de könnyebb --szal kikommentezni, ha nem kell a második sor!)
- használ-e vessző után szóközt
- használ-e az egyenlőségjel, kacsacsőr körül szóközt (a=b vs a = b)
- van aki minden WHERE alatti sorba 1=2 AND-ot ír (így nem tud véletlenül elindítva lefutni a kód), aztán ha véglegessé vált a query, csak akkor kommentezi vagy törli ki.

Nekem mindegy, amíg legalább annyira tördelve van, hogy el lehessen olvasni.

*: UPDATE a SET mezo=b.mezo2 WHERE a.id=b.id; megfejtését kérném OLVASHATÓAN, SQL:2003 szintaxissal leírni a válaszokban. :))

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4622) whYz


whYz
addikt

Sziasztok

Van egy tablam par VIRTUAL GENERATED oszloppal. Amikor mysqldump-al csinalok egy backupot akkor ezeknek az oszlopoknak az erteke is belekerul a backupba. Amikor probalom visszaallitani a backupot akkor viszont errort dob a mysql szerver, mivel virtual oszlopba nem lehet insertelni. Mi lehet a megoldas? A szerver verzio 5.7.18.

[ Szerkesztve ]

(#4623) nyunyu válasza whYz (#4622) üzenetére


nyunyu
félisten

MySQL upgrade?

Általad említett bugot elvileg javították az 5.7.9-ben, de ezek szerint a Ti verziótokban sem jó.

Ki kéne próbálni egy jóval újabb MySQL verzióval, hogy annak a dumpja kihagyja-e a virtuális mezőket az insertek generálásakor.

Hello IT! Have you tried turning it off and on again?

(#4624) whYz válasza nyunyu (#4623) üzenetére


whYz
addikt

Ja ugy olvastam, hogy 5.7.9 utani verziokban visszajott ez a bug, downgradelni meg nem szeretnek. Vegul ugy dontottem regex-el kiszedem a backupbol a dolgokat. Nem a legjobb megoldas, de mukodik...

(#4625) martonx válasza whYz (#4624) üzenetére


martonx
veterán

Az megvan, hogy a MySql amúgy 8.0.X-nél tart? :D

Én kérek elnézést!

(#4626) Louro válasza martonx (#4625) üzenetére


Louro
őstag

Nem egy nagy céget tudok, ahol több, mint 10 éves rendszerekkel dolgoznak. SQL Server 2008, de az Internet Explorer 6 is egy vicc kategória már. De hát "erre fejlesztettek." Ez a mondás.

Mess with the best / Die like the rest

(#4627) whYz válasza martonx (#4625) üzenetére


whYz
addikt

Hiaba tart 8-nal ha abban is benne van a bug (ha benne van...).
Amugy meg par ev es lassan nalunk is frissitenek. :W

(#4628) nyunyu válasza Louro (#4626) üzenetére


nyunyu
félisten

Állami hivatal, napjainkban futó pármilliárdos IT tender.

Valamelyik nagyokos kitalálta, hogy Enterprise Architectben jól lemodellezi az egész rendszert, és megrajzolt egy olyan infrastruktúrát és adatmodellt, aminek az egyik fele felesleges, másik fele meg használhatatlan.

Hivatal IT osztálya persze ellenkezett, hogy ez így megvalósíthatatlan, kivitelezhetetlen, de hát nem ők voltak a döntéshozói szerepkörben, így el lett fogadva.
Megvalósítani meg úgyis a beszállítóknak kell...

A hivatalnak van saját sokoldalas fejlesztési standardja, ami előírja a beszédes nevek használatát, minden objektumnak kell legyen egy _id végű egyedi kulcsa, minden mezőnév a táblanévvel kezdődik, stb.
Ezektől eltérni nem lehet, mert deploy előtti ellenőrzésen fennakad a kód, nem telepítik, ha valamelyik követelménynek nem felel meg.

Lényeg: EAban szereplő adatmodellből generálják az objektumokat létrehozó szkripteket.

Probléma azzal még nincs, hogy a beszedes_elso_tablanev_elso_mezoje túl hosszú lenne, hanem azzal, hogy a külső kulcsok neve táblanév1_táblanév2_id alakú, illetve az N:M relációk leírásához szükséges táblák neve is konkatenálódik: táblanév1_táblanév2.
Így a benne lévő táblanév1_mezőre visszamutató mező neve elso_tabla_neve_masodik_tabla_neve_elso_tabla_neve_mezo_neve lesz.

Ennek persze az lett az eredménye, hogy az EAból generált szkripteket a meglevő Oracle 12.1 rendszerük nem bírta lefuttatni, mert nem fértek bele a 30 karakteres tábla és oszlopnév limitjébe.

Főnököm felvetette, hogy akkor leimplementáljuk mi az adatmodellt, értelmesen rövidített táblanevekkel.
Na azt nem lehet, mert akkor nem felelünk meg az EAban leírt terveknek.

Jó, akkor módosítsátok az EAban lévő adatmodellt úgy, hogy a konkatenált nevek is beleférjenek a 30 karakterbe.
Nem lehet, túl sok munka, meg már a projekt többi részéhez is hozzá kéne nyúlni.

Harmadik opció?
DB upgrade, de annak jelentős szoftverlicensz vonzata van.

Azóta a projekt alatt Oracle 19 dübörög, mivel annak a költségét egyszerűbb volt átverekedni az ilyen-olyan bizottságon, mint a szent és sérthetetlen (hetente ötször változó) haditervet módosítsák, mert az utóbbi annak a beismerése lett volna, hogy a terv alapból szar. :))

Akarom mondani a DB frissítés kisebb projekt kockázattal járt, mint a tervet módosítani.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4629) Szmeby válasza nyunyu (#4628) üzenetére


Szmeby
tag

És gondolom, a projektben résztvevő összes cég azt állítja magáról, hogy csak minőségi szoftvert adnak ki a kezükből, a szakmai kiválóság az elsődleges.

Szerintem amúgy nem szar a terv, csak a tervező bizonyára elfelejtette, hogy a munkája nem ér véget a Generate gomb megnyomásával. A többi résztvevő meg nem volt elég tökös visszadobni a félkész produktumot. Pénz van, idő nincs, nyilván a gányolás felé húz ezek után minden résztvevő szíve. Nem szar ez, hanem kihívásokkal tűzdelt. Azt meg minden fejlesztő szereti, sokan a cv-be is beírják, a kihívás fontos. :D

(Sosem értettem, miért nem illik megosztani a nyilvánvaló ostobaságokat elkövető (jogi) személyek / projektek nevét. Mások okulására és tájékoztatására, hogy "ide ne gyertek dolgozni, ha nem akartok inkompetens, egyeztetésre képtelen egyedekkel együtt dolgozni". Mindig csak a cukormáz látszik. Pedig hibázni jó dolog, de azt nem beismerni totális káoszba vezet. És kinek van kedve káoszban létezni? Habár biztos akad olyan is, de én nem tartozom közéjük.)

(#4630) Louro válasza nyunyu (#4628) üzenetére


Louro
őstag

Igazán "minőségi" megoldás az lett volna, ha készül egy dictionary arra, hogy táblanév-oszlopnév-oracle táblanév-oracle oszlopnév :DDD

A szabványok jók és hasznosak, de azért néha nem árt frissíteni azokat.

@Szmeby: Szerintem a beszállítókat nem hibáztathatjuk, mert lehet elhangzottak ellenérvek. De a megrendelőnek/ügyfélnek mindig igaza van. Az se igaz, hogy minőségi cég nem végez kontár munkát. Van az a pénz.

Nálunk - pénzintézet - szintén az évek az alatt olyan igények születtek, hogy már csoda, hogy működik a rendszer. Mindig kértek valamit. Félig leszállították, mert gyorsan kellett valami. De a végét már nem rendelték meg, mert addig volt rá működő workflow. És az igények is olyanok .... . Régiek közül persze már szinte senki sincs. Szóval, ha kérdés merül fel, szép kutató munka.

Mess with the best / Die like the rest

(#4631) Szmeby válasza Louro (#4630) üzenetére


Szmeby
tag

Ó, én nem hibáztatom, biztos vagyok benne, hogy elhangzottak. Mindig elhangzanak.

Egy ideális világban ez úgy működne, hogy a beszállító szépen feláll az asztaltól és közli, hogy van egy minőségi szint, amihez már nem hajlandó adni a nevét, a megrendelő meg hajára kenheti az "igazát". Ha a megrendelő akkora polihisztor, hogy szakmai érveket vétóz meg (vagy eleve nem is egyeztet, csak utasít), akkor miért fordult a beszállítóhoz eleve. Egy tucat majom is tud pötyögni utasítás alapján, nem kell ehhez szakember.

Nyilván olyan szerződést kell kötni az elején, ami megengedi a minőséghez való ragaszkodást és annak nem teljesülésekor az elsétálást. Kár, hogy ritka az a beszállító, aki fontosnak tart ilyesmit belefoglalni a szerződésébe. Másrészről meg ott bukik meg a csipkerózsika történetem, hogy kell a pénz, etetni kell az alkalmazottakat, így a beszállító inkább nyel egyet, görbít a gerincén még egy kicsit, és azt mondja: "jól van".

Ami engem alapvetően bosszant ebben a viselkedésben, hogy mindkét résztvevő elhiszi, hogy ettől lesz jobb a világ. És értetlenül állnak például azon probléma előtt, hogy ó, hát milyen nagy a fluktuáció! Majd jönnek a menedzsment és hr tanácsadók, akik tudják a tuti receptet a fluktuáció csökkentésére. De valahogy nem sikerül. Mert a résztvevők még mindig azt hiszik, hogy valami leküzdhetetlen külső erő arra kényszeríti őket, hogy megalkudjanak és minden szakmai érvet nélkülöző utasítást egy megcáfolhatatlan törvényként fogjanak fel: "A magasságos megrendelő kinyilatkoztatott. Mégis legyen skálázható a rendszer, amit a jövő héten adunk át. A könyörületes megrendelő hozzátevé: a határidő 5 nappal bővülhet, ha kell. A megrendelő elvárja, hogy legyen olcsó. Dologra! Ámen."

Majd a fél-2 éves csúszást követően: "A mindenható megrendelő nagyon örül, hogy VÉGRE elkészült a rendszer. De csak akkor lesz elégedett a munkával, ha ezt a néhány frissen kitalált módosítást még ingyen beletesszük. Akkor majd boldog lesz, de azért érezzük egy kicsit magunkat szarul, amiért ilyen kontár munkát végeztünk, és ilyen sokáig tartott. De azért örülünk, hogy az áldott és kegyelmes megrendelő eltekintett a kötbér fenyegető suhintásától igénytelen munkánk ellenére is."

Komolyan, ha nem lettem volna (leginkább elszenvedő) részese ezeknek a játszmáknak, csak röhögtem volna ezen a bohózaton. :) Minden szereplőnek megvan a helye, tökéletesen összeállt az ökoszisztéma. Egy szociológiai aranybánya. Nem is értem, mit ágálok ellene.

(#4632) Ispy válasza Szmeby (#4631) üzenetére


Ispy
veterán

Nézd, ha valaki kurvának áll....tudod. ;]

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#4633) Louro válasza Szmeby (#4631) üzenetére


Louro
őstag

Ezt nem is vitatom, meg lehet én is írtam ilyet. Kell a pénz. Beszállító max az elején naív, hogy minőségi terméket, szolgáltatást készíthet, de pár megrendelés után valószínűleg rájön, hogy elég olyat felvenni, ami tud valami karistolni. Nem kell, hogy elhivatott legyen. Majd kicsit feljebb tolják a projekt közben az "ajánlott gépigény" részt.

Amúgy picit ON is legyek. De nem vitaindítónak szánom, hátha kiesik valami tanulság másoknak (is).

Egyik kolléga már egy hete szenvedett valamivel. Egyszer megírta a kódot és kb. mindig ugyanazt futtatta, de 12+ óra utána megszakadt a kapcsolat (távmunka). Remélte, hogy hátha valaki más is futtat valami számításigényes feladatot és elcsíphet egy nyugodtabb időszakot.

Megnézve a kódot, kicsit átírva 38 másodpercre le lett faragva a futási idő.

Három, relatíve kicsi tábla (300e rekord) tábla lett összekapcsolva.
De a gondot az okozhatta, hogy az ON feltétel után olyan komplex feltétel volt, hogy ledobtam az ékszíjat. Valami ilyesmi lehetett:
SELECT fejléc
FROM tábla1
INNER JOIN tábla2
        ON (
              tábla1.oszlop1 LIKE '%valami%' 
 OR 
 tábla1.oszlop2 >= tábla2.oszlop1 
        OR 
 (tábla1.oszlop3 IN (SELECT tábla3.oszlop1 
       FROM tábla3 
       WHERE oszlop2 > tábla2.oszlop4)
         AND .....))

Igazából annyit módosítottam a kiraktam a feltételeket külön oszlopokba CASE WHEN-ekkel, majd utána végeztem el a kötéseket. Táblakötésbe LIKE és ennyi feltétel a korábbi tapasztalataim alapján nem túl hatékony. Bár query plan-t a kollégák nem szokták nézni, pedig sokszor hasznos lenne.

+1: Sajnos sokszor látok olyat is, hogy fejlécben van tábla úgy bekötve, hogy ott is van még egy tábla a SUBSELECT-en belül. Például
SELECT
 (SELECT oszlop1 FROM tábla2 WHERE tábla2.oszlop2 = (SELECT MAX(oszlop2) FROM tábla2)) c
FROM tábla1

[ Szerkesztve ]

Mess with the best / Die like the rest

(#4634) nyunyu válasza Louro (#4633) üzenetére


nyunyu
félisten

tábla1.oszlop1 LIKE '%valami%' miatt mindig full table scan lesz, nem tud semmilyen indexet használni a joinhoz.

Míg ha tábla1.oszlop1 LIKE 'valami%' -t írnál (vagyis a string elején keresel, nem közben), akkor a tábla1.oszlop1-re tett index használható lenne, és nem kellene mindig végigolvasnia az egész táblát.

Hello IT! Have you tried turning it off and on again?

(#4635) Louro válasza nyunyu (#4634) üzenetére


Louro
őstag

Nekem úgy mutatták az öregek, hogy a LIKE-ot kerüljem. Nagyon nem hatékony. Mondjuk eddigi munkáim során mindig be is igazolódott, hogy ha kollégákat kellett segítenem.

[ Szerkesztve ]

Mess with the best / Die like the rest

(#4636) tm5 válasza Louro (#4635) üzenetére


tm5
tag

Hát ezt azért így kategorikusan nem jelenteném ki, mert pl. a LIKE 'valami%' az már használ indexet. De tény, hogy ha ez az egyetlen mentsvárad akkor lehet nem optimális az adatstruktúra.

(#4637) bpx


bpx
őstag

Egy indexet több módon lehet használni.
Az oszlop1 like 'valami%' szűréshez megy az index range scan az oszlop1-en levő indexen. Ez hatékonyan működik.
Az oszlop1 like '%valami%' szűréshez szintén használható az oszlop1-en levő index, csak az már nem index range scan, hanem index fast full scan lesz, ahol az adatbázis a teljes indexet végigolvassa random sorrendben.
Az oszlop1 like '%valami%' szűréshez ha még egy order by oszlop1 is van, akkor pedig index full scan is használható, ahol az adatbázis a teljes indexet végigolvassa, de a fa struktúrát bejárva, rendezett sorrendben.
Tehát nem, nem lesz mindig full table scan, mert a 300 oszlopot tartalmazó táblára történő full scan helyett még mindig gyorsabb a csak 1 oszlopot tartalmazó és ezáltal sokkal kisebb méretű indexen a full scan.
De az utóbbi 2 már nem hatékony és ha nagy mennyiségű adaton kell szöveges keresést végrehajtani, akkor a like '%valami%' helyett ott van az Oracle Text a saját indexeivel és függvényeivel, meg a többi adatbázisnál is a text alapú indexek és keresések.

(#4638) bambano


bambano
titán

valaki tudja véletlenül, hogy xml adattípusból hogyan kell a root elemet kiszedni xpath-szal? esetleg ugyanezt konkrétan postgresql-ben?

kösz.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#4639) tm5 válasza bambano (#4638) üzenetére


tm5
tag

a /rootelementname nem működik? vagy néhán helyen még ezt is írták: //
10+ éve nem használtam xpath-t

(#4640) OldBoyDev


OldBoyDev
újonc

Jó estét, szervusztok!

Van két adatbázisom (MS SQL platform), az egyik egy helyi SQL szerveren, a másik Azure felhőben. Mindkét adatbázist látom az SQL Management Studioban. Hogy tudok összekapcsolni (JOIN) két táblát, ha az egyik a local serveren van, a másik meg a felhőben?

(#4641) Ferfiu válasza OldBoyDev (#4640) üzenetére


Ferfiu
tag

Linked servert mondanám elsőre.

(#4642) OldBoyDev válasza Ferfiu (#4641) üzenetére


OldBoyDev
újonc

Köszönöm! Végül is sikerült. Bár azt nem azt engedte az SSMS, hogy behúzzak egy Azure táblát a vieweditorba, de ha kézzel megcímeztem, akkor összetudtam kötni a helyi táblával.

(#4643) kem


kem
addikt

Sziasztok!

Szeretnek importalni egy SQL dumpot AWS Aurora-MyAQL DB-be:
source dump: 5.7.26
linux agent: mysql Ver 14.14 Distrib 5.7.30
target rds: 5.7.mysql_aurora.2.08.1

Amikor importalni probalom, ezt a hibauzenetet kaupjuk:
ERROR 1064 (42000) at line 25: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COMMENT='Stored indicator calculations'' at line 14

A dump erre vonatkozo szakasza:

-- MySQL dump 10.13  Distrib 5.7.26, for Linux (x86_64)
--
-- Host: localhost    Database: <removed>
-- ------------------------------------------------------
-- Server version 5.7.26-enterprise-commercial-advanced-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `<removed>`
--
DROP TABLE IF EXISTS `<removed>`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `<removed>` (
  `id` bigint(10) NOT NULL AUTO_INCREMENT,
  `starttime` bigint(10) NOT NULL,
  `endtime` bigint(10) NOT NULL,
  `contextid` bigint(10) NOT NULL,
  `sampleorigin` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `sampleid` bigint(10) NOT NULL,
  `indicator` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `value` decimal(10,2) DEFAULT NULL,
  `timecreated` bigint(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `<removed>_staendcon_ix` (`starttime`,`endtime`,`contextid`),
  KEY `<removed>_con_ix` (`contextid`)
) ENGINE=InnoDB AUTO_INCREMENT=54076 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED COMMENT='Stored indicator calculations';
/*!40101 SET character_set_client = @saved_cs_client */;

Ez pedig a parancs amivel probaljuk importalni.
Korabban a heten mukodott a dump elozo verziojaval ami 10x ekkora volt mert tele volt logokkal.

cat dbdump.sql | sed 's/ROW_FORMAT=COMPRESSED/ROW_FORMAT=/g' | sed 's/user_b/user_a/g' | time  mysql -p -h aurora-mysql-cluster.cluster-<removed>.eu-east-x.rds.amazonaws.com -u user_a dbname --max-allowed-packet=1073741824

A DBt pedig ezzel krealtam:
CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Probalunk rajonni mi lehet a baj, de minden jonak tunik szintaktikailag.
A dump 26GB.

Elore is koszonok barmilyen otletet.

szerk: elnezesd de akarhogy szerkesztem szanaszet hullik a formazas :(

[ Szerkesztve ]

Köszi!

(#4644) bambano válasza kem (#4643) üzenetére


bambano
titán

miért nem veszed ki teljesen a row format utasítást?
első ránézésre az a baja, hogy nem ismer olyan sor formátumot, hogy comment.
szerintem ezt:
sed 's/ROW_FORMAT=COMPRESSED/ROW_FORMAT=/g'
írd át erre:
sed 's/ROW_FORMAT=COMPRESSED//g'

[ Szerkesztve ]

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#4645) kem válasza bambano (#4644) üzenetére


kem
addikt

Koszonom szepen ez volt a gond. Pont most ajanlotta egyik kollega is ugyanezt. Ezek szerint ures ertekkel nem lehet betolteni mert a kovetkezot nem tudja akkor ertelmezni? Most atallitottam DYNAMIC-ra egy teszt miatt de elkezdte betolteni vegulis.

Köszi!

(#4646) Szancsó


Szancsó
aktív tag

Sziasztok!
Top lekérdezéssel kapcsolatban lenne kérdésem: arra van módszer, hogy egy lekérdezésen belül visszakapjam az összesített és rendezett halmazból az első x elemet, valamint az ezeken kívüli rekordok összesített értékét is egy plusz sorban?
Tehát pl. van egy táblám [A], [B] oszlopokkal és 1000 sorral, amikben az [A] 50 féle értéket vehet fel, a [B] pedig az aggregálandó mező. Ebből kellene pl. a TOP 5, de úgy, hogy gyakorlatilag 6 rekordot kapjak vissza: az utolsóban annak a 45 féle [A] értéknek az összesenjével, ami egyébként nem fért bele a topba.
A nagyságrend elégé változó, de az [A] értékeket tekintve több 10e simán előfordulhat és a top is kb. tetszőleges, ezért kerülném a kétlépcsős megoldást (ha lehet).
Firebird 2.5 és 3, MsSQL, Oracle megoldás érdekelne.

My story is one of many thousands, and the world will not suffer if it ends too soon.

(#4647) nyunyu válasza Szancsó (#4646) üzenetére


nyunyu
félisten

Én kiemelném egy CTEbe az A, B összege oszlopokat, és kapna egy sorszámot összeg szerint csökkenő sorrendben, majd következő lépésben ebből válogatnám le a sorszám<=5-öt ("top 5"), és hozzáunióznám a szumma(B összeg)-et, ahol sorszám>5.

Így az eredeti táblát csak egyszer kell végigolvasni, második lépésben uniót képző 2 select már a memóriában lévő párszáz-ezer soros aggregátumból dolgozik, minimális többletköltséggel.

Valahogy így:
with summa as (
select a,
sum(b) sum_b,
row_number() over (partition by a order by sum(b) desc) rn
from tabla5
group by a),
top5_summa as (
select a,
sum_b,
rn
from summa
where rn<=5
union
select 'Többi' as a,
sum(sum_b) as sum_b,
6 as rn
from summa
where rn>5)

select a,
sum_b
from top5_summa
order by rn;

Nem tudom, Firebird ismeri-e ezt a szintaxist, SQL Server kb. 2005 óta igen, meg az Oracle 11 alatt is működik.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#4648) Szancsó válasza nyunyu (#4647) üzenetére


Szancsó
aktív tag

Köszönöm!
Ismeri a 2.5 is, az analitikus függvények viszont ha jól emlékszem csak 3 -tól vannak, de CTE -vel más módon szerintem megoldom majd. Csak olyan ritkán kell DB -t piszkálnom, hogy már elfelejtem melyik mit is tud :U

My story is one of many thousands, and the world will not suffer if it ends too soon.

(#4649) RedHarlow


RedHarlow
aktív tag

Sziasztok, kezdő vagyok SQL terén, már 2-3 órát beleöltem a következő feladatba, esetleg tudna segíteni benne valaki?

Az items táblából szeretném lekérni az olyan sorokat aminek az ID-je csak 1x szerepel a táblában majd a kapott tömbből szeretném ha ez a két feltétel teljesülne: status = open, type = 477.

Előre is nagyon szépen köszönöm a segítséget.

(#4650) martonx válasza RedHarlow (#4649) üzenetére


martonx
veterán

Group by és having

Én kérek elnézést!

Útvonal

Fórumok  »  Szoftverfejlesztés  »  SQL kérdések (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.