Oracle - táblákban sorok számolása

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

Hozzászólások

Csak egy tipp, ha futtatod a compute statistics-et az adott tablara, akkor sem ad vissza helyes eredmenyt?

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 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)

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!".

--
deejayy DOT hu

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

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

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).

--
deejayy DOT hu

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..