FAQ de PostgreSQL en castellano actualizado
domingo, noviembre 20 2005 @ 03:25 ART
Vistas 9,779
La gente de postgresql.org.mx, se encargó de actualizar las FAQs (preguntas mas frecuentes) de PostgreSQL, aqui la versión actualizada:Preguntas Generales
1.1) ¿Qué es PostgreSQL y cómo se pronuncia?
1.2) ¿Cuáles son los derechos de autor de PostgreSQL?
1.3) ¿Qué plataformas soporta PostgreSQL?
1.4) ¿Dónde puedo obtener PostgreSQL?
1.5) ¿Dónde puedo obtener soporte?
1.6) ¿Cómo mando un reporte de error?
1.7) ¿Cuál es la última version?
1.8) ¿Qué documentación está disponible?
1.9) ¿Cómo encuentro información acerca de errores conocidos o características faltantes?
1.10) ¿Cómo aprendo SQL?
1.11) ¿Cómo me puedo unir al equipo de desarrollo?
1.12) ¿Cómo se compara PostgreSQL con otros DBMSs?
1.13) ¿Quién controla PostgreSQL?
Preguntas de clientes de usuario
2.1) ¿Qué interfaces estan disponibles para PostgreSQL?
2.2) ¿Qué herramientas están disponibles para usar PostgreSQL con páginas Web?
2.3) ¿Tiene PostgreSQL una interfaz de usuario gráfica?
Preguntas Administrativas
3.1) ¿Cómo instalo PostgreSQL en un lugar distinto a /usr/local/pgsql?
3.2) ¿Cómo controlo las conexiones desde otros equipos?
3.3) ¿Cómo configuro el motor de la base de datos para un mejor desempeño?
3.4) ¿Qué características de corrección de errores hay disponibles?
3.5) ¿Porqué me aparece "Perdón, demasiados clientes" cuando intento conectarme?
3.6) ¿Porqué debo descargar y restaurar para actualizar versiones principales de PostgreSQL?
3.7) ¿Qué hardware debo usar?
Preguntas Operacionales
4.1) ¿Cómo selecciono los primeros registro de una consulta? ¿Un registro al azar?
4.2) ¿Como encuentro que tablas, índices, bases de datos y usuarios están definidos?
¿Cómo veo las consultas usadas por psql para mostrarlas?
4.3) ¿Cómo cambio el tipo de datos de una columna?
4.4) ¿Cual es el máximo tamaño de un registro, una tabla y una base de datos?
4.5) ¿Cuanto espacio del disco para la base de datos se necesita para almacenar datos de un típico archivo de texto típico?
4.6) ¿Porqué mis consultas son lentas? ¿Porqué no utilizan mis índices?
4.7) ¿Cómo veo la manera en que mi optimizador de consultas está evaluando mi consulta?
4.8) ¿Cómo realizo búsquedas de expresiones regulares y búsquedas de expresiones regulares que no distingan mayúsculas de minúsculas? ¿Cómo utilizo un índice para realizar búsquedas que no distingan mayúsculas de minúsculas?
4.9) En una consulta, ¿Cómo detecto que un campo es NULO? ¿Cómo sé si un campo es NULO o no?
4.10) ¿Cual es la diferencia entre los distintos tipos de caracteres?
4.11.1) ¿Cómo creo un campo auto incrementable?
4.11.2) ¿Cómo obtengo el valor de una inserción serial?
4.11.3) ¿Acaso currval() conduce a una condicion de competencia con otros usuarios ?
4.11.4) ¿Porqué mi secuencia de números no es reusada al abortar una transacción?
¿Porqué hay espacios en la numeración de mi columna secuencia/serial?
4.12) ¿Qué es un OID? ¿Que es un CTID?
4.13) ¿Porqué obtengo el error "ERROR: Memoria exhausta en AllocSetAlloc()"?
4.14) ¿Cómo sé que versión de PostgreSQL estoy ejecutando?
4.15) ¿Cómo creo una columna que señale automáticamente la hora actual?
4.16) ¿Cómo realizo un ensamble externo (outer join)?
4.17) ¿Cómo hago consultas usando varias bases de datos?
4.18) ¿Cómo obtengo varios registros o columnas desde una función?
4.19) ¿Porqué obtengo errores de "Relacion con OID ##### no existe" cuando acceso a tablas
temporales en funciones PL/PsSQL?
4.20) ¿Qué opciones de réplica están disponibles?
4.21) ¿Porqué los nombres de mis tablas y columna no son reconocidos en mi consulta?
_________________________________________________________________
Preguntas Generales
1.1) ¿Qué es PostgreSQL y cómo se pronuncia en inglés?
PostgreSQL se pronuncia Post-Gres-quiu-el, y a veces solamante se le refiere
como Postgres. Está disponible un archivo de audio en formato MP3 para aquellos que deseen escuchar la pronunciación en inglés.
PostgreSQL es una sistema de base de datos objeto-relacional que tiene las
características de sistemas de bases de datos comerciales tradicionales con mejoras
que serán encontradas en sistemas DBMS de la próxima generacion. PostgreSQL es libre y está disponible todo su código fuente.
El desarrollo de PostgreSQL es realizado por un equipo de desarrolladores (voluntarios en su mayoría) dispersos alrededor del mundo y comunicados vía Internet. Este es un proyecto de la comunidad y no es controlado por ninguna compañía. Para integrarse al proyecto vea el FAQ de los desarrolladores en http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
1.2) ¿Cuáles son los derechos de autor de PostgreSQL?
PostgreSQL es distribuido bajo la clásica licencia BSD. No tiene restricciones acerca de la manera en que puede usarse el código fuente. Nos gusta y no tenemos la intencion de cambiarlo.
Esta es la licencia BSD que usamos:
Sistema de Administración de Base de Datos PostgreSQL
Porciones Copyright (c) 1996-2005, PostgreSQL Global Development Group
Porciones Copyright (c) 1994-1996 Regents of the University of California
Se otorga el permiso de uso, copia, modificacion y distribucion de este software y su documentación para cualquier propósito, sin cobro, y sin un acuerdo escrito, con la condición que el aviso de copyright mostrado arriba y este párrafo y los dos siguientes aparezcan en todas las copias.
DE NINGUNA MANERA LA UNIVERSIDAD DE CALIFORNIA SERÁ RESPONSABLE POR
DAÑOS DIRECTOS, INDIRECTOS, ESPECIALES, INCIDENTALES O CONSECUENTES,
INCLUYENDO PERDIDA DE BENEFICIOS DEBIDO AL USO DE ESTE SOFTWARE
Y SU DOCUMENTACION, INCLUSO SI LA UNIVERSIDAD DE CALIFORNIA HA SIDO
INFORMADA DE LA POSIBILIDAD DE DICHO DAÑO.
LA UNIVERSIDAD DE CALIFORNA NIEGA CUALQUIER GARANTÍA, INCLUYENDO
PERO NO LIMITADA A, LAS GARANTÍAS IMPLICADAS DE COMERCIALIZACION
Y APTAS PARA PROPÓSITOS PARTICULARES. ESTE SOFTWARE ES DISTRIBUIDO
BAJO LAS BASES "TAL CUAL", Y LA UNIVERSIDAD DE CALIFORNIA NO TIENE
LA OBLIGACION DE PROVEER MANTENIMIENTO, SOPORTE, ACTUALIZACIONES,
MEJORAS O MODIFICACIONES.
1.3) ¿Qué plataformas soporta PostgreSQL?
En general, cualquier plataforma moderna compatible con Unix debería ser capaz de ejecutar PostgreSQL. Las plataformas que han sido probadas al momento de la distribucion son listadas en las instrucciones de instalación.
PostgreSQL tambien corre nativamente sobre sistemas operativos basados en Microsoft Windows NT tales como Win2000, WinXP y Win2003. Se encuentra disponible un instalador preempacado http://pgfoundry.org/projects/pginstaller. Las versiones de Windows basadas en MSDOS (Win95, Win98, WinMe) pueden correr PostgreSQL usando Cygwin.
Existe incluso un port para Novell Netware 6 en http://forge.novell.com y una versión para OS/2 (eComStation) en http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F.
1.4) ¿Dónde puedo obtener PostgreSQL?
Por medio del navegador web, utilize http://www.postgresql.org/ftp/ y por medio de ftp, use ftp://ftp.PostgreSQL.org/pub/.
1.5) ¿Dónde puedo obtener soporte?
La comunidad de PostgreSQL proporciona asistencia a muchos de sus usuarios por medio de correo electrónico. El sitio principal para suscribirse a la lista de correo en inglés es http://www.postgresql.org/community/lists/. El sitio para inscribirse a la lista de correo en español es http://mail.postgresql.org/mj/mj_wwwusr?domain=postgresql.org&func=lists-long-full&extra=pgsql-es-ayuda. Las listas generales o de
errores son un buen lugar para empezar.
El principal canal IRC es #postgresql en Freenode (irc.freenode.net).
Para conectarse puede usar el programa Unix irc -c '#postgresql' "$USER"
irc.freenode.net o usar algun otro cliente de IRC. Existe también un canal en español y uno
en francés en la misma red, (#postgresql-es), (#postgresqlfr)
respectivamente. Incluso hay un canal de PostgreSAL en EFNet.
Está disponible una lista de compañías que brindan soporte comercial en
http://techdocs.postgresql.org/companies.php.
1.6) ¿Cómo mando un reporte de error?
Llena el formato de errores de PostgreSQL en
http://www.postgresql.org/support/submitbug.
Revisa también nuestro sitio ftp, ftp://ftp.PostgreSQL.org/pub/
para ver si hay una versión más reciente de PostgreSQL.
1.7) ¿Cuál es la última versión?
La ultima versión de PostgreSQL es la 8.1
Planeamos liberar una versión principal cada año, con actualizaciones menores
cada dos o tres méses.
1.8) ¿Qué documentación está disponible?
PostgreSQL incluye una amplia documentación, incluyendo un exterso manual,
páginas man y alguunos ejemplos. Ve el directorio /doc. Incluso puedes
ver los manuales en línea en http://www.PostgreSQL.org/docs.
Ahí hay 2 libros de PostgreSQL disponibles en línea en
http://www.postgresql.org/docs/books/awbook.html y
http://www.commandprompt.com/ppbook/. Tambiés existen algunos libros de PostgreSQL
disponibles para su compra. Uno de los más populares es de Korry
Douglas. Una lista de revisiones de libros puede ser encontrada en
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Además ahi una
colección de artículos técnicos de PostgreSQL en
http://techdocs.PostgreSQL.org/.
El cliente de línea de comandos psql tiene algunos comandos d para mostrar
información acerca de tipos, operadores, funciones, agregados, etc. - utilice
? para desplegar los comandos disponibles.
Nuestro sitio web contiene aún más información.
1.9) ¿Cómo encuentro información acerca de errores conocidos o de características que hacen falta?
PostgreSQL soporta un subconjunto extendido de SQL:2003. Lea nuestra lista POR HACER
en busca de errores conocidos, características faltantes o planes futuros.
1.10) ¿Cómo aprendo SQL?
Primero, considere los libros especializados de PostgreSQL mencionados arriba.
Otro libro es "Teach Yourself SQL in 21 Days, Second Edition" en
http://members.tripod.com/er4ebus/sql/index.htm. A muchos de nuestros usuarios
les agrada "The Practical SQL Handbook", Bowman, Judith S., et al.,
Addison-Wesley. Algunos otros prefieren "The Complete Reference SQL",
Groff et al., McGraw-Hill.
Ademas hay un buen tutorial en
http://www.intermedia.net/support/sql/sqltut.shtm, en
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
y en http://sqlcourse.com.
1.11) ¿Cómo me uno al equipo de desarrollo?
Lea el FAQ de Desarrolladores.
1.12) ¿Cómo se compara PostgreSQL con otros DBMSs?
Existen varias maneras de medir el software: características, desempeño,
fiabilidad, soporte y precio.
Características
PostgreSQL tiene la mayoría de las características presentes en
grandes DBMSs comerciales, tales como transacciones, subconsultas,
gatillos (triggers), vistas, integridad referencial con llaves externas,
y bloqueo sofisticado. También tenemos algunas características
que no tienen las otras, como tipos definidos por el usuario, herencia, reglas,
y control de concurrencia multi-versión para reducir el bloqueo de
controversias.
Desempeño
El desempeño de PostgreSQL es comparable con el de otras bases de datos comerciales
y de código abierto. Es más rápida para algunas cosas, más lenta para
otras. Nuestro desempeño es usualmente +/-10% comparado con otras
bases de datos.
Fiabilidad
Nosotros creemos que un DBMS debe ser fiable, o es inútil. Nosotros
procuramos liberar codigo estable y bien probado que tenga
mínimos errores. Cada versión tiene al menos un mes de pruebas beta, y nuestra
historia de liberaciones muestra que podemos proveer versiones estables y
solidas que se encuantran listas para su uso en producción. Estamos convencidos que en esta área
nos comparamos favorablemente con otras bases de datos.
Soporte
Nuestras listas de correo, proporcionan contacto con un gran grupo de
desarrolladores y usuarios que le oferecen ayudan para resolver cualquier
problema encontrado. Mientras nosotros no podemos garantizar una
corrección, los DBMSs comercials no siempre suministran correcciones.
El acceso directo a desarrolladores, la comunidad de usuarios, manuales
y el código fuente suelen hacer que el soporte de PostgreSQL
sea superior al de otras DBMSs. También hay soporte comercial disponible
por incidente para aquellos que lo necesiten. (Vea la seccion 1.5)
Precio
Estamos disponibles para cualquier uso, ya sea comercial o no.
Puedes agregar nuestro código a tu producto sin limitación alguna,
excepto aquellas mencionadas en nuestro estilo de licencia BSD
mostrado arriba.
1.13) ¿Quién controla PostgreSQL?
Si estás buscando un dueño de PostgreSQL, un comité central o una
compañia controladora, date por vencido --- no existe. Nosotros tenemos
un comité interno y consejales CVS, pero estos grupos son más para
propósitos administrativos que para control. El proyecto es dirigido por
la comunidad de usuarios y desarrolladores a la cual cualquiera puede unirse.
Todo lo que necesitas es inscribirte a la lista de correo y participar en
las discusiones. (Vea el FAQ de Desarrolladores para informacion de cómo
involucrarse en el desarrollo de PostgreSQL.)
_________________________________________________________________
Preguntas de clientes de usuario
2.1) ¿Qué interfaces estan disponibles para PostgreSQL?
La instalacion de PostgreSQL incluye solamante las interfaces de C y C incrustado.
Todas las demás interfaces son proyectos independientes que son descargados
por separado; el ser separados les permite tener su propia agenda de
liberación y equipos de desarrollo.
Algunos otros lenguajes de programación como PHP incluyen una interfaz
para PostgreSQL. Las interfaces para lenguajes como Perl, TCL, Python
y muchas otras están disponibles en http://gborg.postgresql.org enla sección
de Controladores e Interfaces y por búsqueda en Internet.
2.2) ¿Qué herrameintas están disponibles para usar PostgreSQL con páginas Web?
Una buena introducción a páginas web respaldadas por bases de datos puede
ser vista en http://www.webreview.com
Para integración web, PHP (http://www.php.net) es una excelente interfaz.
Para casos complejos, muchos utilizan Perl y DBD::Pg con CGI.pm o
mod_perl.
2.3) ¿Tiene PostgreSQL una interfaz de usuario gráfica?
Sí, en http://techdocs.postgresql.org/guides/GUITools existe una
lista detallada.
_________________________________________________________________
Preguntas Administrativas
3.1) ¿Cómo instalo PostgreSQL en un lugar distinto a /usr/local/pgsql?
Especifica la opción --prefix cuando ejecutes configure.
3.2) ¿Cómo controlo las conexiones desde otros equipos?
Por omisión, PostgreSQL solo permite conexiones desde el equipo local
utilizando sockets de dominio Unix o conecciones TCP/IP. Otros equipos
no podrán conectarse a menos que modifiques listen_addresses
en el archivo postgresql.conf, habilites la autentificación basada en anfitrión
modificando el archivo $PGDATA/pg_hba.conf y reinicies el servidor.
3.3) ¿Cómo configuro el motor de la base de datos para un mejor desempeño?
Existen tres áreas principales para un potencial mejoramiento de desempeño:
Cambios a las Consultas
Esto implica modificar las consultas para obtener un mejor desempeño:
+ Creación de índices, incluyendo indices de expresión y parciales
+ Uso de comando COPY en lugar de varios INSERTs
+ Agrupamiento de varias declaraciones en una sola transacción
para reducir la sobrecarga del commit
+ Uso de CLUSTER cuando se obtengan muchos registros a partir de un índice
+ Uso de LIMIT para regresar un subconjunto de la salida de una consulta
+ Uso de consultas preparadas
+ Uso de ANALYZE para mantener exactas las estadísticas del optimizador
+ Uso regular de VACUUM o pg_autovacuum
+ Eliminación de índices durante cambios grandes de datos
Configuracion de Servidor
Ciertas configuracion del archivo postgresql.conf afectan el desempeño.
Para más detalles, lea la Guía de Administracion/Ambiente del tiempo de ejecucion
del servidor/Configuracion del tiempo de ejecucion para contar con una lista completa
y para comentarios vea
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html y
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
Selección de Hardware
El efecto del hardware en el desempeño esta detallado en
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html
y http://www.powerpostgresql.com/PerfList/.
3.4) ¿Qué características de corrección de errores están disponibles?
Existen muchas variables log_* de configuración de servidor que permiten
la impresión de las estadísticas de las consultas y de los procesos que pueden ser muy útiles
para la corrección de errores y la medición de desempeño.
3.5) ¿Porqué me aparece "Perdon, demasiados clientes" cuando intento conectarme?
Haz alcanzado el limite preestablecido de 100 sesiones de la base de datos. Dependiendo de cuantos
procesos concurrentes puede iniciar, deberas incrementar el límite del administrador
cambiando el valor de max_connection en el archivo postgresql.conf y reiniciando
el postmaster.
3.6) ¿Porqué debo descargar y restaurar para actualizar entre cambios de versiones principales de
PostgreSQL?
El equipo de PostgreSQL solo realiza cambios pequeños entre revisiones menores,
asi que actualizar desde 7.4.0 a 7.4.1 no requiere de una eliminacion y de una restauración.
Por otro lado, versiones principales (por ejemplo 7.3 a 7.4) comunmente cambian
el formato interno de las tablas de sistema y los archivos de datos. Estos cambios
suelen ser complejos, asi que no mantenemos compatibilidad con archivos de datos
anteriores. Una descarga genera datos en un formato genérico que entonces puede ser
cargado utlizando el nuevo formato interno.
3.7) ¿Qué hardware debo usar?
Debido a que el hardware de PC es compatible en su mayoria, la gente tiende a pensar
que todo el hardware es de la misma calidad. No es cierto. La ECC RAM, los discos
SCSI y las tarjetas madres de calidad son mas confiables y tienen mejor desempeño que
el hardware de bajo precio. PostgreSQL correrá en casi cualquier hardware, pero si
la confiabilidad y el desempeño son importantes, será mejor investigar concienzudamente
nuestras opciones de hardware. Nuestras listas de correo pueden usarse para
discutir opciones de hardware o para comercio de las mismas.
_________________________________________________________________
Preguntas Operacionales
4.1) ¿Cómo selecciono los primeros registro de una consulta? ¿Un registro al azar?
Si conoces el número de registros que se necesitan, en el momento de la
selección utiliza LIMIT para obtener solo algunos registros. Si un índice
coincide con el ORDER BY es posible que la consulta completa no tenga
que se ejecutada. Si no conoces el número de registrso en el momento
de la selección, utiliza un cursor y el comando FETCH.
Para seleccionar un registro aleatoria utiliza:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) ¿Como encuentro que tablas, índices, bases de datos y usuarios están definidos?
¿Cómo veo las consultas usadas por psql para mostrarlas?
Utiliza el comando dt para ver las tablas en psql. Para una lista completa
de los comandos dentro de psql puedes utilizar ?. Alternativamente puedes
ver el código fuente de psql en el archivo pgsql/src/bin/psql/describe.c,
este contiene comandos SQL que generan una salida para los comandos backslash
de psql. También se puede iniciar psql con la opción -E para que imprima
las consultas que utilice para ejecutar los comandos que se intruduzcan.
PostgreSQL también provee una interfaz de esquema de información (INFORMATION SCHEMA) apegado a
SQL la cual puede ser consultada para obtener información acerca de la base de datos.
También existen tablas del sistema que inician con pg- que describen esa información.
El uso de psql -l listará todas las bases de datos.
Además puedes intentar con el archivo pgsql/src/tutorial/syscat.source. El
cual ilustra varias de las selecciones necesarias para obtener información
de las tablas de sistema de la base de datos.
4.3) ¿Cómo cambio el tipo de datos de una columna?
Cambiar el tipo de datos de una columna puede realizarse facilmente de la
version 8.0 y posteriores con ALTER TABLE ALTER COLUMN TYPE.
En versiones anteriores es necesario hacer esto:
BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type;
UPDATE tab SET new_col = CAST(old_col AS new_data_type);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
Es recomendable hacer después un VACUUM FULL para recuperar el espacio
en disco usado por los registros que expiraron.
4.4) ¿Cual es el máximo tamaño de un registro, una tabla y una base de datos?
Estos son los límites:
¿Tamaño máximo para una base de datos? Ilimitado (existen bases de datos de 32 TB)
¿Tamaño máximo para una tabla? 32 TB
¿Tamaño máximo para un registro? 1.6 TB
¿Tamaño máximo para un campo? 1 GB
¿Número máximo de registros en una tabla? Ilimitado
¿Número máximo de columnas en una tabla? 250-1600 dependiendo del tipo de columna
¿Número máximo de índices en una tabla? Ilimitado
Obviamente no son ilimitados, ya que están limitados al espacio disponible en disco
y al espacio de memoria swap. El desempeño disminuirá cuando estos valores se
vuelvan inusualmente largos.
El tamaño máximo de una tabla de 32TB no requiere soporte de archivos
grandes por parte del sistema operativo. Las tablas grandes son almacenadas
como varios archivos de 1 GB así que no importa el límite del tamaño de los archivos de un sistema de archivos.
El tamaño máximo de una tabla y el número máximo de columnas puede ser
cuadruplicado incrementando el valor por defecto del tamaño de bloque a
32k.
Una limitante es que los índices no pueden ser creados en columnas más
largas que 2,000 caractéres. Afortunadamente dichos índices son raramente
necesarios. La unicidad se garantiza mejor con una índice funcional de un
hash MD5 de una columna larga, y una indexación de todo el texto permite la
búsqueda de palabras dentro de la columna.
4.5) ¿Cuanto espacio del disco para la base de datos se necesita para almacenar datos de un típico archivo de texto típico?
Una base de datos PostgreSQL puede requerir cinco veces más espacio en disco
para almacenar datos desde un archivo de texto.
Como un ejemplo, considere un archivo de 100,000 líneas con un entero y
una descripción en texto en cada línea. Suponga que la cadena de texto
tiene un promedio de veinte bytes de longitud. El archivo de texto plano
será de 2.8 MB. El tamaño de la base de datos PostgreSQL que contenga estos
datos tendrá un tamaño aproximado de 6.4 MB
28 bytes: cada cabecera de registro (aproximado)
24 bytes: un campo entero y uno de texto
+ 4 bytes: apuntador en página para TUPLE =====>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
----------------------------------------
56 bytes por registro
El tamaño de la página de datos en PostgreSQL es 8192 bytes (8 KB), entonces:
8192 bytes por página
------------------- = 146 registros por página de base de datos (redondeado hacia abajo)
56 bytes per registro
100000 registros de datos
-------------------- = 685 páginas de base de datos (redondeado hacia arriba)
146 registros por página
685 páginas de base de datos * 8192 bytes por página = 5,611,520 bytes (5.6 MB)
Los índices no requieren tanta sobrecarga, pero contienen los datos que están
siendo indexados, asi que también pueden ser grandes.
Los valores NULOS son almacenados como mapas de bits, asi que
utilizan poco espacio.
4.6) ¿Porqué mis consultas son lentas? ¿Porqué no utilizan mis índices?
Los índices no son usados por todas las consultas. Los índices son usados
únicamente si la tabla es más grande que un tamaño mínimo y si la consulta
selecciona solo un pequeño porcentaje de los registros en la tabla. Esto es
debido a que al acceso aleatorio del disco causado por un barrido de índices puede ser
más lento que una lectura directa a través de la tabla o una búsqueda secuencial.
Para determinar si debe ser usado un índice, PostgreSQL debe tener
estadísticas acerca de la tabla. Estas estadísticas son obtenidas
usando el comando VACUUM ANALYZE, o simplemente ANALYZE. Utilizando las
estadísticas, el optimizador sabe cuantos registros hay en la tabla y de esta manera
puede determinar mejor si los índices deben ser usados. Las estadísticas también
son valiosas en el momento de determinar el orden de union o el método de union
óptimos. La obtención de estadísticas debe ser realizada periódicamente
conforme los contenidos de las tablas cambien.
Los índices normalmente no son usados por el comando ORDER BY o para realizar
uninones. Un barrido secuencial seguido por una búsqueda explícita es
usualmente más rápido que un barrido de índices de una tabla grande.
Sin embargo, el comando LIMIT combinado con ORDER BY utilizará comunmente
un índice debido a que sólo una pequeña porción de la tabla es regresada.
De hecho, aunque el comando MAX() y el comando MIN() no utilizan índices,
es posible obtener tales valores usando un índice con los comandos ORDER BY
y LIMIT:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Si crees que el optimizador se equivoca al escoger un barrido
secuencial, utiliza SET enable_seqscan TO 'off' y ejecuta la consulta
nuevamente para ver si el barrido de índice es efectivamente más rápido.
Cuando se utilizan operadores comodín tales como LIKE o ~, los índices
pueden ser utilizados en ciertas circunstancias:
* El inicio de una cadena de búsqueda deberá estar anclado al principio de
la cadena, por ejemplo,
+ los patrones del comando LIKE no deberan empezar con %.
+ los patrones de ~ (expresión regular) deberan empezar con ^.
* La cadena de búsqueda no puede inciar con clases de caracteres, por ejemplo
[a-e].
* Las búsquedas que no distinguen entre mayúsculas y minúsculas tales como ILIKE y ~* no
utilizan índices. En cambio, utilizan índices de expresión, los cuales
son descritos en la sección 4.8.
* La localización C (iC locale) predeterminada deberá ser utilizado durante initdb debido a que no es
posible conocer el siguiente mejor caracter mayor en una situción sin localización C.
Puedes crear un índice especial text_pattern_ops para tales casos que solo funcionen con
la indexación LIKE.
En las versiones anteriores a 8.0, a menudo, los índices no pueden ser usado
a menos que los tipos de datos concuerden exactamente con los tipos de índices
de columna. Esto era particularmente cierto en int2, int8 e índices de columnas
numéricas.
4.7) ¿Cómo veo la manera en que mi optimizador de consultas está evaluando mi consulta?
Vea el página man de EXPLAIN.
4.8) ¿Cómo realizo búsquedas de expresiones regulares y búsquedas de expresiones
regulares que no distingan mayúsculas de minúsculas? ¿Cómo utilizo un índice para realizar
búsquedas que no distingan mayúsculas de minúsculas?
El operador ~ busca concordancias por medio de expresiones regulares, y ~* busca concordancias por medios de expresiones regulares
que no distingan mayúsculas de minúsculas. La variaante de LIKE que no distingue mayúsculas
de minúsculas se llama ILIKE.
Las comparaciones de igualdad que distinguen mayúsculas de minúsculas se expresan
normalmente como:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
Esto no utilizará un índice estándar. Sin embargo, si se crea un
índice de expresión, se usará:
CREATE INDEX tabindex ON tab (lower(col));
Si el índice anterior es creado como UNIQUE, aunque la columna pueda almacenar
caractéres con mayúsculas y minúsculas, no podrá tener valores idénticos que
difieran solo en el uso de mayúsculas y minúsculas. Para forzar a que sólo pueda almacenarse un tipo
(mayúsculas o minúsculas) en la columna, utilice una restricción CHECK o un gatillo (trigger).
4.9) En una consulta, ¿Cómo detecto que un campo es NULO?
¿Cómo sé si un campo es NULO o no?
Debes analizar la columna con IS NULL y IS NOT NULL, como sigue:
SELECT *
FROM tab
WHERE col IS NULL;
Para ordenar por la situación de NULO, utliza los modificadores IS NULL y
IS NOT NULL en tu clausula ORDER BY. Las que resulten ciertas serán ordenadas
más arriba que las que son falsas, asi que mostrarán las entradas NULAS en
la parte alta de la lista:
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
4.10) ¿Cual es la diferencia entre los distintos tipos de caractéres?
Tipo Nombre Interno Notas
VARCHAR(n) varchar El tamaño especifica la longitud máxima, sin rellenar con blancos
CHAR(n) bpchar se rellenan con blancos hasta la longitud constante especificada
TEXT text sin límite específico superior en la longitud
BYTEA bytea arreglo de bytes de longitud variable (manejo seguro de byte nulos)
"char" char un caracter
Verás el nombre interno cuando se examinen catálogos de sistema y en algunos
mensajes de error
Los cuatro primeros tipos arriba son del tipo "varlena" (por ejemplo,
los 4 primeros bytes en disco son la longitud, seguido por la información).
De esta manera, el espacio usado es ligeramente más grande que el declarado.
Sin embargo, los valores grandes son sujetos a la compresión, asi que el espacio
en disco también será menos del esperado.
VARCHAR(n) es mejor cuando almacena cadenas de longitud variable y limita
cuan grande será una cadena. TEXT es para cadenas de longitud ilimitada, con un
máximo de un gigabyte.
CHAR(n) se utliza para almacenar cadenas de la mimsa longitud. CHAR(n)
rellena con espacios en blanco hasta la longitud especificada, mientras VARCHAR(n) solo
almacena los caracteres suministrados. BYTEA es para almacenar valores binarios,
el particular los valores que incluyes bytes NULOS. Todos los tipos descritos
tienen características de desempeño similares.
4.11.1) ¿Cómo creo un campo auto incrementable?
PostgreSQL soporta un tipo de dato SERIAL. El cual auto incrementa una secuencia.
Por ejemplo, esto:
CREATE TABLE person (
id SERIAL,
name TEXT
);
se traduce automáticamente a esto:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
Lea la página man de create_sequence para más información sobre secuencias.
4.11.2) ¿Cómo obtengo el valor de una inserción serial?
Una manera es recuperar el siguente valor del SERIAL de objeto secuencia con la función nextval() antes de insertar y luego insertarla
explicitamente. Usando la tabla de ejemplo en 4.11.1, un ejemplo en un
pseudo lenguaje se vería asi:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
Ahi se tendrá entonces el nuevo valor almacenado en new_id para usarse
en otras consultas (por ejemplo, como una llave externa a la tabla persona).
Observe que el nombre de la SECUENCIA objeto creado automáticamente será denominada
_< columnaserial>_seq, donde tabla y columnaserial son los nombres de su
tabla y su columna SERIAL, respectivamente.
Alternativamente, podrá recuperar el valor SERIAL asignado con la
funcion currval() después de que fue insertada por defecto, por ejemplo,
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
4.11.3) ¿Acaso currval() conduce a una condicion de competencia con otros usuarios ?
No. currval() regresa el valor actual asignado para su sessión, no para todas las sesiones
4.11.4) ¿Porqué mi secuencia de números no es reusada al abortar una transacción?
¿Porqué hay espacios en la numeración de mi columna secuencia/serial?
Para mejorar la concurrencia, los valores de secuencia son dados a
transacciones en curso cuando es necesario, y no son bloqueados hasta
que la transacción se complete. Esto causa espacios en la numeración
debido a las transacciones abortadas.
4.12) ¿Qué es un OID? ¿Que es un CTID?
Cada registro que es creado en PostgreSQL obtiene un OID único a menos
que sea creado con el comando WITHOUT OIDS. Los OID son enteros únicos
de 4 bytes asignados automáticamente que son únicos a lo largo de toda la
instalación. Sin embargo, se desbordan a los 4 billones, y luego los OID
empizan a duplicarse. PostgreSQL utiliza los OID para vincular tablas de sistema
internas.
Para enumerar las columnas en las tablas de usuario de manera única,
es mejor utilizar SERIAL en lugar de OID debido a que las secuencias
SERIAL son únicas solamente dentro de una sola tabla, y por consecuencia
hay menos posibilidad de desbordamiento. Puede utilizar SERIAL8 para almacenar
secuencias de valores de 8 bytes.
los CTID son usados para identificar registros físicos específicos con valores
de bloque y de desplazamiento (offset). Los CTID cambian después de que los registros
son modificados y recargados. Son usados por entradas indexadas para apuntar
a registros físicos.
4.13) ¿Porqué obtengo el error "ERROR: Memoria exausta en AllocSetAlloc()"?
Probablemente se ha terminado la memoria virtual de su sistema, o su kernel
tiene un nivel bajo para ciertos recursos. Intente esto antes de iniciar
el administrador:
ulimit -d 262144
limit datasize 256m
Dependiendo de su shell, solo uno de estos funcionará, pero configurará
su limite de proceso de segmento de datos mucho más arriba, y quizá
permitirá que la consulta se complete. Este comando aplica al proceso
actual, y a todos los subprocesos creados después de que el comando sea
ejecutado. Si está teniendo problemas con el cliente SQL debido a que el backend
regresa mucha información, intentelo antes de iniciar el cliente.
4.14) ¿Cómo sé que version de PostgreSQL estoy ejecutando?
Desde psql, escriba SELECT version();
4.15) ¿Cómo creo una columna que señale automáticamente la hora actual?
Utilize CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) ¿Cómo realizo un ensamble externo (outer join)?
PostgreSQL soporta outer joins usando la sintaxis SQL estándar.
Aqui hay 2 ejemplos:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
o
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Estas consultas idénticas unen t1.col a t2.col, y también regresan
cualquier registro no ligado (unjoined) en t1 (aquellos que no concuerden con t2).
Una RIGHT join agregará los registros no ligados de t2. Un FULL join
regresará los registros encontrados,
junto con todos los registros no ligados de t1 y t2. La palabra OUTER
es opcional y se asume en las uniones LEFT, RIGHT y FULL. Los joins
ordinarios son llamados INNER joins.
4.17) ¿Cómo hago consultas usando varias bases de datos?
No existe otra manera de consultar una base de datos más que la actual.
Debido a que PostgreSQL carga catálogos específicos de la base de
datos, es incierto como se comportará una consulta de una base de datos mezclada.
contrib/dblink permite que las consultas cruzadas entre base de datos usando
llamadas a funciones. Obviamente, un cliente tambien puede realizar
conexiónes simultáneas a diferentes bases de datos y mezaclar los resultados
en el lado del cliente.
4.18) ¿Cómo obtengo varios registros o columnas desde una función?
Eso es sencillo al utilizar funciones que regresan conjuntos,
http://techdocs.postgresql.org/guides/SetReturningFunctions
4.19) ¿Porqué obtengo errores de "Relacion con OID ##### no existe" cuando acceso a tablas
temporales en funciones PL/PsSQL?
PL/PgSQL almacena los scripts de las funciones, y un desafortunado efecto
secundario es que si una función PL/PsSQL accesa una tabla temporal,
y esa tabla es borrada (droped) y recreada después, y la función es llamada de nuevo,
la función fallará porque la función almacenada (cached)
sigue apuntando a la antigua tabla temporal. La solucion es usar EXECUTE
para un acceso temporal a las tablaa en PL/PgSQL. Esto hará que la consulta sea
analizada cada vez.
4.20) ¿Qué opciones de réplica están disponibles?
Aunque "replicación" es un término sencillo, existen muchas tecnologías
para realizar la replicación, cada uno con sus ventajas y desventajas.
Las replicas Maestro/Esclavo permiten a un solo maestro recibir consultas de
lectura/escritura, mientras los esclavos solo pueden aceptar consultas
lectura/SELECT. La solución más popular libremente disponible
para las réplicas maestro-esclavo de PostgreSQL es Slony-I
La réplica Multi-maestro permite que las consultas lectura/escritura
sean enviadas a varias computadoras replicadas. Esta capacidad tiene
también un severo impacto en el desempeño debido a la necesidad
de sincronizar los cambios entre los servidores. Pgclusters es la solución
más popular libremente disponible para PostgreSQL.
También existen soluciones de replica comerciales y basadas en hardware
disponibles que soportan una gran variedad de modelos de réplica
4.21) ¿Porqué los nombres de mis tablas y columna no son reconocidos en mi consulta?
La causa más común es el uso de comilla doble en los nombres de tablas
o columnas durante la creación de las tablas. Cuando se usan las comillas dobles,
los nombres de las tablas y de las columnas (llamados identificadores)
son almacenadas de manera que distingan mayúsculas de minúsculas, esto
significa, que se deberán usar comillas dobles cuando se refiera a los nombres
en una consulta. Algunas interfaces, como pgAdmin, ponen automáticamente las
dobles comillas al momento de crear la tabla. Así, para que los identificadores
sean reconocidos, se deberá:
* Evitar los identificadores de comilla doble cuando se creen las tablas
* Usar solamente caracteres en minúsculas en los identificadores
* Use comillas dobles en los identificadores cuando se les refiera en las consultas.
Preguntas frecuentes de PostgreSQL
Última actualizacion: Sab Nov 19 21:04:23 EDT 2005
Traduccion: Pensabé Gómez Fernando (krotaz@gmail.com)
Roberto Andrade (randrade@inteligentes.com.mx)
La version más reciente de este documento, en inglés, puede ser vista en
http://www.postgresql.org/files/documentation/faqs/FAQ.html.
Preguntas sobre plataformas específicas son resueltas en
http://www.postgresql.org/docs/faq/.