Sí, puede haber inconvenientes. Si otra consulta examina un segmento de datos diferente que no está determinado por la fecha, podría tener un impacto en el rendimiento si las filas se extienden en más páginas de datos ahora. De la misma manera que su primera consulta se beneficia. Eso depende completamente de la información que no está en su pregunta.
otras consultas usando un PK de tabla (digamos id_foo)
Eso podría ser cualquier cosa . Depende de lo que tenga y de lo que consulte exactamente . La consulta de una sola fila no se ve afectada de ninguna manera, pero pueden serlo varias filas.
Tenga en cuenta que CLUSTER
reescribe la tabla en perfecto estado como lo VACUUM FULL
hace (elimina las tuplas muertas, compacta el tamaño físico de la tabla, reescribe los índices). Por lo tanto, es posible que vea un efecto positivo inmediato en el rendimiento de lectura independientemente del orden de clasificación. (Al igual que lo haría con VACUUM FULL
).
Después CLUSTER
, es posible que también desee ejecutar un plano VACUUM
en la tabla para actualizar el mapa de visibilidad , lo que puede permitir escaneos de solo índice.
Todos los beneficios de CLUSTER
reducir con la frecuencia de escritura.
Además, si tiene muchas actualizaciones en la tabla, CLUSTER
puede dañar el rendimiento de escritura al eliminar el "margen de maniobra" para las actualizaciones CALIENTES en la misma página de datos. Es posible que pueda contrarrestar ese efecto con una FILLFACTOR
configuración inferior a 100. De nuevo, depende de la localidad de las filas actualizadas, etc.
Relacionado:
De cualquier manera, probablemente no indexaría ni agruparía my_timestamp::date
, sino my_timestamp
directamente. Nada perdido, algo ganado. El yeso es muy barato, pero aún así es más barato no lanzarlo en absoluto. Y el índice puede admitir más consultas.
CREATE INDEX foo_my_timestamp_idx ON foo (my_timestamp);
Aunque un date
ocupa solo 4 bytes en el disco y timestamp
ocupa 8 bytes, la diferencia generalmente se pierde con el relleno de alineación para su caso, y ambos índices tienen exactamente el mismo tamaño.
El orden de varias filas en el mismo día resultante de su índice de expresión es arbitrario. Todavía puede haber dos marcas de tiempo idénticas, pero con 6 dígitos fraccionarios eso normalmente es muy poco probable. Aparte de eso, obtienes un orden determinista de filas, que puede tener varias ventajas.
También eliminé la DESC
palabra clave, ya que Postgres puede leer índices hacia atrás prácticamente tan rápido como hacia adelante. (¡Sin embargo, el orden de clasificación es importante para los índices de varias columnas!) Más:
En vez de:
SELECT * FROM foo
WHERE my_timestamp::date = '2016-07-25';
Ahora usarías:
SELECT * FROM foo
WHERE my_timestamp >= '2016-07-25' -- this is a timestamp literal now
WHERE my_timestamp < '2016-07-26';
Mismo rendimiento.
Si no necesita el componente de tiempo de la columna en absoluto , convertir la columna a date
...
¿Cómo retroceder CLUSTER
?
CLUSTER
en una sola tabla se puede revertir con ROLLBACK
cualquier otro comando regular siempre que la transacción no se haya confirmado.
Sin embargo, cito el manual :
CLUSTER
sin ningún parámetro vuelve a agrupar todas las tablas agrupadas previamente en la base de datos actual que posee el usuario llamante, o todas esas tablas si son llamadas por un superusuario. Esta forma de CLUSTER
no se puede ejecutar dentro de un bloque de transacciones.
Siempre puede ejecutar CLUSTER
con un índice diferente para cambiar el orden físico de las filas una vez más.
CLUSTER
? ¿NecesitoCLUSTER
usar una PK ahora?