Indice en Date
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
tengo un indice sobre una columna date.<br>
<br>
cuando hago una consulta ...<br>
<b>Select </b><br>
id<br>
<b>from </b><br>
ventas<br>
<b>WHERE </b><br>
fecha = date('12-JAN-2007')<br>
<br>
el planificador usa el indice<br>
<br>
pero cuando la restriccion es WHERE fecha < date('12-JAN-2007')<br>
<br>
se efectua un barrido secuencial.<br>
<br>
ni e indice ni la tabla ni la consulta son nada complejos<br>
<br>
que me olvido o que debo hacer para que se utilize el indice cuando uso
el operador menor<br>
<br>
<pre class="moz-signature" cols="72">
</pre>
</body>
</html>
te estoy redirigiendo a una lista en español, la lista a la que
enviaste este mensaje es en ingles y debes escribir en ingles al
mandar mensajes ahi...
On 4/27/07, Arturo Munive <arturomunive@gmail.com> wrote:
tengo un indice sobre una columna date.
cuando hago una consulta ...
Select
id
from
ventas
WHERE
fecha = date('12-JAN-2007')el planificador usa el indice
pero cuando la restriccion es WHERE fecha < date('12-JAN-2007')
se efectua un barrido secuencial.
ni e indice ni la tabla ni la consulta son nada complejos
que me olvido o que debo hacer para que se utilize el indice cuando uso el
operador menor
los indices no son siempre la mejor alternativa... puedes ejecutar la
sentencia con un EXPLAIN ANALYZE al inicio? y mostrarnos el resultado?
EXPLAIN ANALYZE
Select id from ventas
WHERE fecha = date('12-JAN-2007')
tambien seria bueno saber cuantos registros tiene la tabla, y cuantos
regresa ese select.
lo mas probable es que el planificador este esperando que el select
con < regrese casi todo el contenido de la tabla y por eso prefiere
leerla toda. tambien seria interesante saber que version de postgres
estas usando
--
Atentamente,
Jaime Casanova
"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Jaime Casanova escribi�:
te estoy redirigiendo a una lista en espa�ol, la lista a la que
enviaste este mensaje es en ingles y debes escribir en ingles al
mandar mensajes ahi...On 4/27/07, Arturo Munive <arturomunive@gmail.com> wrote:
tengo un indice sobre una columna date.
cuando hago una consulta ...
Select
id
from
ventas
WHERE
fecha = date('12-JAN-2007')el planificador usa el indice
pero cuando la restriccion es WHERE fecha < date('12-JAN-2007')
se efectua un barrido secuencial.
ni e indice ni la tabla ni la consulta son nada complejos
que me olvido o que debo hacer para que se utilize el indice cuando
uso el
operador menorlos indices no son siempre la mejor alternativa... puedes ejecutar la
sentencia con un EXPLAIN ANALYZE al inicio? y mostrarnos el resultado?EXPLAIN ANALYZE
Select id from ventas
WHERE fecha = date('12-JAN-2007')tambien seria bueno saber cuantos registros tiene la tabla, y cuantos
regresa ese select.lo mas probable es que el planificador este esperando que el select
con < regrese casi todo el contenido de la tabla y por eso prefiere
leerla toda. tambien seria interesante saber que version de postgres
estas usando
Hola gracias por redirigirme paropiadamente, la verda nunca habia
posteado en listas de este sitio
por eso me confind� :)
Buno el problema que ten�a lo resolv�, pero no se si es la manera correcta.
SELECT
id
FROM
ventas
WHERE
fecha < date('12-JAN-2007')
No usa el �ndice, pero cuando la consulta es
SELECT
id
FROM
ventas
WHERE
fecha::date < date('12-JAN-2007')
usa el �ndice como esperaba....
lo raro de todo esto es que la columna fecha est� definida del tipo date
Ahora no pongo el EXPLAIN ANALYZE debido a que estoy en otra computadora
donde no tengo acceso a la base de datos en la que estoy trabajando
(es el dia del trabajador aqui en Arequipa-Per�)
Bueno de todas formas gracias por la ayuda....
en todo caso es normal este cast a date dado que la columna de por si ya
es date
inlcuso si hago
SELECT
id
FROM
ventas
WHERE
fecha::date < '12-JAN-2007'::date
tambien funciona, con el �ndice , solo no funciona cuando no hago el
cast sobre la columna fecha
Saludos
On 5/1/07, Arturo <arturomunive@gmail.com> wrote:
On 4/27/07, Arturo Munive <arturomunive@gmail.com> wrote:
tengo un indice sobre una columna date.
cuando hago una consulta ...
Select
id
from
ventas
WHERE
fecha = date('12-JAN-2007')el planificador usa el indice
pero cuando la restriccion es WHERE fecha < date('12-JAN-2007')
se efectua un barrido secuencial.
ni e indice ni la tabla ni la consulta son nada complejos
Buno el problema que tenía lo resolví, pero no se si es la manera correcta.
SELECT
id
FROM
ventas
WHERE
fecha < date('12-JAN-2007')No usa el índice, pero cuando la consulta es
SELECT
id
FROM
ventas
WHERE
fecha::date < date('12-JAN-2007')usa el índice como esperaba....
lo raro de todo esto es que la columna fecha está definida del tipo date
que version de postgres estas usando? la version en la que yo probe es
la 8.3 que aun esta en desarrollo...
los bitmap index scan's aparecieron en la version 8.1 y se me ocurre
que estas usando una version anterior....
hare notar que la consulta solo devuelve 88 registros de 1000 que hay
en la tabla, en mi caso solo se usa un busqueda por indice simple
cuando se regresa una sola fila
sgerp=# explain analyze select * from prueba where fecha::date <
date('2007-10-01');
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on prueba (cost=4.93..11.03 rows=88 width=8)
(actual time=0.097..0.150 rows=88 loops=1)
Recheck Cond: (fecha < '2007-10-01'::date)
-> Bitmap Index Scan on idx_fecha (cost=0.00..4.91 rows=88
width=0) (actual time=0.075..0.075 rows=88 loops=1)
Index Cond: (fecha < '2007-10-01'::date)
Total runtime: 0.264 ms
(5 rows)
sgerp=# select count(*) from prueba where fecha::date < date('2007-10-01');
count
-------
88
(1 row)
--
Atentamente,
Jaime Casanova
"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook
Jaime Casanova escribi�:
On 5/1/07, Arturo <arturomunive@gmail.com> wrote:
On 4/27/07, Arturo Munive <arturomunive@gmail.com> wrote:
tengo un indice sobre una columna date.
cuando hago una consulta ...
Select
id
from
ventas
WHERE
fecha = date('12-JAN-2007')el planificador usa el indice
pero cuando la restriccion es WHERE fecha < date('12-JAN-2007')
se efectua un barrido secuencial.
ni e indice ni la tabla ni la consulta son nada complejos
Buno el problema que ten�a lo resolv�, pero no se si es la manera
correcta.SELECT
id
FROM
ventas
WHERE
fecha < date('12-JAN-2007')No usa el �ndice, pero cuando la consulta es
SELECT
id
FROM
ventas
WHERE
fecha::date < date('12-JAN-2007')usa el �ndice como esperaba....
lo raro de todo esto es que la columna fecha est� definida del tipo date
que version de postgres estas usando? la version en la que yo probe es
la 8.3 que aun esta en desarrollo...
los bitmap index scan's aparecieron en la version 8.1 y se me ocurre
que estas usando una version anterior....
hare notar que la consulta solo devuelve 88 registros de 1000 que hay
en la tabla, en mi caso solo se usa un busqueda por indice simple
cuando se regresa una sola filasgerp=# explain analyze select * from prueba where fecha::date <
date('2007-10-01');
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------Bitmap Heap Scan on prueba (cost=4.93..11.03 rows=88 width=8)
(actual time=0.097..0.150 rows=88 loops=1)
Recheck Cond: (fecha < '2007-10-01'::date)
-> Bitmap Index Scan on idx_fecha (cost=0.00..4.91 rows=88
width=0) (actual time=0.075..0.075 rows=88 loops=1)
Index Cond: (fecha < '2007-10-01'::date)
Total runtime: 0.264 ms
(5 rows)sgerp=# select count(*) from prueba where fecha::date <
date('2007-10-01');
count
-------
88
(1 row)
Uso la version 8.1
sobre XP
ma�ana que regreso a la oficina mando los expalain analyze en cada caso
asi como la estructura de tablas
hasta entonces.. saludos
Arturo escribi�:
ma�ana que regreso a la oficina mando los expalain analyze en cada caso
asi como la estructura de tablas
FWIW si s�lo tienes 1000 registros en tu tabla, es casi indiferente si
usa �ndices o no los usa. Si quieres hacer an�lisis de como crecera a
medida que a�adas m�s registros, prueba con varias decenas de miles como
m�nimo.
FWIW espero que hayas le�do el FAQ
http://www.postgresql.org/docs/faqs.FAQ.html#item4.6
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Alvaro Herrera escribi�:
Arturo escribi�:
ma�ana que regreso a la oficina mando los expalain analyze en cada caso
asi como la estructura de tablasFWIW si s�lo tienes 1000 registros en tu tabla, es casi indiferente si
usa �ndices o no los usa. Si quieres hacer an�lisis de como crecera a
medida que a�adas m�s registros, prueba con varias decenas de miles como
m�nimo.FWIW espero que hayas le�do el FAQ
http://www.postgresql.org/docs/faqs.FAQ.html#item4.
ahhhh eso es obvio... de todas formas mi duda era saber por que cuando ponia
WHERE
fecha < '11-Jan-2007'::date
no usaba el indice
y cuando ponia
WHERE
fecha::date < '11-Jan-2007'::date
si lo hac�a
en ambos casos con igual numero de filas
Arturo escribi�:
ahhhh eso es obvio... de todas formas mi duda era saber por que cuando ponia
WHERE
fecha < '11-Jan-2007'::dateno usaba el indice
y cuando ponia
WHERE
fecha::date < '11-Jan-2007'::datesi lo hac�a
en ambos casos con igual numero de filas
Es "fecha" una columna de tipo date, o es de otro tipo?
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Alvaro Herrera escribi�:
Arturo escribi�:
ahhhh eso es obvio... de todas formas mi duda era saber por que cuando ponia
WHERE
fecha < '11-Jan-2007'::dateno usaba el indice
y cuando ponia
WHERE
fecha::date < '11-Jan-2007'::datesi lo hac�a
en ambos casos con igual numero de filas
Es "fecha" una columna de tipo date, o es de otro tipo?
si la columna es date asi esta declarada por me sorprendo por lo del indice
Arturo escribi�:
Alvaro Herrera escribi�:
Arturo escribi�:
ahhhh eso es obvio... de todas formas mi duda era saber por que cuando
ponia
WHERE
fecha < '11-Jan-2007'::dateno usaba el indice
y cuando ponia
WHERE
fecha::date < '11-Jan-2007'::datesi lo hac�a
en ambos casos con igual numero de filas
Es "fecha" una columna de tipo date, o es de otro tipo?
si la columna es date asi esta declarada por me sorprendo por lo del indice
Puedes mostrar el EXPLAIN ANALYZE de ambos casos?
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Arturo escribi�:
Alvaro Herrera escribi�:
Arturo escribi�:
ahhhh eso es obvio... de todas formas mi duda era saber por que cuando
ponia
WHERE
fecha < '11-Jan-2007'::dateno usaba el indice
y cuando ponia
WHERE
fecha::date < '11-Jan-2007'::datesi lo hac�a
en ambos casos con igual numero de filas
Es "fecha" una columna de tipo date, o es de otro tipo?
si la columna es date asi esta declarada por me sorprendo por lo del indice
Por favor muestra tambien un \d de la tabla, que incluya todos los
indices que hay en ella.
Algo que puede estar pasando es que la columna de la izquierda sea
automaticamente cambiada de tipo por un cast implicito, y que se
seleccione un operador distinto. Por ej. que este haciendo
implicitamente esto:
WHERE
fecha::timestamp with time zone < '11-Jan-2007'::date
Creo que puede hacerlo porque existe un cast marcado "implicito" que
convierte date en timestamp with time zone, y ademas existe un operador
<(timestamp with time zone, date)
No acaba de quedarme claro _por que_ lo haria; quizas el indice tiene
alguna peculiaridad.
alvherre=# select format_type(castsource, -1), format_type(casttarget, -1), castcontext from pg_cast where castsource = 'date'::regtype;
format_type | format_type | castcontext
-------------+-----------------------------+-------------
date | timestamp without time zone | i
date | timestamp with time zone | i
date | text | i
date | character varying | a
date | bpchar | a
(5 rows)
alvherre=# select format_type(oprleft, -1), format_type(oprright, -1) from pg_operator where oprname = '<' and (oprleft='date'::regtype or oprright = 'date'::regtype);
format_type | format_type
-----------------------------+-----------------------------
date | date
date | timestamp without time zone
date | timestamp with time zone
timestamp without time zone | date
timestamp with time zone | date
(5 rows)
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Arturo Munive ha escrito:
tengo un indice sobre una columna date.
cuando hago una consulta ...
*Select *
id
*from *
ventas
*WHERE *
fecha = date('12-JAN-2007')el planificador usa el indice
pero cuando la restriccion es WHERE fecha < date('12-JAN-2007')
se efectua un barrido secuencial.
ni e indice ni la tabla ni la consulta son nada complejos
que me olvido o que debo hacer para que se utilize el indice cuando uso el operador menor
Depende de la distribuci�n de informaci�n en (y estad�sticas de) la
tabla en cuesti�n.
1. �Haz ejecutado ANALYZE? El planificador depende de estad�sticas
recientes para tomar una mejor decisi�n.
2. �En la tabla, la mayor�a de los datos son menor que la fecha de
ejemplo? Si es as�, y haz analizado, de igual forma el planificador
puede juzgar que el barrido secuencial es lo m�s indicado, ya que se
visitan la mayor�a de las p�ginas de datos.
3. Si haz analizado y la distribuci�n no es acorde a (2), entonces
puedes jugar con los par�metros de costo del archivo de configuraci�n,
o incrementar el target de estad�sticas de la columna en cuesti�n.
Consulta la documentaci�n para ver estos casos.
Suerte.