2011-12-16 16 views

risposta

8

Da: DB2 docs - Clustering indexes

Anche se una tabella può avere diversi indici, solo un indice può essere un indice di clustering. Se non si definisce un indice di clustering per una tabella, DB2 riconosce il primo indice creato sulla tabella come indice di cluster implicito quando ordina le righe di dati.

Quindi no, per impostazione predefinita la chiave primaria NON è l'indice cluster della tabella.

Il primo indice creato, univoco o diverso, è l'indice di cluster "implicito" e DB2 tenta di inserire i record il più vicino possibile nell'ordine dei valori di questo indice.

Se successivamente si crea un altro indice e lo si identifica come cluster, DB2 lo identifica come indice di clustering ma non riorganizza i dati già presenti nella tabella. Questo può essere fatto con l'utility REORG.

+0

Mi sono sempre chiesto come mai tutto il clamore di REORG era qui intorno. Adesso lo so. Grazie! (anche se non sono l'OP) –

0

DB2 non crea un indice cluster per un PK per impostazione predefinita.

chiavi primarie

Una chiave primaria è un particolare tipo di chiave unica e non possono contenere valori nulli. Ad esempio, la colonna DEPTNO nella tabella DEPT è una chiave primaria.

Una tabella non può avere più di una chiave primaria. Le chiavi primarie sono opzionali e possono essere definite nelle istruzioni CREATE TABLE o ALTER TABLE.

L'indice univoco su una chiave primaria è denominato indice primario. Quando una chiave primaria viene definita in un'istruzione CREATE TABLE o ALTER TABLE, DB2 crea automaticamente l'indice primario se si verifica una delle seguenti condizioni:

DB2 sta funzionando in modalità nuova funzione e il tablespace è implicitamente creato. DB2 funziona in modalità nuova funzione, il tablespace viene creato in modo esplicito e il processore dello schema è in esecuzione. DB2 sta funzionando in modalità di conversione e il processore dello schema è in esecuzione. Se un indice univoco esiste già sulle colonne della chiave primaria quando è definito nell'istruzione ALTER TABLE, questo indice univoco viene designato come indice primario quando DB2 funziona in modalità nuova funzione e viene creato implicitamente il tablespace.

vediamo a: Keys DB2

+1

Questo indica che un * indice * viene creato per un PK. La domanda è, è un * indice cluster *? Cioè, il PK [indice] definisce la posizione fisica dei dati di riga che non sono coperti dal PK? –

+0

Vedere anche: [wikipedia: indice cluster] (http://en.wikipedia.org/wiki/Index_%28database%29#Clustered) e [indice cluster] (http://sql.wikis.com/wc.dll ? SQL ~ ClusteredIndex) e [Tipi di indice DB2] (http://publib.boulder.ibm.com/infocenter/zos/basics/index.jsp?topic=/com.ibm.db2z.doc.intro/db2z_keys.html) –

+0

Vedete 'indice clustered 'nella documentazione? allora ... DB2 non lo crei per un PK di default ... –

2

Dalla Publib (ciò presuppone DB2 per z/OS, versione 9)

Quando una tabella ha un indice cluster, un'istruzione INSERT provoca DB2 per inserire i record per quanto possibile in ordine del loro indice valori.Il primo indice che si definisce sulla tabella fornisce implicitamente come indice di clustering, a meno che non si specifichi esplicitamente CLUSTER quando si crea un nuovo indice o si modifichi un altro indice da . Ad esempio, se si innanzitutto definire un indice univoco sulla colonna EMPNO della tabella EMP, DB2 inserisce righe nella tabella EMP nell'ordine del numero di identificazione dipendente meno di definire esplicitamente un indice per essere l'indice cluster.

Si può vedere quale indice è l'indice di clustering per una tabella (in questo esempio, TEST.TABLE1) utilizzando la seguente query, se siete su z/OS:

SELECT NAME 
FROM SYSIBM.SYSINDEXES 
WHERE TBCREATOR = 'TEST' 
    AND TBNAME  = 'TABLE1' 
    AND CLUSTERING = 'Y' 

E questo per Linux/Unix/Windows (LUW):

SELECT * 
FROM SYSCAT.INDEXES 
WHERE TABSCHEMA = 'TEST' 
    AND TABNAME = 'TABLE1' 
    AND INDEXTYPE = 'CLUS' 
+0

grazie per la risposta. btw: quella query non funziona, ottengo questo errore 'SQL0206N" CLUSTERING "non è valido nel contesto in cui viene utilizzato. SQLSTATE = 42703' – Luka

+0

@Luka, quindi potresti utilizzare DB2 su LUW. Ho aggiunto una seconda query che dovrebbe darti le stesse informazioni. – bhamby

Problemi correlati