Hirdetés

2024. május 1., szerda

Gyorskeresés

Útvonal

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

Hozzászólások

(#1151) martonx válasza Speeedfire (#1150) üzenetére


martonx
veterán

Szvsz nem ajánlott keverni, legalábbis vagy RDBMS-t, vagy dokumentum alapú NoSQL-t érdemes használni. És e mellé persze könnyen lehet gráf tárolót, vagy kulcs-érték tárolót használni (lásd pl. Facebook, ami MySQL alapú, de a kapcsolatokat gráf tároló NoSQL-ben tartja).

Én kérek elnézést!

(#1152) Speeedfire


Speeedfire
nagyúr

Egy táblában ilyen mezők vannak.
id + name + type

A type most lehet 1,2,3
Lehet olyan lekérdezést csinálni, hogy a type szerint rendezze, de ebben a sorrendben? 3,1,2?

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1153) rum-cajsz válasza Speeedfire (#1152) üzenetére


rum-cajsz
őstag

vagy írsz egy függvényt, vagy egy másik táblában definiálod a kívánt sorrendet.

=Kilroy was here============================ooO=*(_)*=Ooo=======

(#1154) PazsitZ válasza Speeedfire (#1152) üzenetére


PazsitZ
addikt

SELECT id, name, type FROM table
WHERE type IN (1,2,3)
ORDER BY
CASE type
WHEN 3 THEN 1
WHEN 1 THEN 2
WHEN 2 THEN 3
END;

- http://pazsitz.hu -

(#1155) Speeedfire válasza rum-cajsz (#1153) üzenetére


Speeedfire
nagyúr

Meglett a megoldás, ennyire nem volt drasztikus szerencsére. :)

ORDER BY FIELD(
TYPE , '1', '3', '2' )


PazsitZ: Ez is jónak tűnik, megnézem melyik a gyorsabb lekérdezésben. :K

Szerk.:
Amit írtam: a lekérdezés 0.0178 másodpercig tartott
Az általad írt: a lekérdezés 0.0005 másodpercig tartott

A tied kicsit gyorsabb, még így 20db adattal is. :D :R

Szerk.: Na, most az enyémre is annyit írt mint a tiedre. :F

[ Szerkesztve ]

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1156) bpx válasza Speeedfire (#1155) üzenetére


bpx
őstag

persze mert első futás után már cache-ből megy

(#1157) PazsitZ válasza bpx (#1156) üzenetére


PazsitZ
addikt

Igen, mérés esetén vagy a benchmark-al futtasd le mondjuk 10000 ismétléssel így mindegyik esetén azonosan használ cache-t a későbbi requestek esetén és hamarabb kibukik.

Vagy mindkettő futtatása elé szúrd be a: RESET QUERY CACHE; parancsot.

Feltéelezve, hogy mysql-t használsz.

[ Szerkesztve ]

- http://pazsitz.hu -

(#1158) Speeedfire válasza PazsitZ (#1157) üzenetére


Speeedfire
nagyúr

Megjelenített sorok: 0 - 29 ( 1 001 összesen, a lekérdezés 0.0038 másodpercig tartott)
Megjelenített sorok: 0 - 29 ( ~1 001 összesen , a lekérdezés 0.0026 másodpercig tartott)

Gyorsabb, amit te írtál meg. :)
Query cache ürítés volt az 1. teszt után.
2x is megcsináltam ezeket a teszteket, mind a 2 esetben gyorsabb volt a case szerkezet.

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1159) SektorFlop


SektorFlop
aktív tag

Valaki esetleg tud erre válaszolni? Tudom csak félig tartozik ide, de hátha!

"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."

(#1160) Sk8erPeter válasza SektorFlop (#1159) üzenetére


Sk8erPeter
nagyúr

Te most minden alkalommal egy view-t akarsz létrehozni? Hát az úgy nem lesz jó.
Akkor inkább a view-t selecteld, vagy hagyd a view-t.

Sk8erPeter

(#1161) SektorFlop válasza Sk8erPeter (#1160) üzenetére


SektorFlop
aktív tag

nem feltétlenül kell view... sima select is elég kell hogy legyen igaz?

"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."

(#1162) Sk8erPeter válasza SektorFlop (#1161) üzenetére


Sk8erPeter
nagyúr

Elvileg ja.

Sk8erPeter

(#1163) kisbandima


kisbandima
tag

Készítettem egy Silverlight alkalmazást, ami egy Microsoft SQL Server 2008 R2 Express Edition-ből olvassa ki az adatokat. Az adatokat a felhasználó szűrheti is (dátumtól - dátumig, összegtől - összegig). Ez ugye 4 paraméter és nem csak párban működnek, tehát lehet olyat is, hogy csak a bizonyos dátumtól újabb adatokat listázom ki. Ez működik is, csakhogy a favágó módszerrel. Tehát amennyi lehetőség annyi SQL lekérdezés amiből majd csak egy fut le. Nem lehet ezt valahogy elegánsabban megoldani?

(#1164) lakisoft válasza kisbandima (#1163) üzenetére


lakisoft
veterán

Dynamic SQL? vagy Dynamic SQL és tárolt eljárás?

(#1165) Sk8erPeter válasza kisbandima (#1163) üzenetére


Sk8erPeter
nagyúr

Én is a tárolt eljárásra szavaznék, de nem ártana látni a "favágó" módszert, meg az alap query-t, vagy valami példaszerűséget, hogy meg tudjuk mondani, hogyan tudnád azt szebben elkészíteni.
Pl. a WHERE-ben is lehetne CASE-ek.

(#1164) lakisoft :
Most már érdekelne, hogy ez a dynamic SQL miért jó? Ahogy nézegettem, ez igazából egy query feltételektől függő konkatenálgatása, aztán a query "elkészítése" során annak végrehajtása, ami szerintem elég randa.
Akkor már a WHERE-be elhelyezett, kicsit komplex CASE-ek is szebbnek tűnnek.
Persze aztán lehet, hogy csak nem találkoztam durva esetekkel, ahol nincs jobb, ezért kérdezem.

[ Szerkesztve ]

Sk8erPeter

(#1166) lakisoft válasza Sk8erPeter (#1165) üzenetére


lakisoft
veterán

Hááát figy. Valóban csúnya de az agyam ráállt teljesen. Így jól és gyorsan tudom használni. A teljesítménybeli vonatkozásait nem ismerem de igazából jelenleg nincs is rá szükségem.

Tárolt eljárást is sokszor használok Dynamic SQL-lel együtt. Ott már nem látod hogy csúnya :DDD.

[ Szerkesztve ]

(#1167) Speeedfire


Speeedfire
nagyúr

Na, akkor kérdeznék én is. :D

Adott egy log tábla az adatbázisban, ahol a felhasználók ip címe van mentve. x időközönként a legutolsó y mennyiségű adatot törölni kellene.
Van erre valami gyors megoldás?
Csak, mert ami nekem eszembe jutott, hogy groupba kellene szedni őket. Majd megnézni, hogy melyiknél mennyi van, ahol több mint y ott elmenti egy tömbbe azoknak a usereknek az id-ját. Majd egyesével időrendben növekvőbe tenni, lementeni az id-kat és megint csak lenne egy iteráció amiben törölve lennének ezek. Php-val oldanám meg, de ez így szerintem elég sok időbe telik és sok erőforrást emészt fel. Van erre esetleg valami egyszerűbb megoldás? :U

Adatbázis:
id | uid | ip | time
id: ai, elsődleges kulcs
uid: másodlagos kulcs
ip: varchar(20)
time: int(10)

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1168) Sk8erPeter válasza Speeedfire (#1167) üzenetére


Sk8erPeter
nagyúr

Hát én komplexebb feladatokra tárolt eljárást használok, mióta belekóstoltam.
De a te feladatodat igazából nem értem, hogy miért akarod tömbökbe szedni a userek id-ját... Adott userekhez tartozó bejegyzéseknél X időközönként csak Y mennyiséget akarsz törölni, tehát azt akarod, hogy valamennyi az adott júzerhez mindenképp megmaradjon?
Szóval nem csak törölni kell a táblából azt az Y sort, azt' kész?
Fejtsd ki, MOST! :D

===

(#1166) lakisoft :
"Tárolt eljárást is sokszor használok Dynamic SQL-lel együtt. Ott már nem látod hogy csúnya :DDD."
Miért, a tárolt eljárás önmagában még nem ocsmány, de el lehet rondítani. :D

Sk8erPeter

(#1169) Speeedfire válasza Sk8erPeter (#1168) üzenetére


Speeedfire
nagyúr

Azért akarom (illetve akarja a fene, de nem látom rá mást...), hogy utána ki tudjam törölni a régi bejegyzéseket.

tehát azt akarod, hogy valamennyi az adott júzerhez mindenképp megmaradjon?
Így van, y mennyiség bejegyzés megmaradni minden usernek. :K

Nem tudom mit értetlenkedsz ha tudod mire gondolok. :DDD

Adott pl 1m rekord és 1k felhasználó és pl 500 bejegyzésnek kellene lennie csak felhasználónként maximum. Ergo akinek több mint 500 ilyen bejegyzése van, azoknak a legrégebbieket törölni kellene. :)

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1170) kisbandima válasza Sk8erPeter (#1165) üzenetére


kisbandima
tag

Favágó módszer 2 paraméterre:

if ((a != 0) && (b == 0))
{
return ... Where Osszeg >= a;
}

if ((a == 0) && (b != 0))
{
return ... Where Osszeg <= b;
}

return ... Where Osszeg >= a & Osszeg <= b;

Remélem így már érthető. A probléma, hogy nekem 4 paraméterem van és ezzel a módszerrel elég amatőr megoldásnak látszik. Igaz legalább működik.

(#1171) lakisoft válasza Sk8erPeter (#1168) üzenetére


lakisoft
veterán

Persze hogy el lehet rondítani, de próbálok áttekinthető kódot kiadni a kezemből.

(#1172) martonx válasza kisbandima (#1163) üzenetére


martonx
veterán

Ha már Silverlight, akkor gondolnám, hogy WCF RIA Services-el adod az adatokat, ez esetben LINQ-val simán meg lehet oldani az egészet.
Ha meg nem több millió adatsorról van szó, C#-al, XAML-lel elég szépen lehet memóriában szűrni az adathalmazt.

Én kérek elnézést!

(#1173) bpx válasza Speeedfire (#1167) üzenetére


bpx
őstag

PHP-t erre felejtsd el, adatok ilyen szintű manipulációját az adatbázis végezze, ne a hozzá kapcsoló alkalmazás

ez 1, azaz egy darab színtiszta SQL utasítás:

DELETE FROM tabla WHERE id IN(
SELECT id FROM(
SELECT id, RANK() OVER (PARTITION BY uid ORDER BY time DESC) r FROM tabla)
WHERE r > 500);

magyarázat:

a legbelső select partíciókat képez a táblából az uid alapján, és a partíciókat idő szerint (time) csökkenő sorrendbe rendezi, és minden egyes id-hoz rendel egy sorszámot (rank), hogy adott partícióban a rendezés szempontja szerint hanyadik helyen áll

az eggyel kintebb levő select lekérdezi azokat az id-kat, ahol ez a "rang" 500-nál nagyobb, tehát kívül esik a kívánt limiten

a delete meg törli az ilyen id-val rendelkező sorokat

szerk: adatbáziskezelőt mondjuk nem írtál, ez Oracle-ben működik, én a tábládból úgy tippelem hogy MS SQL (auto increment PK, meg int típus), de ezek a funckiók mintha ott is meglennének

[ Szerkesztve ]

(#1174) Speeedfire válasza bpx (#1173) üzenetére


Speeedfire
nagyúr

Hát ez jól hangzik, ennek utána nézek, remélem menni fog nálam is. Én meg itt 50 soros php sql kódon agyaltam már. :B
MySql alatt vannak az adatok, de meglesem, hogy ezek ott is vannak-e.
Köszi. :R

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1175) bpx válasza bpx (#1173) üzenetére


bpx
őstag

most látom, hogy mysql-ben is van int meg autoincrement, nagyon le vagyok maradva e téren :D

(#1176) Speeedfire válasza bpx (#1175) üzenetére


Speeedfire
nagyúr

Pont ugyanezek a parancsok nincsenek, de hasonlót írtak át itt is. Menni fog szerintem. Holnap meglesem.

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#1177) bpx válasza kisbandima (#1163) üzenetére


bpx
őstag

egyrészt, ha bind változókat használsz, ez így is csak annyi SQL, ahány esetet a feltételek megadása/meg nem adása eredményez
de ha minden esetet egy SQL utasítással akarsz kezelni, ám legyen

MSSQL-t nem ismerem, szóval ez amolyan pszeudokód lesz :D

SELECT oszlop1, oszlop2
FROM tabla
WHERE datum > NVL(:B1, MINDATE)
AND datum < NVL(:B2, MAXDATE)
AND osszeg > NVL(:B3, 0)
AND osszeg < NVL(:B4, INT.MAXVALUE);

B1-B4 bind változók, ami user input
ha a user nem ad meg semmit, akkor NULL-t adsz be neki
az NVL arra való, hogy ha az első paramétere NULL, akkor kicseréli a másodikra

tehát ha a user nem ad meg felső határt a dátumra, akkor a NULL-t kicseréli az NVL a lehetséges legnagyobb dátumra
ha a user nem ad meg alsó határt az összegre, akkor kicseréli 0-ra
és így tovább...

ha meg linq vagy ilyesmi, abban nem vagyok otthon (sajnos)

[ Szerkesztve ]

(#1178) lakisoft válasza bpx (#1175) üzenetére


lakisoft
veterán

Mióta az oracle kezében van nagyon sok új dolgot beleraktak.

(#1179) Sk8erPeter válasza lakisoft (#1178) üzenetére


Sk8erPeter
nagyúr

Hát int és autoincrement nem csak azóta van, mióta az Oracle tulajdonába került... :U

Sk8erPeter

(#1180) martonx válasza Sk8erPeter (#1179) üzenetére


martonx
veterán

Én inkább úgy mondanám, hogy mióta az Oracle kezében van, nem olyan a fejlődési üteme, mint régen. Az Oracle bolond lenne saját magának konkurenciát állítani.

Én kérek elnézést!

(#1181) lakisoft válasza Sk8erPeter (#1179) üzenetére


lakisoft
veterán

Itt nem ezekre gondoltam. A tárolt eljárásokra pl. vagy MySQL Partitioning vagy Storage Engine: NDB kibővítették az elérhető adattipusokat.

[ Szerkesztve ]

(#1182) Sk8erPeter válasza lakisoft (#1181) üzenetére


Sk8erPeter
nagyúr

lakisoft, martonx: na, akkor most beszéljétek meg, hogy is van ez, mert egymásnak pont ellentmondó állításokat hoztatok fel. :D

Sk8erPeter

(#1183) martonx válasza Sk8erPeter (#1182) üzenetére


martonx
veterán

Nincs itt nagyon mit megbeszélni. Az 5.1-es MySQL verzióban volt a legtöbb innováció. Ez pedig 2008 November 27-én jelent meg. Ez lassan 4 év távlatot jelent. lakisoft által jelzett újdonságok is ekkor kerültek bele. Azóta csak csiszolgatják.
Az Oracle pedig 2010 január 27-én vette meg a Sun-t, ami birtokolta a MySQL-t.
De ez részemről nagyon off topik, és nem vagyok egy nagy MySQL szakértő.

Én kérek elnézést!

(#1184) Sk8erPeter válasza martonx (#1183) üzenetére


Sk8erPeter
nagyúr

Szóval az említett "újdonságoknak" köze nincs az Oracle-höz, ahogy nyilvánvalóan az intnek és autoincrementnek sem... :D (az utóbbiak mondjuk különösen durvák lennének, ha csak 2010-ben kerültek volna bele...)

[ Szerkesztve ]

Sk8erPeter

(#1185) dellfanboy


dellfanboy
senior tag

most ismerkedek a pl sql-el

van egy script
SELECT *
FROM táblanév
WHERE 1=1

AND upper(g.NAME) LIKE '%lajos%';

segítsetek miért van az, hogy ha törlöm a where 1=1 feltételt errort kapok?
ill AND után miért kell az upper? miért nem jó ha simán ezt írom:
SELECT *
FROM táblanév

AND (g.NAME) LIKE '%lajos%';

eladó dolgok:mondd az árát és vidd http://hardverapro.hu/tag/dellfanboy#aprohirdetesei

(#1186) ArchElf válasza dellfanboy (#1185) üzenetére


ArchElf
addikt

Nem a where 1=1 -et kell törölni, hanem az 1=1 AND-et
SELECT *
FROM táblanév
WHERE upper(g.NAME) LIKE '%lajos%';

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1187) Sk8erPeter válasza dellfanboy (#1185) üzenetére


Sk8erPeter
nagyúr

Igazából szerintem így lenne értelme:

...
WHERE UPPER( stuff_name ) LIKE UPPER( '%lajos%' )

...abban az esetben, ha az adatbázis case sensitive.
Pl. MySQL-nél alapból tök mindegy, hogy "lajos", "LAJOS" vagy "LaJoS" a tárolt név, simán az UPPER nélkül is kiadja mindegyik találatot, szóval ez case insensitive módon megtalálja az összeset - de collationnel arra is van mód, hogy ne így legyen: [link].

Case sensitive esetben viszont mindkettőt jó, ha nagybetűssé teszed, és úgy veted össze, mert ellenkező esetben nem mindegy, hogy a fent felsorolt példák közül hogyan keresel rá.
Tehát ha nem mindkettőnek a nagybetűssé (vagy épp kisbetűssé) tett változatát veted össze, akkor lehet, hogy egyes találatokat kizársz az eredményekből, mert mondjuk valaki elgépelte a Lajost, és LajOst írt helyette (lásd nagy O).
A nagybetűssé tett "lajos"-ból "LAJOS" lesz, a nagybetűssé tett "LajOs"-ból is "LAJOS" lesz, tehát így már a két karaktersorozat egyezni fog ebben az 5 karakterben.
A Te fenti keresésed lehetővé teszi azt is, hogy a "LajOska" nevet is megtalálja.

Remélem így valamennyire érthető.

Sk8erPeter

(#1188) Sk8erPeter válasza Sk8erPeter (#1187) üzenetére


Sk8erPeter
nagyúr

Pontos egyezés vizsgálatához át lehet alakítani így is:

SELECT * FROM `test_names`
WHERE
BINARY(stuff_name) LIKE "%lajos%"

Így csak azt találja meg, ahol "lajos" vagy "lajoska" van, a "Lajos" vagy "LaJos", stb. neveket már nem.

[ Szerkesztve ]

Sk8erPeter

(#1189) lakisoft válasza martonx (#1183) üzenetére


lakisoft
veterán

Egyetértek. :) :R

(#1190) SektorFlop


SektorFlop
aktív tag

SQLite-ba dolgozok még mindig, és van egy táblám amibe hónapok szerepelnek. Szeretném elkerül azt hogy egy hónap több rekordba is szerepeljen, szóval pl a Január csak egyszer szerepelhessen a táblámba, van erre valami SQL okosság, vagy vagy le kell kérdeznem előtte táblát és az alapján eldönteni hogy mehet e feltöltés vagy nem?

"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."

(#1191) martonx válasza SektorFlop (#1190) üzenetére


martonx
veterán

le kell kérdezni. Csodák nincsenek.

Én kérek elnézést!

(#1192) bpx válasza SektorFlop (#1190) üzenetére


bpx
őstag

unique constraint a hónap oszlopára, és így nem szerepelhet kétszer ugyanaz az érték abban az oszlopban

feltöltésnél hibát fog dobni ha olyat akarsz feltölteni, ami már van, ezt kezelni kell

(#1193) SektorFlop válasza bpx (#1192) üzenetére


SektorFlop
aktív tag

aham valami ilyesmi kell nekem, köszi megnézem... ha nincs más akkor marad az hogy előtte lekérdezem.

"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."

(#1194) SektorFlop válasza bpx (#1192) üzenetére


SektorFlop
aktív tag

nagyon jól működik, most már csak annyit kell megoldanom hogy ne írja ki akkor is hogy sikeres feltöltés :DD

Még egyszer köszönöm a segítséget!!

"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."

(#1195) WolfLenny


WolfLenny
senior tag

Üdv.!

Egy olyan kérdésem lenne, hogy adott egy kb. 4-500 MB méretű csv. Kb. 1-1.5 millió rekord kb. 40 mezővel.

A teszt felszedése 140.000 rekordot tartalmazott és több mint 1 órán keresztül szedte fel.
Ezt lehetne valahogy gyorsítani?

Előre is köszi a választ...

(#1196) martonx válasza WolfLenny (#1195) üzenetére


martonx
veterán

Valahogy biztos. Ennek a méretnek nem órákig, hanem másodpercekig, na jó maximum 1-2 percig kellene futnia.
Mivel semmi konkrétumot nem írtál, így nehéz konkrétan segíteni.

Én kérek elnézést!

(#1197) lakisoft válasza WolfLenny (#1195) üzenetére


lakisoft
veterán

Ez elsősorban a server I/O teljesítményétől függ. Milyen gépen és milyen adatbázissal próbáltad/dolgozol?

(#1198) rum-cajsz válasza WolfLenny (#1195) üzenetére


rum-cajsz
őstag

Ha ezt a "felszedést" excel csinálta egy p4-es gépen, akkor teljesen ok az egy óra.

Egyéb esetekben jobban le kellene írnod, hogy mivel akartad betölteni hová, mert nagyon nem mindegy!

=Kilroy was here============================ooO=*(_)*=Ooo=======

(#1199) WolfLenny


WolfLenny
senior tag

Köszi a válaszokat.

Egy P-4s gép csinálta ugyan, de az a furcsa, hogy egy ilyen művelet foxproban ugyanezen a gépen pár másodperc.

MySQL + PHP vezérléssel próbáltuk.

(#1200) martonx válasza WolfLenny (#1199) üzenetére


martonx
veterán

Egyrészt a PHP mint interpreter nyelv az ilyen műveletekre alapvetően kb. 100X lassabb (lehet, hogy cak 10-szer, erről ne nyissunk vitát), mint egy compiled (pl. java, .net) nyelv.
Másrészt ha ezen a szerencsétlen P4-esen még emellett egy MySQL-t is futtatsz, és mindehhez egy ősrégi lassú vinyú kerreg alatta, akkor nem csoda ez a futásidő.

Én kérek elnézést!

Útvonal

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