Página de inicio - Tecla de acceso: 1
Notas técnicas

MultiBase. Notas a la versión 2.0, release 05

Apéndice 2. Información devuelta por el optimizador de SQL

A continuación se explica una salida del optimizador de «queries» con la variable de entorno OUTOPT3. Aunque la sentencia SELECT no tiene ningún sentido, la salida producida permite comentar todas las diferentes posibilidades:

Sentence :
select * from clientes, provincias, albaranes, lineas
where albaranes.estado= "N"
and lineas.albaran >2
;

Table Order:
Index clientes.primary  = (1) Cols: 1 Used 0 EQ 0
Index clientes.i2_cliente = (2) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Index provincias.primary  = (1) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Index albaranes.primary   = (1) Cols: 1 Used 0 EQ 0
Index albaranes.i2_albaran = (2) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Index lineas.primary      = (1, 2) Cols: 2 Used 1 EQ 0 <-
Index lineas.alblin_ind   = (1) Cols: 1 Used 1 EQ 0
Index lineas.i_artlineas  = (3, 4) Cols: 2 Used 0 EQ 0
-Index Selected : primary -

Compare Tables:
 clientes (Keyparts 0 Unique, Rows 100)
 provincias (Keyparts 0 Unique, Rows 50)<-(num rows)
Compare Tables:
 provincias (Keyparts 0 Unique, Rows 50)
 albaranes (Keyparts 0 Unique, Rows 50, (ATTR=VAL))<- (ATTR=VAL)
Compare Tables:
 albaranes (Keyparts 0 Unique, Rows 50, (ATTR=VAL))
 lineas (Keyparts 1 Unique, Rows 521, (ATTR=VAL)) <- (Key parts)
 - Table Selected :lineas -

Index clientes.primary   = (1) Cols: 1 Used 0 EQ 0
Index clientes.i2_cliente = (2) Cols: 1 Used 0 EQ 0
-Index Selected : None-

Index provincias.primary  = (1) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Index albaranes.primary   = (1) Cols: 1 Used 0 EQ 0
Index albaranes.i2_albaran = (2) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Compare Tables:
    clientes (Keyparts 0 Unique, Rows 100)
    provincias (Keyparts 0 Unique, Rows 50) <- (num rows)
Compare Tables:
    provincias (Keyparts 0 Unique, Rows 50)
    albaranes (Keyparts 0 Unique, Rows 50, (ATTR=VAL)) <- (ATTR=VAL)
    - Table Selected : albaranes -

Index clientes.primary    = (1) Cols: 1 Used 0 EQ 0
Index clientes.i2_cliente = (2) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Index provincias.primary  = (1) Cols: 1 Used 0 EQ 0
-Index Selected : None -

Compare Tables:
    clientes (Keyparts 0 Unique, Rows 100)
    provincias (Keyparts 0 Unique, Rows 50) <- (num rows)
    - Table Selected : provincias -

Index clientes.primary    = (1) Cols: 1 Used 0 EQ 0
Index clientes.i2_cliente = (2) Cols: 1 Used 0 EQ 0
-Index Selected : None -

- Table Selected : clientes -

Optimization Results : 4 Tables
    Table [lineas] 1 Ranges
      Range[1] : key [start/length] ((0 / 4), (4 / 2))
    Table [albaranes] 0 Ranges
    Table [provincias] 0 Ranges
    Table [clientes] 0 Ranges

A continuación se explican las partes más significativas del fichero.

1.

Index lineas.primary  = (1, 2) Cols: 2 Used 1 EQ 0<-
Index lineas.alblin_ind = (1) Cols: 1 Used 1 EQ 0
Index lineas.i_artlineas = (3, 4) Cols: 2 Used 0 EQ 0
- Index Selected : primary -

En este párrafo, el optimizador analiza los índices de la tabla «lineas» y selecciona el mejor de ellos. La clave primaria está compuesta por dos columnas (1,2) correspondientes a las columnas «albaran» y «linea», de las cuales sólo una de ellas ha sido referenciada en la «WHERE» («albaran») con una condición distinta de «=» («Cols: 2 Used 1 EQ 0 <-»). La última flecha indicaría que ningún otro índice es mejor que el marcado.

2.

Compare Tables:
    clientes (Keyparts 0 Unique, Rows 100)
    provincias (Keyparts 0 Unique, Rows 50) <- (num rows)
Compare Tables:
    provincias (Keyparts 0 Unique, Rows 50)
    albaranes (Keyparts 0 Unique, Rows 50, (ATTR=VAL)) <- (ATTR=VAL)
Compare Tables:
    albaranes (Keyparts 0 Unique, Rows 50, (ATTR=VAL))
    lineas (Keyparts 1 Unique, Rows 521, (ATTR=VAL)) <- (Key parts)
    - Table Selected : lineas -

En este párrafo, el optimizador analiza las tablas y selecciona la mejor de ellas («lineas»).

Al comparar «clientes» con «provincias» selecciona «provincias» por tener un número inferior de filas («<- (num rows)»).

Al comparar «provincias» con «albaranes» selecciona «albaranes» porque a ella se accede mediante una condición del tipo «columna=VALOR» definida en la SELECT («<- (ATTR=VAL)»).

Al comparar «albaranes» con «lineas» selecciona «lineas» porque la condición «columna=VALOR» sobre la tabla «lineas» hace referencia a una columna que forma parte de un índice de esa tabla («<- (Key parts)»).

3.

Optimization Results : 4 Tables
    Table [lineas] 1 Ranges
      Range[1] : key [start/length] ((0 / 4), (4 / 2))
    Table [albaranes] 0 Ranges
    Table [provincias] 0 Ranges
    Table [clientes] 0 Ranges

El número de tablas implicadas es cuatro, y el orden de lectura de las mismas es el indicado. Las tablas en las que aparece «0 Ranges» son leídas secuencialmente. La línea:

Range[1] : key [start/length] ((0 / 4), (4 / 2))

indica que se va a utilizar sobre la tabla «lineas» un índice compuesto por dos columnas, la primera comienza en el byte 0 del registro y es de 4 bytes de longitud, mientras que la segunda comienza n el byte 4 y es de 2 bytes de longitud, lo cual se corresponde con la clave primaria.

« »