Discussion:
Ayuda con indices
(too old to reply)
roger gue
2005-05-24 15:45:02 UTC
Permalink
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
Jaime Casanova
2005-05-24 15:55:34 UTC
Permalink
Post by roger gue
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
http://www.postgresql.org/docs/8.0/static/indexes.html
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
roger gue
2005-05-24 16:06:29 UTC
Permalink
Hopla gracias por la pronta respuesta Jaime Casanova, ya comense a
leerlo, pero tengo un prob no se muy bien ingles, de todas formas es
de mucha ayuda estoy comenzando a traducir, si alguien me puede dar un
pequño ejemplo en español estaria muy agradecido
Post by Jaime Casanova
Post by roger gue
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
http://www.postgresql.org/docs/8.0/static/indexes.html
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
Alicia Mc Millan Barrera
2005-05-24 16:13:09 UTC
Permalink
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a modo
de ejemplo

-- Creación tabla PRUEBA



CREATE TABLE "PRUEBA"

(

login char(15) NOT NULL,

passw char(10) NOT NULL,

"creationDateUser" date NOT NULL,

"cellPhone" numeric,

CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data

)

WITHOUT OIDS TABLESPACE user_data;

ALTER TABLE "PRUEBA" OWNER TO postgres;

COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';

COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';

COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';

COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';

COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';

CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"

(login)

TABLESPACE indx_data;



CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"

("creationDateUser")

TABLESPACE indx_data;

GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;

----- Original Message -----
From: "roger gue" <rockobop-***@public.gmane.org>
To: <pgsql-es-ayuda-RDL/***@public.gmane.org>
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices


Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios

---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
roger gue
2005-05-24 16:13:14 UTC
Permalink
si no entiendo mal lo q hace es q si se lo asocia a una funcion q
actualiza las fechas de ingreso de usuarios lo q hace el indice es
generar una actualizacion en la tabla, y si es q hubieran
dependendientes tb en ellas? espero haber entendido el ejemplo,
garcias Alicia por tu ayuda
suerte
Post by Alicia Mc Millan Barrera
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a modo
de ejemplo
-- Creación tabla PRUEBA
CREATE TABLE "PRUEBA"
(
login char(15) NOT NULL,
passw char(10) NOT NULL,
"creationDateUser" date NOT NULL,
"cellPhone" numeric,
CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data
)
WITHOUT OIDS TABLESPACE user_data;
ALTER TABLE "PRUEBA" OWNER TO postgres;
COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';
COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';
COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';
COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';
COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';
CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"
(login)
TABLESPACE indx_data;
CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"
("creationDateUser")
TABLESPACE indx_data;
GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;
----- Original Message -----
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
Alicia Mc Millan Barrera
2005-05-24 16:31:15 UTC
Permalink
No este solo estaba creando un indice a través de un script, que se llama
("creationDateUser")
ahora cuando tu crees una función cuando filtres en un join, puedes hacerlo
a través de ese índice, la consulta sería mas rápida.
Ahora si tengo tablas que dependen de esta tabla, lo que hago es colocarle
la llave primaria de la tabla padre en la tabla hijo y
en la tabla hijo, coloco ambos campos como llave primaria de la tabla hijo
es decir,

CONSTRAINT "tablahijo_LOGIN_PK" PRIMARY KEY (login, xxxx) USING INDEX
TABLESPACE indx_data

, además creo indices separados en la tabla hijo.
Y como te digo cuando creas la función puedes accesar mas rapidamente la
tabla, solo para eso.


----- Original Message -----
From: "roger gue" <rockobop-***@public.gmane.org>
To: "Alicia Mc Millan Barrera" <amcmillan-***@public.gmane.org>
Cc: <pgsql-es-ayuda-RDL/***@public.gmane.org>
Sent: Tuesday, May 24, 2005 12:13 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices


si no entiendo mal lo q hace es q si se lo asocia a una funcion q
actualiza las fechas de ingreso de usuarios lo q hace el indice es
generar una actualizacion en la tabla, y si es q hubieran
dependendientes tb en ellas? espero haber entendido el ejemplo,
garcias Alicia por tu ayuda
suerte
Post by Alicia Mc Millan Barrera
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a modo
de ejemplo
-- Creación tabla PRUEBA
CREATE TABLE "PRUEBA"
(
login char(15) NOT NULL,
passw char(10) NOT NULL,
"creationDateUser" date NOT NULL,
"cellPhone" numeric,
CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data
)
WITHOUT OIDS TABLESPACE user_data;
ALTER TABLE "PRUEBA" OWNER TO postgres;
COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';
COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';
COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';
COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';
COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';
CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"
(login)
TABLESPACE indx_data;
CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"
("creationDateUser")
TABLESPACE indx_data;
GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;
----- Original Message -----
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
roger gue
2005-05-24 16:58:32 UTC
Permalink
ahh ok hao si me qudo clara la idea, solo una preguntita mas
cuando voy a la ayuda de postgres me lanza lo siguiente:

CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( columna [ nombre_operador] [, ...] )
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( nombre_funcion( r">columnale> [, ... ])
nombre_operador )

que puedo entender por nombre_acceso y nombre_operador, y si es q
tuviera las tablas

/*==============================================================*/
/* table: cronograma */
/*==============================================================*/
create table cronograma (
fecha date ,
cod_cronograma varchar(10),
constraint pk_cronograma primary key (cod_cronograma)
);

*==============================================================*/
/* table: actividad */
/*==============================================================*/
create table actividad (
cod_actividad varchar(10),
cod_cronograma varchar(8),
nombre_actividad varchar(30),
constraint pk_actividad primary key (cod_actividad)
);

/*==============================================================*/
/* table: tarea */
/*==============================================================*/
create table tarea (
cod_tarea varchar(10) not null,
cod_actividad varchar(10) null,
nombre_tarea varchar(50) null,
constraint pk_tarea primary key (cod_tarea)
);

alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;

alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;

si ya tengo esta base de datos, con llaves foraneas para cada tabla y
como se ve cada una dependiente de la otra podria hacer algo asi

CREATE INDEX ind_actv ON actiidad (cod_actividad);

ALTER TABLEe tareaADD INDEX tarea_activ PRIMARY KEY (cod_tarea) USING
INDEX ind_actv;
Post by Alicia Mc Millan Barrera
No este solo estaba creando un indice a través de un script, que se llama
("creationDateUser")
ahora cuando tu crees una función cuando filtres en un join, puedes hacerlo
a través de ese índice, la consulta sería mas rápida.
Ahora si tengo tablas que dependen de esta tabla, lo que hago es colocarle
la llave primaria de la tabla padre en la tabla hijo y
en la tabla hijo, coloco ambos campos como llave primaria de la tabla hijo
es decir,
CONSTRAINT "tablahijo_LOGIN_PK" PRIMARY KEY (login, xxxx) USING INDEX
TABLESPACE indx_data
, además creo indices separados en la tabla hijo.
Y como te digo cuando creas la función puedes accesar mas rapidamente la
tabla, solo para eso.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:13 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
si no entiendo mal lo q hace es q si se lo asocia a una funcion q
actualiza las fechas de ingreso de usuarios lo q hace el indice es
generar una actualizacion en la tabla, y si es q hubieran
dependendientes tb en ellas? espero haber entendido el ejemplo,
garcias Alicia por tu ayuda
suerte
Post by Alicia Mc Millan Barrera
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a
modo
Post by Alicia Mc Millan Barrera
de ejemplo
-- Creación tabla PRUEBA
CREATE TABLE "PRUEBA"
(
login char(15) NOT NULL,
passw char(10) NOT NULL,
"creationDateUser" date NOT NULL,
"cellPhone" numeric,
CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data
)
WITHOUT OIDS TABLESPACE user_data;
ALTER TABLE "PRUEBA" OWNER TO postgres;
COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';
COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';
COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';
COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';
COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';
CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"
(login)
TABLESPACE indx_data;
CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"
("creationDateUser")
TABLESPACE indx_data;
GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;
----- Original Message -----
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
Jaime Casanova
2005-05-24 17:15:49 UTC
Permalink
Post by roger gue
ahh ok hao si me qudo clara la idea, solo una preguntita mas
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( columna [ nombre_operador] [, ...] )
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( nombre_funcion( r">columnale> [, ... ])
nombre_operador )
que puedo entender por nombre_acceso y nombre_operador, y si es q
tuviera las tablas
/*==============================================================*/
/* table: cronograma */
/*==============================================================*/
create table cronograma (
fecha date ,
cod_cronograma varchar(10),
constraint pk_cronograma primary key (cod_cronograma)
);
*==============================================================*/
/* table: actividad */
/*==============================================================*/
create table actividad (
cod_actividad varchar(10),
cod_cronograma varchar(8),
nombre_actividad varchar(30),
constraint pk_actividad primary key (cod_actividad)
);
/*==============================================================*/
/* table: tarea */
/*==============================================================*/
create table tarea (
cod_tarea varchar(10) not null,
cod_actividad varchar(10) null,
nombre_tarea varchar(50) null,
constraint pk_tarea primary key (cod_tarea)
);
alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;
alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;
si ya tengo esta base de datos, con llaves foraneas para cada tabla y
como se ve cada una dependiente de la otra podria hacer algo asi
CREATE INDEX ind_actv ON actiidad (cod_actividad);
ALTER TABLEe tareaADD INDEX tarea_activ PRIMARY KEY (cod_tarea) USING
INDEX ind_actv;
al especificar primary key se crea un indice unique de forma
automatica sobre los campos del primary key
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
Jaime Casanova
2005-05-24 17:22:53 UTC
Permalink
En teoria deberias, si, crear un indice por cada campo que en otra
tabla es clave primaria.

Ej:


create table foo (
col1 integer primary key,
col2 text
);


create table foo_related (
col3 integer primary key,
foo_col1 integer not null references foo
);

create index foo_related_idx1 on foo_related(foo_col1) ;

Entre las dos tablas hay 3 indices:
1 en foo:
- sobre el campo col1 (indice unico, por primary key)
2 en foo_related:
- sobre el campo col3 (indice unico, por primary key)
- sobre el campo foo_col1 creado por mi (acepta valores
duplicados, es decir, no es indice unico)


PD:
access es el tipo de indice, si es btree, hash, gist, etc. si no
indicas nada usa btree. no indiques nada. los indices btree son los
que mas se usan y para las tablas que indicastes son los que
necesitas.
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
roger gue
2005-05-24 21:26:28 UTC
Permalink
Antes que nada Alicia y Jaime mil gracias por su colaboracion la
verdad q esta lista de ayuda es super .

Entonces dadas las tablas q tengo Jaime me aconsejarias utilizar
indices en vez de contraints asi como las manejo de esta forma

alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;

alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;

o algo q no entiendo es q los indices generan los constraints para
hacer referencia a las tablas de dependecia.
La verdar es que no los he utilizado, así que no se que va ahí, yo también
soy nueva en posgresql
pero me funcionó creando los índices como te lo envié anteriormente, lo que
sí le quité el UNIQUE al crear el
indice, porque como los tengo como llave primaria, esto actua similar como
llave primaria, si necesitas,
también cree una función para ingresar, selecionar, modificar y eliminar en
una tabla y los probé desde
psql.
Por lo menos funcionan.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:58 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
ahh ok hao si me qudo clara la idea, solo una preguntita mas
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( columna [ nombre_operador] [, ...] )
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( nombre_funcion( r">columnale> [, ... ])
nombre_operador )
que puedo entender por nombre_acceso y nombre_operador, y si es q
tuviera las tablas
/*==============================================================*/
/* table: cronograma */
/*==============================================================*/
create table cronograma (
fecha date ,
cod_cronograma varchar(10),
constraint pk_cronograma primary key (cod_cronograma)
);
*==============================================================*/
/* table: actividad */
/*==============================================================*/
create table actividad (
cod_actividad varchar(10),
cod_cronograma varchar(8),
nombre_actividad varchar(30),
constraint pk_actividad primary key (cod_actividad)
);
/*==============================================================*/
/* table: tarea */
/*==============================================================*/
create table tarea (
cod_tarea varchar(10) not null,
cod_actividad varchar(10) null,
nombre_tarea varchar(50) null,
constraint pk_tarea primary key (cod_tarea)
);
alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;
alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;
si ya tengo esta base de datos, con llaves foraneas para cada tabla y
como se ve cada una dependiente de la otra podria hacer algo asi
CREATE INDEX ind_actv ON actiidad (cod_actividad);
ALTER TABLEe tareaADD INDEX tarea_activ PRIMARY KEY (cod_tarea) USING
INDEX ind_actv;
Post by Alicia Mc Millan Barrera
No este solo estaba creando un indice a través de un script, que se llama
("creationDateUser")
ahora cuando tu crees una función cuando filtres en un join, puedes
hacerlo
Post by Alicia Mc Millan Barrera
a través de ese índice, la consulta sería mas rápida.
Ahora si tengo tablas que dependen de esta tabla, lo que hago es colocarle
la llave primaria de la tabla padre en la tabla hijo y
en la tabla hijo, coloco ambos campos como llave primaria de la tabla hijo
es decir,
CONSTRAINT "tablahijo_LOGIN_PK" PRIMARY KEY (login, xxxx) USING INDEX
TABLESPACE indx_data
, además creo indices separados en la tabla hijo.
Y como te digo cuando creas la función puedes accesar mas rapidamente la
tabla, solo para eso.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:13 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
si no entiendo mal lo q hace es q si se lo asocia a una funcion q
actualiza las fechas de ingreso de usuarios lo q hace el indice es
generar una actualizacion en la tabla, y si es q hubieran
dependendientes tb en ellas? espero haber entendido el ejemplo,
garcias Alicia por tu ayuda
suerte
Post by Alicia Mc Millan Barrera
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a
modo
Post by Alicia Mc Millan Barrera
de ejemplo
-- Creación tabla PRUEBA
CREATE TABLE "PRUEBA"
(
login char(15) NOT NULL,
passw char(10) NOT NULL,
"creationDateUser" date NOT NULL,
"cellPhone" numeric,
CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data
)
WITHOUT OIDS TABLESPACE user_data;
ALTER TABLE "PRUEBA" OWNER TO postgres;
COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';
COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';
COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';
COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';
COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';
CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"
(login)
TABLESPACE indx_data;
CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"
("creationDateUser")
TABLESPACE indx_data;
GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;
----- Original Message -----
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor envía "subscribe-nomail"
a los suscriptores de la lista
Jorge Vidal Martinez
2005-05-25 03:25:17 UTC
Permalink
No, espera - las constraint son para mantener la integridad referencial.
Y los indices son para accesar ( acceder ) a la información.
Como lees, no son opuestos.
Podes usar las dos.

Muchos libros de Sql, dicen que las PK generan un indice default con los
atributos definido en ella.
Aunque por vicio profesional, yo los creo igual

Saludos

----- Original Message -----
From: "roger gue" <rockobop-***@public.gmane.org>
To: "Alicia Mc Millan Barrera" <amcmillan-***@public.gmane.org>
Cc: <pgsql-es-ayuda-RDL/***@public.gmane.org>
Sent: Tuesday, May 24, 2005 6:26 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices


Antes que nada Alicia y Jaime mil gracias por su colaboracion la
verdad q esta lista de ayuda es super .

Entonces dadas las tablas q tengo Jaime me aconsejarias utilizar
indices en vez de contraints asi como las manejo de esta forma

alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;

alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;

o algo q no entiendo es q los indices generan los constraints para
hacer referencia a las tablas de dependecia.
La verdar es que no los he utilizado, así que no se que va ahí, yo también
soy nueva en posgresql
pero me funcionó creando los índices como te lo envié anteriormente, lo que
sí le quité el UNIQUE al crear el
indice, porque como los tengo como llave primaria, esto actua similar como
llave primaria, si necesitas,
también cree una función para ingresar, selecionar, modificar y eliminar en
una tabla y los probé desde
psql.
Por lo menos funcionan.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:58 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
ahh ok hao si me qudo clara la idea, solo una preguntita mas
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( columna [ nombre_operador] [, ...] )
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( nombre_funcion( r">columnale> [, ... ])
nombre_operador )
que puedo entender por nombre_acceso y nombre_operador, y si es q
tuviera las tablas
/*==============================================================*/
/* table: cronograma */
/*==============================================================*/
create table cronograma (
fecha date ,
cod_cronograma varchar(10),
constraint pk_cronograma primary key (cod_cronograma)
);
*==============================================================*/
/* table: actividad */
/*==============================================================*/
create table actividad (
cod_actividad varchar(10),
cod_cronograma varchar(8),
nombre_actividad varchar(30),
constraint pk_actividad primary key (cod_actividad)
);
/*==============================================================*/
/* table: tarea */
/*==============================================================*/
create table tarea (
cod_tarea varchar(10) not null,
cod_actividad varchar(10) null,
nombre_tarea varchar(50) null,
constraint pk_tarea primary key (cod_tarea)
);
alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;
alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;
si ya tengo esta base de datos, con llaves foraneas para cada tabla y
como se ve cada una dependiente de la otra podria hacer algo asi
CREATE INDEX ind_actv ON actiidad (cod_actividad);
ALTER TABLEe tareaADD INDEX tarea_activ PRIMARY KEY (cod_tarea) USING
INDEX ind_actv;
Post by Alicia Mc Millan Barrera
No este solo estaba creando un indice a través de un script, que se llama
("creationDateUser")
ahora cuando tu crees una función cuando filtres en un join, puedes
hacerlo
Post by Alicia Mc Millan Barrera
a través de ese índice, la consulta sería mas rápida.
Ahora si tengo tablas que dependen de esta tabla, lo que hago es colocarle
la llave primaria de la tabla padre en la tabla hijo y
en la tabla hijo, coloco ambos campos como llave primaria de la tabla hijo
es decir,
CONSTRAINT "tablahijo_LOGIN_PK" PRIMARY KEY (login, xxxx) USING INDEX
TABLESPACE indx_data
, además creo indices separados en la tabla hijo.
Y como te digo cuando creas la función puedes accesar mas rapidamente la
tabla, solo para eso.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:13 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
si no entiendo mal lo q hace es q si se lo asocia a una funcion q
actualiza las fechas de ingreso de usuarios lo q hace el indice es
generar una actualizacion en la tabla, y si es q hubieran
dependendientes tb en ellas? espero haber entendido el ejemplo,
garcias Alicia por tu ayuda
suerte
Post by Alicia Mc Millan Barrera
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a
modo
Post by Alicia Mc Millan Barrera
de ejemplo
-- Creación tabla PRUEBA
CREATE TABLE "PRUEBA"
(
login char(15) NOT NULL,
passw char(10) NOT NULL,
"creationDateUser" date NOT NULL,
"cellPhone" numeric,
CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data
)
WITHOUT OIDS TABLESPACE user_data;
ALTER TABLE "PRUEBA" OWNER TO postgres;
COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';
COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';
COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';
COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';
COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';
CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"
(login)
TABLESPACE indx_data;
CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"
("creationDateUser")
TABLESPACE indx_data;
GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;
----- Original Message -----
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
---------------------------(fin del
mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor envía "subscribe-nomail"
a los suscriptores de la lista
---------------------------(fin del mensaje)---------------------------
TIP 2: puedes desuscribirte de todas las listas simultáneamente
(envíe "unregister TuDirecciónDeCorreo" a majordomo-RDL/***@public.gmane.org)
--
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.322 / Virus Database: 266.11.16 - Release Date: 24/05/2005
roger gue
2005-05-25 11:08:19 UTC
Permalink
ahh ok ahora si tendo vlaro el panorama vale gracias por su a ayuda a
ambos y se q es lo q tengo q hacer en mi db saludos a ambos
suerte
Roger
Post by Jorge Vidal Martinez
No, espera - las constraint son para mantener la integridad referencial.
Y los indices son para accesar ( acceder ) a la información.
Como lees, no son opuestos.
Podes usar las dos.
Muchos libros de Sql, dicen que las PK generan un indice default con los
atributos definido en ella.
Aunque por vicio profesional, yo los creo igual
Saludos
----- Original Message -----
Sent: Tuesday, May 24, 2005 6:26 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
Antes que nada Alicia y Jaime mil gracias por su colaboracion la
verdad q esta lista de ayuda es super .
Entonces dadas las tablas q tengo Jaime me aconsejarias utilizar
indices en vez de contraints asi como las manejo de esta forma
alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;
alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;
o algo q no entiendo es q los indices generan los constraints para
hacer referencia a las tablas de dependecia.
La verdar es que no los he utilizado, así que no se que va ahí, yo también
soy nueva en posgresql
pero me funcionó creando los índices como te lo envié anteriormente, lo que
sí le quité el UNIQUE al crear el
indice, porque como los tengo como llave primaria, esto actua similar como
llave primaria, si necesitas,
también cree una función para ingresar, selecionar, modificar y eliminar en
una tabla y los probé desde
psql.
Por lo menos funcionan.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:58 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
ahh ok hao si me qudo clara la idea, solo una preguntita mas
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( columna [ nombre_operador] [, ...] )
CREATE [ UNIQUE ] INDEX nombre_indice ON tabla
[ USING nombre_acceso ] ( nombre_funcion( r">columnale> [, ... ])
nombre_operador )
que puedo entender por nombre_acceso y nombre_operador, y si es q
tuviera las tablas
/*==============================================================*/
/* table: cronograma */
/*==============================================================*/
create table cronograma (
fecha date ,
cod_cronograma varchar(10),
constraint pk_cronograma primary key (cod_cronograma)
);
*==============================================================*/
/* table: actividad */
/*==============================================================*/
create table actividad (
cod_actividad varchar(10),
cod_cronograma varchar(8),
nombre_actividad varchar(30),
constraint pk_actividad primary key (cod_actividad)
);
/*==============================================================*/
/* table: tarea */
/*==============================================================*/
create table tarea (
cod_tarea varchar(10) not null,
cod_actividad varchar(10) null,
nombre_tarea varchar(50) null,
constraint pk_tarea primary key (cod_tarea)
);
alter table actividad
add constraint fk_activida_de_cronogra foreign key (cod_cronograma)
references cronograma (cod_cronograma)
on delete restrict on update cascade;
alter table tarea
add constraint fk_tarea_a_tiene_activida foreign key
(cod_actividad) references actividad (cod_actividad)
on delete restrict on update cascade;
si ya tengo esta base de datos, con llaves foraneas para cada tabla y
como se ve cada una dependiente de la otra podria hacer algo asi
CREATE INDEX ind_actv ON actiidad (cod_actividad);
ALTER TABLEe tareaADD INDEX tarea_activ PRIMARY KEY (cod_tarea) USING
INDEX ind_actv;
Post by Alicia Mc Millan Barrera
No este solo estaba creando un indice a través de un script, que se llama
("creationDateUser")
ahora cuando tu crees una función cuando filtres en un join, puedes
hacerlo
Post by Alicia Mc Millan Barrera
a través de ese índice, la consulta sería mas rápida.
Ahora si tengo tablas que dependen de esta tabla, lo que hago es colocarle
la llave primaria de la tabla padre en la tabla hijo y
en la tabla hijo, coloco ambos campos como llave primaria de la tabla hijo
es decir,
CONSTRAINT "tablahijo_LOGIN_PK" PRIMARY KEY (login, xxxx) USING INDEX
TABLESPACE indx_data
, además creo indices separados en la tabla hijo.
Y como te digo cuando creas la función puedes accesar mas rapidamente la
tabla, solo para eso.
----- Original Message -----
Sent: Tuesday, May 24, 2005 12:13 PM
Subject: Re: [pgsql-es-ayuda] Ayuda con indices
si no entiendo mal lo q hace es q si se lo asocia a una funcion q
actualiza las fechas de ingreso de usuarios lo q hace el indice es
generar una actualizacion en la tabla, y si es q hubieran
dependendientes tb en ellas? espero haber entendido el ejemplo,
garcias Alicia por tu ayuda
suerte
Post by Alicia Mc Millan Barrera
Aqui te envio un scrip de prueba, que crea una tabla con sus indices a
modo
Post by Alicia Mc Millan Barrera
de ejemplo
-- Creación tabla PRUEBA
CREATE TABLE "PRUEBA"
(
login char(15) NOT NULL,
passw char(10) NOT NULL,
"creationDateUser" date NOT NULL,
"cellPhone" numeric,
CONSTRAINT "PRUEBA_LOGIN_PK" PRIMARY KEY (login) USING INDEX TABLESPACE
indx_data
)
WITHOUT OIDS TABLESPACE user_data;
ALTER TABLE "PRUEBA" OWNER TO postgres;
COMMENT ON TABLE "PRUEBA" IS 'Tabla de prueba';
COMMENT ON COLUMN "PRUEBA".login IS 'Identificación del usuario';
COMMENT ON COLUMN "PRUEBA".passw IS 'Contraseña del usuario';
COMMENT ON COLUMN "PRUEBA"."creationDateUser" IS 'Fecha de Creación
Usuario';
COMMENT ON COLUMN "PRUEBA"."cellPhone" IS 'Celular del usuario';
CREATE UNIQUE INDEX "PRUEBA_login_IDX" ON "PRUEBA"
(login)
TABLESPACE indx_data;
CREATE INDEX "PRUEBA_creationDateUser_IDX" ON "PRUEBA"
("creationDateUser")
TABLESPACE indx_data;
GRANT SELECT, UPDATE, INSERT, DELETE ON "PRUEBA" TO PUBLIC;
----- Original Message -----
Sent: Tuesday, May 24, 2005 11:45 AM
Subject: [pgsql-es-ayuda] Ayuda con indices
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
---------------------------(fin del
mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden
---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor envía "subscribe-nomail"
a los suscriptores de la lista
---------------------------(fin del mensaje)---------------------------
TIP 2: puedes desuscribirte de todas las listas simultáneamente
--
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.322 / Virus Database: 266.11.16 - Release Date: 24/05/2005
Jaime Casanova
2005-05-24 16:56:00 UTC
Permalink
Post by roger gue
Hola atodos por lo q lei los indeces ayudan a optimizar la DB o algo
por el estilo con funciones pero aun no se como implementarlos, si
alguien me pudiese pasar un ejemplo pequeño de indices con funciones y
decirme q es loq hace o darme la dir de algun tutorial se los
agradeceria mucho, soy nuevo en esto de Postgresql
gracias
adios
Creo entender que quieres crear indices sobre funciones y no sobre
campos de una tabla, es eso?

Traduccion libre del manual (asteriscos mios):

11.5. Indices sobre Expresiones

Un indice no necesita ser creado sobre un campo de la tabla, se pueden
crear indices sobre funciomes o expresiones calculadas a partir de una
o varias columnas de la tabla. Esta caracteristica es util para
obtener calculos rapidos sobre campos de la tabla.

Por ejemplo, una manera comun de hacer comparaciones sin tomar en
cuenta si son mayusculas o minusculas es usar la funcion lower:

SELECT * FROM test1 WHERE lower(col1) = 'value';

Esta consulta puede usar un indice, si alguno a sido definido sobre el
resultado de lower(col1):

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

Como otro ejemplo tenemos:

SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';

podria ser util crear un indice si esta clausula WHERE es muy
frecuentemente utilizada:

CREATE INDEX people_names ON people ((first_name || ' ' || last_name));

[ ... ]

Indices sobre expresiones o funciones son relativamente costosas de
mantener porque la expresion debe ser calculada para cada fila que se
este insertando o actualizando. Por lo tanto, deben ser usados
unicamente cuando la consulta que puede usar el indice es *muy*
frecuente.


Ademas, IIRC. solo obtienes ventaja de crear un indice sobre una
funcion si la funcion fue declarada como IMMUTABLE (o es que solo
puedes crear el indice si la funcion es IMMUTABLE)?

Basicamente, IMMUTABLE, significa que siempre que des los mismos
valores de entrada la funcion devolvera los mismos resultados.
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
Continue reading on narkive:
Loading...