Sziasztok!
Van egy adatbázis. Van benne sok tábla, kb. 1,6TB a mérete. Írtam egy SQL scriptet, ami egy kicsit töröl innen-onnan.
A teszteléshez jó lenne látni, hogy mennyi adat volt a törlés előtt, és mennyi utána. Nem egyesével akarom nézegetni a táblákat.A tökéletes az lenne, ha lenne valami view, ami megmondaná, mennyi a sorok száma, szóval valami
S ELECT table_name, num_rows FROM user_tables
lenne az első ötletem.
Csak ez nem jó. Van egy táblám, erre a num_rows 10872-t ad vissza, a s elect count(*) from tabla meg 13477-et. Másik táblánál meg 616 az egyik szám is és a másik szám is. Harmadiknál 462 948 030 a num_rows, 462 915 694 a count(*). Ja, nem menet közben változik, ez egy másolat egy éles rendszerről.
Szóval ebből arra jutottam, hogy a num_rows nem lesz nekem jó.
Arra gondoltam, készítek egy egyszerű sql scriptet, valahogy úgy, hogy:
set escape \
spool myscript.sql
s elect 's elect \', table_name, '\', count(1) from ', table_name, '\;' from user_tables
De úgy látszik, az escape csak a ;-t védi, mert az aposztrófot látja a cucc.
Meg lehet ezt valahogy oldani elegánsan, egyszerűen?
Mert most nincs semmi ötletem, csak az, hogy nekilátok, és megcsinálom pythonnal dinamikus SQL-lel, menet közben összeállítva a query-ket.
G
- 2282 megtekintés
Hozzászólások
Csak egy tipp, ha futtatod a compute statistics-et az adott tablara, akkor sem ad vissza helyes eredmenyt?
- A hozzászóláshoz be kell jelentkezni
Jó volt a tipp. A compute statistics után a num_rows is helyes lett.
Végülis belegondolva logikus.
Köszi,
G
- A hozzászóláshoz be kell jelentkezni
oracle escape character -> google:
http://orafaq.com/faq/how_does_one_escape_special_characters_when_writi…
- A hozzászóláshoz be kell jelentkezni
Wow. Klassz link. Köszi!
G
- A hozzászóláshoz be kell jelentkezni
A count(*) az index alapú. Ergo ha nem firss az index, akkor hibas szamot kapsz vissza. Erdekes :)
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
AFAIK az index mindig szinkronban van magaval az adattablaval, nem?
- A hozzászóláshoz be kell jelentkezni
elvileg.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
a num_rows az ora statisztikákból adja vissza az adatot, ami elég messze állhat a valóságtól, attól függ hogy generálták. (a compute statistics pontos, viszont nem biztos, hogy egy terhelt rendszeren, vagy egy dw-n van idő lefuttatni)
a COUNT(*) egy normál query, ha van index, (mondjuk egy primary key) akkor index alapján dolgozik, ha nem, akkor full table scan. Ha egy index nincs szinkronban a táblában, akkor komoly gáz van az orával!!! (vannak kivételek, de egy sima tábla-index párosnál szinkronban KELL lennie)
- A hozzászóláshoz be kell jelentkezni
nincs itt gáz, mármint nem dokumentált gáz.
vannak olyan műveletek, amik papír szerint elrontják az indexeket, mert a tevékenységük ezt eredményezi (export-import, alter table ... move, stb). ezekkel együtt kell élni, viszont mindenhol dokumentálva van, sőt a tanfolyamokon is el szokták mondani, hogy "figyelj! ezután index rebuild kell!".
- A hozzászóláshoz be kell jelentkezni
nem mindig.
egy index lehet 'unusable' státuszban, ami azt jelenti, hogy nem konzisztens, nem használható, és nem is update-eli sorbeszúrásnál. ilyenkor a megfelelő parancsokkal konzisztenssé kell tenni (index rebuild, vagy drop-create)
- A hozzászóláshoz be kell jelentkezni
egy harmadik megoldaskent pedig:
oracle is tarolja a tablak neveit valamelyik belso tablajaban, reg voltam mar oracle elott, elfelejtettem a nevet, de egy join -al megoldhato
- A hozzászóláshoz be kell jelentkezni
ALL_TABLES
http://www.ss64.com/orad/ALL_TABLES.html
- A hozzászóláshoz be kell jelentkezni
vagy user_tables ha csak az adott user tulajdonaban levo tablakra vagy kivancsi.
Egyebkent hasonlot en is csinalok egy kis plsql scripttel.
Terles elott levalogatom a sorokszamat, torlok, megint megszamolom, majd kiirom az eredmenyt (sorok elotte, utana, torolt sorok szama)
- A hozzászóláshoz be kell jelentkezni
SQL%ROWCOUNT nem mondja meg a törölt sorok számát? Ha csak az kell...
- A hozzászóláshoz be kell jelentkezni
Ne haragudj, nem értem, mit akarsz mondani.
Ahogy látod abból, hogy mivel próbálkoztam, a user_tables-ből vettem ki a table_name oszlopot, meg a num_row oszlopot.
Miért lenne nekem jó, ha egy másik táblában a táblák nevei szintén megtalálhatóak? És mi oldható meg egy join-nal?
Üdv,
G
- A hozzászóláshoz be kell jelentkezni
sajnos ez nem így van.
mssql-nél pl igen, de ez oracle. az oracle nem tartja nyilván, hogy melyik táblában mennyi sor van, mert úgy gondolták a fejlesztők, hogy ez nagyban eltér az alapkoncepciójuktól. ezért kell mindig statisztikát gyűjteni (compute statistics, gather_stats_job - 10g-ben már automata, stb).
- A hozzászóláshoz be kell jelentkezni
hm, jó kis erőforrás igényesdolgot csináltál :)))
nem lenne egyszerűbb, ha mondjuk pl/sql-ből törölnél, és közben számlálnádmennyi sort töröltél?
ne adja a jó kapor szakállú logolnád mit csinálsz ?
Ha átadod a tudásod neked attól még nem lesz kevesebb belőle..
- A hozzászóláshoz be kell jelentkezni