create table test as select rownum rn , lpad(dbms_random.string('U',2),40,'X') v1 from dual connect by level < 10000; -- Ergebnis: -- 464825 bytes sent via SQL*Net to client - unsortiert -- 118679 bytes sent via SQL*Net to client - sortiert nach v1
Wenn ich aber eine harmlose nummerische Spalte mit Wiederholungen verwende, sehe ich zwar auch Unterschiede zwischen der sortierten und der unsortierten Ausführung, aber sie gehen seltsamerweise in die andere Richtung:
create table test as select rownum rn , mod(rownum, 3) v1 from dual connect by level < 10000; -- Ergebnis: -- 81653 bytes sent via SQL*Net to client - unsortiert -- 81653 bytes sent via SQL*Net to client - sortiert nach rn -- 90971 bytes sent via SQL*Net to client - sortiert nach v1
Mag sein, dass sich NUMBER-Werte bezüglich der Komprimierung tatsächlich anders verhalten. Oder mir entgeht noch irgendetwas Entscheidendes.
Nachtrag: nachdem mir auf Anhieb keine plausible Erklärung eingefallen war, habe ich Jonathan Lewis im Blog danach gefragt und folgende Antwort bekommen:
I think this may be a result of a fixed overhead for compression (or de-duplication, which might be a slightly better term). I think a row probably has to say “this column is the same as last time”, so I would look for a fixed size token to represent “same as last row”.Meiner Erfahrung nach bekommt man auf thematisch passende Fragen in den Blogs meiner Sidebar immer gute Antworten (so war's jedenfalls auch bei Richard Foote und Charles Hooper).
Test: create a table of 1,000,000 rows with a constant (e.g. 1000000001) and a variable (e.g. 1000000001 + rownum) column, set a large arraysize (5,000 is the max) then select each column in turn with autotrace traceonly statistics. See if the difference in volume is significant. It is, but there is a minimum volume of data per row which means you don’t see much of a saving with a single column of small numbers.
Keine Kommentare:
Kommentar veröffentlichen