Samstag, Dezember 20, 2008

manuelle Einstellung der sort_area_size

bei Jonathan Lewis gibt's mal wieder einen wichtigen Hinweis: in 10.2.0.4 und diversen 11er Versionen gibt es einen Bug, der dafür sorgt, dass ein ALTER SESSION zur Abschaltung der automatischen PGA-Verteilung nicht unmittelbar wirksam wird: die Details dazu gibt es hier. In einem Kommentar zum Eintrag wird darauf hingewiesen, dass dieses Verhalten schon in 10.2.0.3 vorliegen soll. Das sollte ich mir bei Gelegenheit mit einem 10032er Trace anschauen.

Freitag, Dezember 12, 2008

INSERT ALL

kein ganz neues Feature aber sehr praktisch ist das INSERT ALL-Statement, mit dem man z.B. den Inhalt einer großen Tabelle auf mehrere kleine Tabellen verteilen kann. Das Vorgehen dabei sieht etwa folgendermaßen aus:

SQL> select * from emp;

EMPNO ENAME      JOB              MGR HIREDATE          SAL 
---------- ---------- --------- ---------- ---------- ---------- 
7369 SMITH      CLERK           7902 17.12.1980        800 
7499 ALLEN      SALESMAN        7698 20.02.1981       1600 
7521 WARD       SALESMAN        7698 22.02.1981       1250 
7566 JONES      MANAGER         7839 02.04.1981       2975 
7654 MARTIN     SALESMAN        7698 28.09.1981       1250 
7698 BLAKE      MANAGER         7839 01.05.1981       2850 
7782 CLARK      MANAGER         7839 09.06.1981       2450 
7788 SCOTT      ANALYST         7566 19.04.1987       3000 
7839 KING       PRESIDENT            17.11.1981       5000 
7844 TURNER     SALESMAN        7698 08.09.1981       1500 
7876 ADAMS      CLERK           7788 23.05.1987       1100 
7900 JAMES      CLERK           7698 03.12.1981        950 
7902 FORD       ANALYST         7566 03.12.1981       3000 
7934 MILLER     CLERK           7782 23.01.1982       1300 

14 Zeilen ausgewõhlt.

SQL> create table emp_old
2  as
3  select * from emp where 1 = 0;

Tabelle wurde erstellt.

SQL> create table emp_new
2  as
3  select * from emp where 1 = 0

Tabelle wurde erstellt.

SQL> insert all
2  when HIREDATE <= to_date('31.12.1981')
3  then into emp_old 
values(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL)
4  when HIREDATE > to_date('31.12.1981')
5  then into emp_new 
values(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL)
6  select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
7    from emp;

14 Zeilen wurden erstellt.

SQL> select * from emp_old;

EMPNO ENAME      JOB              MGR HIREDATE          SAL 
---------- ---------- --------- ---------- ---------- ---------- 
7369 SMITH      CLERK           7902 17.12.1980        800 
7499 ALLEN      SALESMAN        7698 20.02.1981       1600 
7521 WARD       SALESMAN        7698 22.02.1981       1250 
7566 JONES      MANAGER         7839 02.04.1981       2975 
7654 MARTIN     SALESMAN        7698 28.09.1981       1250 
7698 BLAKE      MANAGER         7839 01.05.1981       2850 
7782 CLARK      MANAGER         7839 09.06.1981       2450 
7839 KING       PRESIDENT            17.11.1981       5000 
7844 TURNER     SALESMAN        7698 08.09.1981       1500 
7900 JAMES      CLERK           7698 03.12.1981        950 
7902 FORD       ANALYST         7566 03.12.1981       3000 

11 Zeilen ausgewõhlt.

SQL> select * from emp_new;

EMPNO ENAME      JOB              MGR HIREDATE          SAL 
---------- ---------- --------- ---------- ---------- ---------- 
7788 SCOTT      ANALYST         7566 19.04.1987       3000 
7876 ADAMS      CLERK           7788 23.05.1987       1100 
7934 MILLER     CLERK           7782 23.01.1982       1300 

Nützlich an diesem Feature ist vor allem, dass hier nur ein FTS erforderlich ist, während das Füllen der Zieltabellen über mehrere Statements natürlich mehrere Zugriffe erfordern würde.

Mittwoch, Dezember 03, 2008

Bitmap Indizes

dunkel erinnere ich mich daran, dass es - seltene - Fälle gibt, in denen ein Bitmap-Index über mehrere Spalten sinnvoll sein kann, obwohl die Grundidee dieses Indextyps ja eher in der Kombination von Einzelindizes liegt. Was aber bei der Kombination mehrerer Spalten im Bitmap-Index berücksichtigt werden muss, ist, dass zwei zentrale Vorteile der Bitmap-Indizes bei Verwendung mehrerer Spalten verloren gehen: der Index ist dann nicht mehr klein und der Aufbau wird deutlich verlängert:
  • Fakten-Tabelle mit einer Größe von 18 GB.
  • der Aufbau von Bitmap-Indizes auf Einzelspalten benötigt jeweils ca. 25 min und die Größe der Indizes liegt bei < 2 GB.
  • der Aufbau eines kombinierten Index über 4 Spalten dauerte fast 5 h und die Größe des Index erreichte fast 60 GB (er ist also wahrscheinlich sogar größer als ein entsprechender B*Tree-Index).

In diesem Fall zumindest ist ein Bitmap-Index über die Spaltenkombination offenbar komplett nutzlos ...

Nachtrag 23.04.2011: der hier beschriebene Effekt ergibt sich aus der Clusterung der Daten in der Tabelle, wie ich später herausgefunden habe: http://martinpreiss.blogspot.com/search/label/Bitmap%20Index