tuning too slow query optimizar optimisation index faster sql performance postgresql select

query - postgresql too slow



SQL SELECT speed int vs varchar (9)

Algo relativo. Sí, las INT serán más rápidas, pero la pregunta es si se nota en su situación. ¿Son los VARCHAR solo algunas palabras pequeñas o textos más largos? y cuantas filas hay en la mesa? Si solo hay unas pocas filas, lo más probable es que esté completamente almacenado en la memoria (cuando se solicita con frecuencia), en ese caso no notará mucha diferencia. Luego, por supuesto, hay indexación, que se vuelve más importante cuando la mesa crece. El uso de SSD puede ser más rápido que HD con consultas optimizadas. Además, los buenos controladores de disco a veces aceleran las consultas> 10x. Esto podría dejar espacio para simplemente usar VARCHARs, lo que hace que las consultas de lectura y escritura sean más sencillas (sin necesidad de escribir uniones complejas) y acelerar el desarrollo. Los puristas, sin embargo, estarán en desacuerdo y siempre normalizarán todo.

Estoy en el proceso de crear una mesa y me hizo pensar.

Si almaceno, digamos autos que tengan una marca (fx BMW, Audi ect.), ¿Habrá alguna diferencia en la velocidad de consulta si almaceno la marca como un int o varchar.

Asi es

SELECT * FROM table WHERE make = 5 AND ...;

Más rápido / más lento que

SELECT * FROM table WHERE make = ''audi'' AND ...;

o la velocidad será más o menos la misma?


Algunos puntos de referencia aproximados:

4 millones de registros en Postgres 9.x

Table A = base table with some columns Table B = Table A + extra column id of type bigint with random numbers Table C = Table A + extra column id of type text with random 16-char ASCII strings

Resultados en la computadora portátil 8GB RAM, i7, SSD:

Size on disk: A=261MB B=292MB C=322MB Non-indexed by id: select count(*), select by id: 450ms same on all tables Insert* one row per TX: B=9ms/record C=9ms/record Bulk insert* in single TX: B=140usec/record C=180usec/record Indexed by id, select by id: B=about 200us C=about 200us * inserts to the table already containing 4M records

por lo que parece que para esta configuración, siempre y cuando los índices quepan en la memoria RAM, el texto bigint vs 16-char no cambiará la velocidad.


Desglosando el rendimiento real de la comparación de cadenas frente a las no flotantes, en este caso cualquier tamaño sin firmar y firmado no importa. El tamaño es en realidad la verdadera diferencia en el rendimiento. Ya sea de 1 byte + (hasta 126 bytes) versus comparación de 1,2,4 u 8 bytes ... obviamente los no flotantes son más pequeños que las cadenas y los flotadores, y por lo tanto más amigables con la CPU en el ensamblaje.

La comparación de cadenas a cadenas en todos los idiomas es más lenta que algo que se puede comparar en 1 instrucción por la CPU. Incluso comparar 8 bytes (64 bits) en una CPU de 32 bits es aún más rápido que un VARCHAR (2) o más grande. * De nuevo, observe el ensamblaje producido (incluso a mano), se necesitan más instrucciones para comparar el carácter char por char que el de la CPU de 1 a 8 bytes.

Ahora, ¿cuánto más rápido? depende también del volumen de datos. Si simplemente comparas 5 con ''audi'', y eso es todo lo que tiene tu DB, la diferencia resultante es tan mínima que nunca la verías. Dependiendo de la CPU, la implementación (cliente / servidor, web / script, etc.) probablemente no lo verá hasta que llegue a unos pocos cientos de comparaciones en el servidor de bases de datos (tal vez incluso un par de miles de comparaciones antes de que se note).

  • Para anular la disputa incorrecta sobre las comparaciones de hash. La mayoría de los algoritmos hash en sí mismos son lentos, por lo que no se beneficia de cosas como CRC64 y menor. Durante más de 12 años desarrollé algoritmos de búsqueda para motores de búsqueda de varios condados y 7 años para las agencias de informes crediticios. Todo lo que pueda mantener en números será más rápido ... por ejemplo, números de teléfono, códigos postales, incluso moneda * 1000 (almacenamiento) div div 1000 (recuperación) es más rápido que DECIMAL para las comparaciones.

Ozz


En general, el int será más rápido. Cuanto más largo es el varchar, más lento se vuelve


Index or not, int es mucho más rápido (cuanto más varchar, más lento se pone).

Otra razón: el índice en el campo varchar será mucho más grande que en int. Para tablas más grandes, puede significar cientos de megabytes (y miles de páginas). Eso hace que el rendimiento sea mucho peor, ya que solo leer el índice requiere muchas lecturas de disco.


Las comparaciones de Int son más rápidas que las comparaciones de varchar, por el simple hecho de que los ints ocupan mucho menos espacio que los varchar.

Esto es válido tanto para el acceso indexado como para el no indexado. El camino más rápido es una columna int indexada.

Como veo que has etiquetado la pregunta postgreql, es posible que te interese el uso del espacio de diferentes tipos de fecha:


Será un poco más rápido usando un int en lugar de un varchar. Más importante para la velocidad es tener un índice en el campo que la consulta puede usar para encontrar los registros.

Hay otra razón para usar un int, y es para normalizar la base de datos. En lugar de tener el texto ''Mercedes-Benz'' almacenado miles de veces en la tabla, debe almacenar su identificación y tener la marca almacenada una vez en una tabla separada.


Si activa la indexación en cualquiera de los campos, será más rápido. En cuanto a su pregunta, creo que int es más rápido que varchar .


Sugerencia: si los valores posibles para el campo nunca cambian (o rara vez), puede usar ENUM como compromiso. Combina buena velocidad con buena legibilidad.