Preguntas de Uso Frecuente (FAQ) sobre PostgreSQL

Última actualización: Tue Mar 21 16:09:11 EST 2000

Encargado Actual de su mantenimiento: Bruce Momjian (pgman@candle.pha.pa.us)

La versión más reciente de este documento puede visualizarse en el sitio web de postgreSQL, http://www.postgresql.org/.

La versión más reciente de este documento en Español puede visualizarse en el sitio web del Proyrcto de tradución de la documentación de postgreSQL, http://users.servicios.retecal.es/rsantos/index.htm o en su replica http://lucas.hispalinux.es/Postgresql-es/rsantos/

Las preguntas específicas sobre Linux son contestadas en http://www.PostgreSQL.org/docs/faq-linux.html.

Las preguntas específicas sobre Irix son contestadas en http://www.PostgreSQL.org/docs/faq-irix.html.

Las preguntas específicas sobre HPUX son contestadas en http://www.PostgreSQL.org/docs/faq-hpux.shtml.


Preguntas Generales

1.1) ¿Qué es PostgreSQL?
1.2) ¿Cuál es el Copyright de PostgreSQL?
1.3) ¿En qué plataformas Unix corre PostgreSQL?
1.4) ¿Qué adaptaciones no unix están disponibles?
1.5) ¿Dónde puedo conseguir PostgreSQL?
1.6) ¿Dónde puedo conseguir asistencia para PostgreSQL?
1.7) ¿Cuál es la última versión de PostgreSQL?
1.8) ¿Qué documentación existe sobre PostgreSQL?
1.9) ¿Cómo me informo de nuevos errores o características faltantes?
1.10) ¿Cómo puedo aprender SQL?
1.11) ¿Está PostgreSQL certificado Y2K?
1.12) ¿Cómo puedo unirme al equipo de desarrollo?
1.13) ¿Cómo envío informes sobre fallos de funcionamiento?
1.14) ¿Cómo puede compararse PostgreSQL a otros DBMS's?

Preguntas del usuario del Cliente

2.1) ¿Existen controladores ODBC para PostgreSQL?
2.2) ¿Que herramientas hay disponibles para conectar PostgreSQL con páginas Web?
2.3) ¿Tiene PostgreSQL una interfase gráfica? ¿Y generador de informes? ¿E interfase para lenguajes de consulta empotrados?
2.4) ¿Que lenguajes hay disponibles para comunicar con PostgreSQL?

Cuestiones de Administración

3.1) ¿Por qué initdb falla?
3.2) ¿Cómo puedo instalar PostgreSQL en algún sitio distinto de /usr/local/pgsql?
3.3) Cuándo inicio el postmaster, Obtengo un Llamada errónea del sistema o un mensaje core dumped . ¿Por qué?
3.4) Cuándo intento iniciar postmaster, Obtengo un error IpcMemoryCreate errors3. ¿Por qué?
3.5) Cuándo intento iniciar postmaster, Obtengo un error IpcSemaphoreCreate. ¿Por qué?
3.6) ¿Cómo me prevengo del acceso de otros hosts a mi base de datos PostgreSQL?
3.7) ¿Por qué no puedo conectarme a mi base de datos desde otra máquina?
3.8) ¿Por qué no puedo acceder a la base de datos como usuario root?
3.9) Todos mis servidores fallan bajo el acceso concurrente a tablas ¿Por qué?
3.10) ¿Cómo afino el motor de base de datos para mejorar el rendimiento?
3.11) ¿Qué características de depuración están disponibles en PostgreSQL?
3.12) Obtengo 'Sorry, too many clients' cuando intento conectarme. ¿Por qué?
3.13) ¿Qué son los ficheros pg_psort.XXX en mi directorio de base de datos?
3.14) ¿Cómo configuro el pg_group?

 

Preguntas acerca del funcionamiento

4.1) El sistema parece confundirse con las comas, puntos decimales y los formatos de fechas.
4.2) ¿Cuál es la diferencia exacta entre cursores binarios y cursores normales?
4.3) ¿Cómo seleccionar solamente las primeras filas de una consulta?
4.4) ¿Cómo obtener una lista de tablas u otras cosas que pueda ver con psql?
4.5) ¿Cómo borrar una columna de una tabla?
4.6) ¿Cuál es el tamaño máximo de una fila, tabla o base de datos?
4.7) ¿Cuánto espacio de disco requiere una base de datos para almacenar un fichero normal y corriente?
4.8) ¿Cómo saber qué índices u operaciones están definidos en la base de datos?
4.9) Mis consultas van despacio o no hacen uso de índices. ¿Porqué?
4.10) ¿Cómo ver de qué manera el optimizador de consultas está evaluando mi consulta?
4.11) ¿Qué es un índice R-tree?
4.12) ¿Qué es una optimización genérica de una consulta?
4.13) ¿Cómo hacer búsquedas de expresiones regulares y búsquedas de expresiones regulares sensibles al contexto?
4.14) En una consulta, ¿cómo detectar si un campo es NULL (nulo)?
4.15) ¿Cuál es la diferencia entre los diferentes tipos de caracteres?
4.16.1) ¿Cómo crear un campo serie/autoincremento?
4.16.2) ¿Cómo obtener el valor de una inserción serie (serial insert)?
4.16.3) ¿No provoca el uso de currval() y nextval() una condición de competencia con otros procesos concurrentes del backend?
4.17) ¿Qué es un oid? ¿Qué es un tid?
4.18) ¿Cuál es el significado de algunos términos usados en PostgreSQL?
4.19) ¿Porqué me da este error "FATAL: palloc failure: memory exhausted?"
4.20) ¿Cómo saber qué versión de PostgreSQL estoy usando?
4.21) Las operaciones con objetos grandes me dan el mensaje invalid large obj descriptor. ¿Porqué?
4.22) ¿Cómo creo una columna que tome por defecto la hora actual?
4.23) ¿Porqué son tan lentas mis sub-consultas cuando uso IN?

Extendiendo PostgreSQL

5.1) He escrito una función de usuario. Cuando la ejecuto con psql, ¿por qué provoca un volcado del núcleo (dumps core)?
5.2) ¿Que significa el mensaje: NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! ?
5.3) ¿Como puede contribuir aportando algunos nuevos tipos y funciones a PostgreSQL?
5.4) ¿Cómo puede escribir una función en C que devuelva un par de valores?
5.5) He cambiado un fichero fuente. ¿Por qué si recompilo no se observa el cambio??


Preguntas Generales

1.1) ¿Qué es PostgreSQL?

PostgreSQL es una mejora del sistema gestor de bases de datos POSTGRES, un prototipo de investigación de DBMS de nueva generación. Mientras PostgreSQL mantiene los potentes modelos de datos y riqueza de tipos de POSTGRES, reemplaza el lenguaje de consulta PostQuel con un subjuego extendido de SQL. PostgreSQL es gratis y las fuentes son accesibles públicamente.

El desarrollo de PostgreSQL está siendo realizado por un equipo de desarrolladores de Internet suscritos a la lista de correo de PostgreSQL. El coordinador actual es Marc G. Fournier (scrappy@postgreSQL.org). (Véase abajo para unirse al grupo). Este equipo es el actual responsable de todo el desarrollo actual y futuro de PostgreSQL.

Los autores de PostgreSQL 1.01 fueron Andrew Yu y Jolly Chen. Muchos otros han contribuido a la adaptación a otras plataformas, pruebas, depuración y mejoras del código. El código original de Postgres, del cual deriva PostgreSQL, fue el esfuerzo de muchos estudiantes graduados, estudiantes no graduados y programadores de base trabajando bajo la dirección del profesor Michael Stonebraker en la Universidad de Berkeley (California).

El nombre original del software en Berkeley fue Postgres. Cuando se le añadió la funcionalidad SQL en 1995, su nombre se cambió a Postgres95. El nombre volvió a ser cambiado a finales de 1996 a PostgreSQL.

Se pronuncia Post-Gres-Q-L.

1.2) ¿Cuál es el Copyright de PostgreSQL?

PostgreSQL está sujeto al siguiente COPYRIGHT.

Sistema Gestor de Bases de Datos PostgreSQL

Porciones copyright (c) 1996-2000, PostgreSQL, Inc Porciones Copyright (c) 1994-6 Regentes de la Universidad de California

Se permite el uso, copia, modificación, y distribución de este software y su documentación para cualquier propósito, sin pago ni acuerdo previo escrito, a condición de que el anterior aviso de copyright, este párrafo y los dos siguientes aparezcan en todas las copias.

EN NINGUN CASO LA UNIVERSIDAD DE CALIFORNIA SE RESPONSABILIZARA DE DAÑOS DIRECTOS, INDIRECTOS, ACCIDENTALES O CONSECUENCIALES, INCLUYENDO PERDIDA DE BENEFICIOS, DERIVADOS DEL USO DE ESTE SOFTWARE Y SU DOCUMENTACION, INCLUSO SI LA UNIVERSIDAD DE CALIFORNIA HA SIDO AVISADA DE LA POSIBILIDAD DE TALES DAÑOS.

LA UNIVERSIDAD DE CALIFORNIA ESPECIFICAMENTE RENUNCIA A LA CONCESIÓN DE CUALQUIER GARANTIA, INCLUYENDO PERO NO LIMITANDOSE A LAS GARANTIAS IMPLICITAS DE COMERCIALIDAD Y AJUSTE PARA UN PROPOSITO PARTICULAR. EL SOFTWARE ES SUMINISTRADO "TAL CUAL", Y LA UNIVERSIDAD DE CALIFORNIA NO ESTA OBLIGADA A SUMINISTRAR MANTENIMIENTO, SOPORTE, ACTUALIZACIONES, MEJORAS O MODIFICACIONES SOBRE EL MISMO.

1.3) ¿En qué plataformas Unix corre PostgreSQL?

Los autores han compilado y probado PostgreSQL en las siguientes plataformas (algunas de estas compilaciones requieren gcc):

1.4) ¿Qué adaptaciones no unix están disponibles?

Es posible compilar las librerías libpq, psql y otros interfaces y binarios para su ejecución en MS Windows. En este caso, el cliente se ejecuta en MS Windows, y se comunica a través de TCP/IP con un servidor que está funcionando en una de las plataformas Unix soportadas.

El fichero win31.mak se incluye en la distribución para la compilación de las librerías libpq y psql en Win32.

El servidor de bases de datos funciona actualmente en Windows NT usando la librería de adaptación Cygnus Unix/NT. Véase pgsql/doc/README.NT en la distribución.

También existe una página web en http://www.freebsd.org/~kevlo/postgres/portNT.html Existe también otra adaptación usando U/Win en http://surya.wipro.com/uwin/ported.html

1.5) ¿Dónde puedo conseguir PostgreSQL?

El sitio ftp primario anónimo para PostgreSQL es ftp://ftp.postgreSQL.org/pub

Para sitios espejo, véase el sitio web principal.

1.6) ¿Dónde puedo conseguir asistencia sobre PostgreSQL?

No hay asistencia oficial para PostgreSQL desde la Universidad de Berkeley, California. Se mantiene a través del esfuerzo de voluntarios.

La lista de correo principal es: pgsql-general@postgreSQL.org. Está disponible para la discusión de asuntos referentes a PostgreSQL. Para suscribirse, envíe un e-mail con las siguientes líneas en el cuerpo (no en el sujeto)

	subscribe
	end

to pgsql-general-request@postgreSQL.org.

Asimismo existe una lista de compendios de mensajes. Para suscribirse a ella, envíe un e-mail a: pgsql-general-digest-request@postgreSQL.org con las siguientes líneas en el cuerpo del mensaje:

	subscribe
	end

Los compendios se envían a los miembros de esta lista en el momento que la lista principal ha recibido 30k de mensajes aproximadamente.

La lista de correo de errores también está disponible. Para suscibirse, envíe un e-mail a bugs-request@postgreSQL.org con las siguientes líneas en el cuerpo del mensaje:

	subscribe
	end

También está disponible una lista de correo para discusión de desarrolladores. Para suscibirse, envíe un e-mail a hackers-request@postgreSQL.org con las siguientes líneas en el cuerpo del mensaje:

	subscribe
	end

Listas de correo adicionales e información acerca de PostgreSQL puede ser encontrada en la página web principal de PostgreSQL en:

http://postgresql.org/

También existe un canal IRC en EFNet, el canal #PostgreSQL. Yo uso el comando unix irc -c '#PostgreSQL' "$USER" irc.phoenix.net

Existe asistencia comercial disponible para PostgreSQL en http://www.pgsql.com/

1.7) ¿Cuál es la última versión de PostgreSQL?

La última versión de PostgreSQL es la 7.0.

Planeamos tener versiones de orden mayor cada cuatro meses.

1.8) ¿Qué documentación existe sobre PostgreSQL?

Varios manuales, páginas man, y algunos pequeños ejemplos de texto se incluyen en la distribución. Véase el directorio /doc. También se puede consultar el manual on-line en http://www.postgresql.org/docs/postgres en la distribución.

psql tiene algunos comandos \d para mostrar información acerca de tipos, operadores, funciones, agregados, etc.

El sitio web contiene aún más documentación.

1.9) ¿Cómo me informo de nuevos errores o características faltantes?

PostgreSQL soporta un subjuego extendido de SQL-92. Véase nuestro TODO para una lista de errores conocidos, características faltantes y planes futuros.

1.10) ¿Cómo puedo aprender SQL?

Existe un bonito tutorial en http://w3.one.net/~jhoffman/sqltut.htm y en http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM

Otro es "Teach Yourself SQL in 21 Days, Second Edition" en http://members.tripod.com/er4ebus/sql/index.htm

Muchos de nuestros usuarios prefieren The Practical SQL Handbook, Bowman et al., Addison Wesley. Otros, Lan Times Guide to SQL, Groff et al., Osborne McGraw-Hill.

1.11) ¿Está PostgreSQL certificado Y2K?

Si, manejamos con fiabilidad fechas anteriores y posteriores al año 2000.

1.12) ¿Cómo puedo unirme al equipo de desarrollo?

Primero, descargue los últimos fuentes y lea la documentación para desarrolladores de PostgreSQL Developers en nuestro sitio web, o en la distribución. Segundo, suscríbase a las listas de correo pgsql-hackers y pgsql-patches. Tercero, envíe patches de alta calidad a apgsql-patches.

Existe sobre una docena de personas que tienen privilegios COMMIT en el archivo PostgreSQL CVS. Todos ellos enviaron muchos patches de alta calidad que supusieron quebraderos de cabeza a la hora de ser continuados por los compromisarios existentes, y no dudamos sobre la calidad de los patches que enviaron.

1.13) ¿Cómo envío informes sobre fallos de funcionamiento?

Rellene el fichero "bug-template" y envíelo a: bugs@postgreSQL.org

También compruebe nuestro sitio ftp ftp://ftp.postgreSQL.org/pub para ver si hay una versión más reciente de PostgreSQL o patches.

1.14) ¿Cómo comparar PostgreSQL a otros DBMS's?

Existen varias formas de comparar el software: características, rendimiento, fiabilidad, asistencia y precio.

Características
PostgreSQL tiene muchas características presentes en grandes DBMS's comerciales, como transacciones, subselecciones, disparadores, vistas y bloqueos sofisticados. Tenemos algunas características que ellos no tienen, como tipos definidos por el usuario, herencia, reglas y control de concurrencia multi versión para reducir la contención de bloqueo. No tenemos integridad referencial de claves externas o enlaces externos, pero estamos trabajando en ello para la próxima versión.
Rendimiento
PostgreSQL se ejecuta en dos modos. El modo normal fsync vuelca cada transacción completada en el disco, garantizando que si el Sistema Operativo se bloquea o se produce una pérdida de energía en los siguientes segundos, todos sus datos están almacenados y sin daños en el disco. En este modo, somos más lentos que muchas bases de datos comerciales, principalmente porque algunas de ellas realizan volcados a disco de tipo conservador en sus modos por defecto. En el modo no-fsync, somos generalmente más rápidos que las bases de datos comerciales, aunque en este modo un fallo del Sistema Operativo podría corromper los datos. Estamos trabajando en una solución intermedia que que provoque menos sobrecargas en el rendimiento que el modo full fsync, y permitirá la integridad de los datos dentro de los 30 segundos anteriores a un fallo del Sistema Operativo. El modo es seleccionable por el administrador de la base de datos.

En comparación con MySQL sistemas de bases de datos más débiles, somos más lentos en inserciones/actualizaciones porque tenemos cabeceras de transacción. Desde luego, MySQL no tiene ninguna de las características mencionadas en la anterior sección Características. Nos hemos basado en la flexibilidad y en las características, aunque si bien continuamos trabajando en la mejora del rendimiento a través de un perfilamiento y análisis del código fuente. Existe una página web interesante que presenta la comparación entre PostgreSQL y MySQL en http://openacs.org/why-not-mysql.html

Manejamos cada conexión de usuario mediante la creación de un proceso Unix. Los procesos de fondo comparten buffers de datos e información de bloqueo. Con múltiples CPU's, múltiples procesos de fondo pueden correr fácilmente en diferentes CPU's.
Fiabilidad
Tenemos claro que una DBMS debe ser fiable, o de otro modo es una pérdida de tiempo. Nos esforzamos en generar código estable y bien probado que tenga un mínimo de errores. Cada release tiene al menos un mes de beta testing, y nuestro histórico de releases muestra que podemos suministrar versiones sólidas y estables que están listas para uso productivo. Creemos que en este aspecto podemos compararnos favorablemente a otros softwares de bases de datos.
Asistencia
Nuestra lista de correo ofrece ayuda a un amplio grupo de desarrolladores y usuarios para resolver cualquier problema que encuentren. Aún cuando no podemos garantizar una reparación, las DBMS´s comerciales tampoco. El acceso directo a los desarrolladores, la comunidad de usuarios, manuales, y el código fuente hacen a veces que la asistencia de PostgreSQL sea superior a otros DBMS's. Existe asistencia específica "por incidente" para quien la necesite. (Véase item FAQ asistencia.)
Precio
Somos gratuitos para cualquier uso, tanto comercial como no comercial. Puede añadir nuestro código a su producto sin limitaciones, excepto aquellas indicadas en nuestra licencia BSD citada anteriormente.
 


Preguntas del usuario del Cliente

2.1) ¿Existen controladores ODBC para PostgreSQL?

Hay dos controladores ODBC disponibles, PostODBC y OpenLink ODBC.

PostODBC se incluye con la distribución. Puede encontrarse más información en: http://www.insightdist.com/psqlodbc

OpenLink ODBC puede encontrarse en http://www.openlinksw.com/. Funciona con los programas clientes ODBC, por lo que puede tener disponible un driver ODBC para PostgreSQL ODBC para cualquier plataforma cliente  (Win, Mac, Unix, VMS).

Este producto esta probablemente a la venta para quien necesite soporte profesional de calidad, pero puede encontrarse una versión freeware. Consultar postgres95@openlink.co.uk.

2.2) ¿Que herramientas hay disponibles para conectar PostgreSQL con páginas Web?

Puede encontrarse una buena introducción a las páginas Web con dorsal de base de datos en: http://www.webtools.com/

Hay otra en: http://www.phone.net/home/mwm/hotlist/

para integración con Web, PHP es una excelente interfase. Está en: http://www.php.net/

PHP es fantástico para cosas simples, pero para casos más complejos, puede usarse la interfase con perl y CGI.pm.

Una pasarela WWW basada en WDB usando perl puede descargarse de http://www.eol.ists.ca/~dunlop/wdb-p95

2.3) ¿Tiene PostgreSQL una interfase gráfica? ¿Y un generador de informes? ¿Y una interfase para lenguajes de consulta empotrados?

Tenemos una buena interfase gráfica llamada pgaccess, que se incluye como parte de la distribución. Pgaccess tiene también un generador de informes. Su página Web está en  http://www.flex.ro/pgaccess

También se incluye ecpg, que es una interfase empotrada para el lenguaje de consultas SQL en C.

2.4) ¿Que lenguajes están disponibles para comunicarse con  PostgreSQL?

Tenemos:


Administrative Questions

3.1) ¿Por qué initdb falla?

3.2) ¿Cómo puedo instalar PostgreSQL en algún sitio distinto de /usr/local/pgsql?

El camino más simple es especificar la --opción de prefijo cuando ejecutas configure. Si tu olvidaste hacerlo cuando tú puedes editar Makefile.global y cambiar POSTGRESDIR por consiguiente, o crear un Makefile propio y definir POSTGRESDIR aquí.

3.3) Cuándo inicio el postmaster, Obtengo un Llamada errónea del sistema o un mensaje core dumped . ¿Por qué?

Esto puede ser varios problemas, pero lo primero que hay que comprobar es ver si tenemos instaladas las extensiones del system V en nuestro núcleo. PostgreSQL requiere que el núcleo soporte la memoria compartida y los semáforos.

3.4) Cuándo intento iniciar postmaster, Obtengo un error IpcMemoryCreate errors3. ¿Por qué?

No tienes configurado correctamente la memoria compartido en el núcleo o necesitas agrandar la memoria compartida disponible en el núcleo. La cantidad exacta que necesitas depende de tu arquitectura y de cuantos buffers y procesos backend configures para ejecutar postmaster. Para muchos sistemas, con el número por defecto de buffers y procesos, necesitas un mínimo de ~1MB.

3.5) Cuándo intento iniciar postmaster, Obtengo un error IpcSemaphoreCreate. ¿Por qué?

Si el mensaje de error es IpcSemaphoreCreate: semget failed (Sin espacio en el dispositivo) entonces tu núcleo no está configurado con suficientes semáforos. Postgres necesita un semáforo para cada proceso backend potencial. Una solución temporal es comenzar postmaster con un número límite más pequeño de procesos backend. Usa -N con un parámetro más pequeño que el 32 por defecto. Una solución permanente es elevar los parámetros del tu núcleo SEMMNS y SEMMNI.

Si el mensaje de error es algo parecido, tu no debes tener el soporte de semáforo configurado del todo en tu núcleo.

3.6) ¿Cómo me prevengo del acceso de otros hosts a mi base de datos PostgreSQL?

Por defecto, PostgreSQL sólo permite conexiones desde la máquina local usando los dominios sockets. Otras maquinas no serán capaces de conectarse sin que tú añadas la opción -i en postmaster, y habilitas la autenticación basada en el host modificando el fichero $PGDATA/pg_hba.conf .Por consiguiente esto permitirá las conexiones TCP/IP.

3.7) ¿Por qué no puedo conectarme a mi base de datos desde otra máquina?

La configuración por defecto permite sólo conexiones mediante el dominio socket de unix desde la máquina local. Para habilitar las conexiones TCP/IP, hay que tener cuidad de que postmaster haya sido iniciado con la opción -i, y añadir la entrada apropiado de host en el fichero pgsql/data/pg_hba.conf. Mira las páginas del manual de pg_hba.conf.

3.8) ¿Por qué no puedo acceder a la base de datos como usuario root?

Tú no debes crear usuarios de bases de datos con el identificador de usuario 0 (root) Estos no podrán acceder a la base de datos. Es una precaución de seguridad debido a la capacidad de cualquier usuario de poder enlazar dinámicamente módulos objeto al motor de base.

3.9) Todos mis servidores fallan bajo el acceso concurrente a tablas ¿Por qué?

Este problema puede ser causado por el núcleo que no esté configurado para soportar semáforos.

3.10) ¿Cómo afino el motor de base de datos para mejorar el rendimiento?

Ciertamente, los índices pueden acelerar las consultas. El comando EXPLAIN habilita que tú veas como PostgreSQL interpreta tu consulta, y que índices está usando.

Si estás haciendo muchos INSERTs, considera hacerlo en un gran proceso por lotes usando el comando COPY. Esto es más rápido que un solo INSERTS individual. Segundo, la sentencia que no esta en un bloque de transacción BEGIN WORK/COMMIT se considera que esta en su propia transacción. Considera la utilización de varias sentencias en un mismo bloque transaccional. Esto reduce el gasto transaccional. También considera quitar o recrear índices cuando las modificaciones de los datos son grandes.

Hay bastantes cosas para afinar que puedes hacer. Puedes deshabilitar fsync() al iniciar el postmaster con las opciones -o -F. Esto previene fsync() del vaciado del disco después de cada transacción.

También puedes usar la opción de postmaster -B para incrementar el número de buffers de memoria compartida usados por los procesos backend. Si haces que este parámetro sea muy alto, postmaster nunca inicia porque has excedido el límite de espacio de memoria compartida del núcleo. Cada buffer es de 8K y por defecto hay 64 buffers.

Tú puedes también usa la opción del backend -S para incrementar la cantidad máxima de memoria usada por los procesos backend para las ordenaciones temporales. El valor de -S está medido en kilobytes, y por defecto es de 512 (pe, 512K).

También puedes usar el comando CLUSTER para agrupar los datos en una tabla base para indexarla. Mira las páginas del manual cluster(l) para más detalles.

3.11) ¿Qué características de depuración están disponibles en PostgreSQL?

PostgreSQL tiene varias caracteristicas que dan información del estado que te pueden ser valiosas para depurar.

Primero, ejecutando configure con la opción--enable-cassert, muchos assert() controlan el progreso de los backend y para el programa cuando ocurre algo inesperado.

Ambos, postmaster y postgres tienen varias opciones de depuración disponibles. Primero, cuando tú inicias postmaster, ten cuidado de enviar la salida standard y la de error a un fichero de log, como:

	cd /usr/local/pgsql
	./bin/postmaster >server.log 2>&1 &

Esto pondrá varios ficheros de log en el nivel más alto del directorio de PostgreSQL. Este fichero contiene información útil acerca de los problemas o errores encontrados por el servidor. Postmaster tiene la opción -d que permite aun más información detallada para ser informada. La opción -d coge el número que especifica el nivel de depuración. Es peligroso un valor alto del nivel de depuración ya que genera grandes ficheros de log.

Tú puedes actualmente ejecutar backend de postgres desde la línea de comandos, y escribir tu sentencia SQL directamente. Esto sólo se recomienda si el propósito es depurar. Notar que la terminación de nueva línea de la consulta, no es el punto y coma. Si tú has compilado con símbolos de depuración, tú puedes utilizar el depurador para ver lo que está pasando. Debido a que el backend no fue iniciado por el postmaster, este no se ejecuta en un mismo entorno y los problemas de interacción entre backend no pueden ser duplicado. Algunos depuradores pueden adjuntar a un backend que ya está ejecutándose; que es el método más conveniente para diagnosticar los problemas en un entorno normal multi-backend.

El programa postgres tiene las opciones -s, -A, y -t que pueden ser muy útiles para la depuración y la medida del rendimiento.

Tú también puedes compilar con el perfil para ver que funciones están usando tiempo de ejecución. Los ficheros del perfil de los backend estarán depositados en el directorio pgsql/data/base/dbname. El perfil del cliente estará localizado en el directorio actual del cliente.

3.12) Obtengo 'Sorry, too many clients' cuando intento conectarme. ¿Por qué?

Tu necesitas aumentar el límite del posmaster para cantidad de procesos backend concurrentes que puede iniciar.

En Postgres 6.5 y superiores, el límite por defecto es 32 procesos. Tú puedes aumentarlo reiniciando el postmaster con el más conveniente valor -N. Con la configuración por defecto tú puedes poner -N más grande que 1024; si tú necesitas más, aumenta MAXBACKENDS en include/config.h y reconstruirlo. Puedes poner el valor -N por defecto en tiempo de configuración, si te gusta, usando el modificador de configuración --with-maxbackends.

Notar que si incrementas -N más de 32, debes también incrementar -B por encima del 64 que es por defecto; -B debe ser dos veces como mínimo -N, y probablemente debe ser más para un mejor rendimiento. Para un gran número de procesos backend, también es probable buscar si necesitas incrementar varios parámetros de configuración del núcleo de Unix. Cosas a mirar incluyen la máxima longitud de los bloques de memoria compartida, SHMMAX, el número máximo de semáforos, SEMMNS y SEMMNI, el número máximo de procesos, NPROC, el número máximo de procesos por usuario, MAXUPRC, y el número máximo de ficheros abiertos, NFILE y NINODE. La razón por la que Postgres tiene limitado el número de procesos backend permitidos es que puedes asegurar que tu sistema no funcionará sin recursos.

En las versiones superiores a la 6.5 de Postgres, el número máximo de backends eran 64, y el cambio requería la reconstrucción después de alterar la constante MaxBackendId en include/storage/sinvaladt.h.

3.13) ¿Qué son los ficheros pg_psort.XXX en mi directorio de base de datos?

Hay ficheros temporales generados por el ejecutor de consultas. Por ejemplo, si una ordenación necesita para realizarse satisfacer un ORDER BY, y la ordenación requiere más espacio del que el parámetro -S permite, entonces los ficheros temporales son creados para contener los datos extras.

Los ficheros temporales se deberían borrar automáticamente, pero podría ser que no si durante una ordenación el proceso falla. Si no hay transacciones ejecutándose en este mismo momento, es seguro borrar los ficheros pg_tempNNN.NN.

3.14) ¿Cómo configuro el pg_group?

Actualmente, no existe una interface fácil, para configurar los grupos de usuarios. Tienes que insertar/modificar explícitamente la tabla pg_group. Por ejemplo:

	jolly=> insert into pg_group (groname, grosysid, grolist)
	jolly=>     values ('posthackers', '1234', '{5443, 8261}');
	INSERT 548224
	jolly=> grant insert on foo to group posthackers;
	CHANGE
	jolly=>

Los campos de pg_group son:


Preguntas acerca del funcionamiento

4.1) El sistema parece confundirse con las comas, puntos decimales y los formatos de fechas.

Compruebe su configuración local. PostgreSQL utiliza la configuración local del usuario que arranca el proceso postmaster. Existen comandos SET de postgres y psql para controlar el formato de fecha. Fije este valor de acuerdo con su entorno habitual.

4.2) ¿Cuál es la diferencia exacta entre cursores binarios y cursores normales?

Vea la página del manual de DECLARE para una descripción.

4.3) ¿Cómo seleccionar solamente las primeras filas de una consulta?

Vea la página del manual de FETCH o utilice SELECT ... LIMIT....

Puede que se deba evaluar la consulta entera, aun en el caso de que quiera que evalúe unas pocas filas. Considere usar una consulta que tenga ORDER BY. Si hay un índice que concuerda con ORDER BY, PostgreSQL será capaz de evaluar sólo los primeros registros pedidos o se evaluará la totalidad de la consulta hasta que se obtengan las filas requeridas.

4.4) ¿Cómo obtener una lista de tablas u otras cosas que pueda ver con psql?

Puede leer el código fuente de psql, pgsql/src/bin/psql/psql.c. Contiene comandos SQL que generan la salida en la línea de comando de psql. También puede arrancar psql con la opción -E, de modo que le mostrará las consultas que utiliza para ejecutar los comandos que usted le pasa.

4.5) ¿Cómo borrar una columna de una tabla?

No se soporta ALTER TABLE DROP COLUMN, pero puede hacer eso:

	SELECT ...  -- seleccione todas las columnas excepto las que quiera borrar
	INTO TABLE nueva_tabla
	FROM vieja_tabla;
	DROP TABLE vieja_tabla;
	ALTER TABLE nueva_tabla RENAME TO vieja_tabla;

4.6) ¿Cuál es el tamaño máximo de una fila, tabla o base de datos?

Las filas están limitadas a un tamaño de 8 Kb, pero esto se puede cambiar editando include/config.h y cambiando BLCKSZ. Para usar atributos más grandes que 8 Kb, puede usar el interfaz para objetos grandes.

Las filas no pasan el límite de 8 Kb, por lo que una fila de 5 Kb requiere 8 Kb para almacenarse.

Para tablas y bases de datos no existen límites. Hay muchas bases de datos que tienen decenas de gigabytes y algunas incluso cientos.

4.7) ¿Cuánto espacio de disco requiere una base de datos para almacenar un fichero normal y corriente?

Una base de datos Postgres puede requerir alrededor de 6 veces y medio más de disco que lo que necesita para almacenar un fichero normal.

Considere un fichero de 300.000 líneas con dos enteros en cada línea. Un fichero normal ocuparía 2,4 Mb, mientras que una base de datos de PostgreSQL con esos datos se estima que ocuparía unos 14 Mb:

    36 bytes: cada cabecera de columna (aproximado)
   + 8 bytes: dos campos con enteros, 4 cada uno
   + 4 bytes: puntero en página a un tuplo
   ----------------------------------------
    48 bytes por fila

   La página de datos en PostgreSQL es 8192 bytes (8 KB). Así que:

   8192 bytes por página
   -------------------   =  171 filas por base de datos (redondeo hacia arriba)
     48 bytes por fila

   300000 filas de datos
   --------------------  =  1755 páginas en la base de datos
      171 filas por página

1755 página base datos * 8192 bytes por página  =  14.376.960 bytes (14 Mb)

Los índices no tienen tanta sobrecarga, pero contienen los datos que están siendo indexados, por lo que también pueden ser grandes.

4.8) ¿Cómo saber qué índices u operaciones están definidos en la base de datos?

psql tiene una variedad de comandos con barra invertida para mostrar esta información. Utilice \? para verlos.

Pruebe también pgsql/src/tutorial/syscat.source. Muestra muchos de los SELECTs necesarios para obtener información de las tablas del sistema de base de datos.

4.9) Mis consultas van despacio o no hacen uso de índices. ¿Porqué?

PostgreSQL no mantiene automáticamente estadísticas. Cada uno debe hacer explícitamente una llamada a VACUUM para actualizar las estadísticas. Después de que éstas se hayan actualizado, el optimizador conoce cuántas filas hay en la tabla y puede decidir mejor si debería utilizar índices. Tenga en cuenta que el optimizador no usa índices en los casos en que la tabla es pequeña, debido a que una búsqueda secuencial es más rápida.

Utilice VACUUM ANALYZE para estadísticas optimizadas específicas para columnas. VACUUM ANALYZE es importante para consultas complejas de tipo multi-join, de modo que el optimizador puede estimar el número de filas devueltas desde cada tabla y escoger el orden correcto de un "join". El backend no trata estadísticas de columna por sí solo, así que VACUUM ANALYZE debería ejecutarse periódicamente para obtener periódicamente estas estadísticas.

Normalmente no se usan los índices para operaciones de tipo ORDER BY: una búsqueda secuencial seguida de una ordenación explícita es más rápida que una búsqueda por índices de todos los tuplos de una tabla grande porque emplea más accesos a disco.

Cuando utilice operadores comodín como LIKE o ~, los índices sólo pueden ser usados si el comienzo de la búsqueda fijada al comienzo de de la cadena (string). Así que para usar índices, las búsquedas con LIKE no deberían empezar con %, y ~ (expresiones regulares de búsqueda) debería empezar con ^.

4.10) ¿Cómo ver de qué manera el optimizador de consultas está evaluando mi consulta?

Vea en el manual la explicación de EXPLAIN.

4.11) ¿Qué es un índice R-tree?

Un índice r-tree es usado para indexar datos espaciales. Un índice hash no puede manejar búsquedas por rangos. Un índice B-tree solamente maneja búsquedas por rango de una dimensión. Los R-tree pueden manejar datos multidimensionales. Por ejemplo, si un índice R-tree index puede ser construido sobre un atributos del tipo point, el sistema puede responder más eficientemente a consultas como seleccionar todos los puntos dentro de un rectángulo.

El escrito que describe el diseño original de los R-Tree es:

Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.

También puede encontrar esta documentación en "Readings in Database Systems", de Stonebraker

Los R-Trees presentes pueden manejar polígono y cahas. En teoría los R-trees pueden ser ampliados para manejar un mayor número de dimensiones. In la práctica, ampliar los R-trees requiere un poco de trabajo y actualmente no disponemos de documentación sobre cómo hacerlo.

4.12) ¿Qué es una optimización genérica de una consulta?

El modulo de PostgreSQL llamado GEQO tiene el propósito de resolver el problema de optimización de las consultas que resultan de unir varias tablas por medio de un Algoritmo Genético (Genetic Algorithm, GA). Permite manejar grandes consultas tipo "join" por medio de búsquedas no exhaustivas.

Para mayor información, consulte la documentación.

4.13) ¿Cómo hacer búsquedas de expresiones regulares y búsquedas de expresiones regulares sensibles al contexto?

El operador ~ realiza coincidencias de expresiones regulares y ~* realiza coincidencias sensibles a mayúsculas y minúsculas en expresiones regulares. No hay ninguna variante de LIKE sensible a mayúsculas/minúsculas, pero puede obtener el efecto de sensibilidad a mayúscula/minúsculas LIKE con esto:

	WHERE lower(texto) LIKE lower(patrón)

4.14) En una consulta, ¿cómo detectar si un campo es NULL (nulo)?

Utilice IS NULL e IS NOT NULL.

4.15) ¿Cuál es la diferencia entre los diferentes tipos de caracteres?

Tipo          Nombre interno  Notas
--------------------------------------------------
"char"          char            1 carácter
CHAR(#)         bpchar          relleno con espacios en blanco hasta la longitud especificada
VARCHAR(#)      varchar         longitud máxima, no relleno
TEXT            text            longitud limitada sólo por longitud máxima de fila
BYTEA           bytea           array de bytes de longitud variable

Verá el nombre interno cuando examine los catálogos de sistema o en algunos mensajes de error.

Los cuatro últimos tipos son tipos "varlena" (es decir, los primeros cuatro bytes son la longitud, seguidos de los datos). char(#) asigna el número máximo de bytes sin tener en cuenta cuánntos datos están almacenados en el campo. text, varchar(#), y bytea tienen una longitud variable en el disco y, por esto, hay una penalización en las prestaciones cuando los usa, Esta penalización se da cuando accede a todas las columnas después de acceder a la primera de este tipo.

4.16.1) ¿Cómo crear un campo serie/autoincremento?

PostgreSQL soporta tipos de datos SERIAL. Automáticamente crea una secuencia e índice en la columna. Por ejemplo, esto...

	CREATE TABLE person ( 
		id   SERIAL, 
		name TEXT 
	);

...se traduce automáticamente a esto otro...

	CREATE SEQUENCE person_id_seq;
	CREATE TABLE person ( 
		id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
		name TEXT 
	);
	CREATE UNIQUE INDEX person_id_key ON person ( id );

Consulte create_sequence en el manual para tener más información sobre secuencias. También puede usar cada campo oid de las filas como valor único. Sin embargo, si necesita volcar y recargar la base de datos deberá usar la opción pg_dump -o o COPY WITH OIDS para preservar los oid.

Para más detalles vea el capítulo de Bruce Momjian chapter en Numbering Rows.

4.16.2) ¿Cómo obtener el valor de una inserción serie (serial insert)?

Quizás la manera más simple es obteniendo el próximo valor de la serie del objeto secuencia con la función nextval() antes de insertar y entonces insertarlo explícitamente. Usando la tabla de ejemplo en 4.16.1, que aperecería así:

	$newSerialID = nextval('person_id_seq');
	INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal');

Entonces tendrá también el nuevo valor almacenado en $newSerialID para ser usado en otras consultas (por ejemplo, como una clave foránea en la tabla person). Tenga que el nombre que el nombre del objeto secuencia automáticamente creado será <table>_<serialcolumn>_seq, donde table y serialcolumn son los nombres de la tabla y la columna SERIE respectivamente.

Del mismo modo, podría recuperar el recién asignado valor serie con la función currval() después de que fuera insertado por defecto. Por ejemplo:

	INSERT INTO person (name) VALUES ('Blaise Pascal');
	$newID = currval('person_id_seq');

Finalmente, puede utilizar el oid devuelto desde la declaración INSERT para encontrar el valor por defecto, aunque esta es la aproximación menos portable. En perl, usando DBI con el módulo de Edmund Mergl DBD::Pg, el valor oid se muestra disponible por medio de $sth->{pg_oid_status} después de $sth->execute().

4.16.3) ¿No provoca el uso de currval() y nextval() una condición de competencia con otros procesos concurrentes del backend?

No. Esto es gestionado por los backends.

4.17) ¿Qué es un oid? ¿Qué es un tid?

Los OID son las respuesta de PostgreSQL a ids de filas únicas. Cada fila que es creada en PostgreSQL obtiene una única oid. Todos los oid generados durante initdb son menos de 16384 (de backend/access/transam.h). Todos los oid creados por el usuario son mayor o igual que este. Por defecto, todos estos oid son únicos, no sólo dentro de tablas o bases de datos, sino también a lo largo de la instalación de PostgreSQL.

PostgreSQL usa oids en sus tablas internas de sistema para enlazar filas entre tabalas. Estos oids pueden ser usados para identificar filas de un usuario específico y usados también en joins. Se recomienda que use oid tipo columna para almacenar los valores oid. Vea la sección de manual sql(l) para estudiar las otras columnas internas. Puede crear un índice en el campo oid para accesos más rápidos.

Los oids se asignan a cada nueva fila de un área central que es usada por todas las bases de datos. Si quiere cambiar el oid a cualquier otro valor o si quiere hacer una copia de una tabla con los oids originales, no hay ninguna razón que se lo impida:

        CREATE TABLE new_table(old_oid oid, mycol int);
        SELECT INTO new SELECT old_oid, mycol FROM old;
        COPY new TO '/tmp/pgtable';
        DELETE FROM new;
        COPY new WITH OIDS FROM '/tmp/pgtable';

Los tids se usan para identificar filas específicas con bloques y valores de desplazamiento (offset). Los tids cambian después de que se haya modificado o recargado una fila. Son usado por las entradas de índice apuntar a filas físicas.

4.18) ¿Cuál es el significado de algunos términos usados en PostgreSQL?

Parte del código fuente y documentación vieja usa términos que tienen un uso más común. Aquí están algunos:

4.19) ¿Porqué me da este error "FATAL: palloc failure: memory exhausted?"

Es posible que su sistema se haya quedado sin memoria virtual o que el kernel tenga un límite muy bajo para ciertos recursos. Intento probar esto antes de arrancar el postmaster:

	ulimit -d 65536
	limit datasize 64m

Dependiendo de su shell, solamente uno de ellos puede tener éxito, pero fijará el límite del segmento de datos de su proceso a un valor más alto y quizás permita que la consulta termine. Este comando se aplica al proceso actual y a todos los sub-procesos creados después de que el comando se ejecutara. Si tiene problemas con el cliente SQL porque el backend devuelve demasiados datos, pruébelo antes de arrancar el cliente.

4.20) ¿Cómo saber qué versión de PostgreSQL estoy usando?

Desde psql, escriba select version();

4.21) Las operaciones con objetos grandes me dan el invalid large obj descriptor. ¿Por qué?

Debe poner BEGIN WORK y COMMIT para englobar cualquier uso de objetos grandes, esto es, que englobe lo_open ... lo_close.

PostgreSQL impone la regla de cerrar el uso de objetos grandes en transacciones y daría un error en el comando lo_open si no se está dentro de una transacción. De modo que el primer intento de hacer cualquier cosa con él pintará en pantalla invalid large obj descriptor. El código que antes funcionaba generará ahora ese mensaje de error si usted falla al realizar una transacción.

Si está utilizando un interfaz cliente como ODBC, puede ser necesario que especifique auto-commit off.

4.22) ¿Cómo creo una columna que tome por defecto la hora actual?

Esto siempre funciona:

	CREATE TABLE test (x int, modtime timestamp default now() );

En las versiones 7.0 y posteriores puede usar:

	create table test (x int, modtime timestamp default 'now');

4.23) ¿Porqué son tan lentas mis sub-consultas cuando uso IN?

Normalmente unimos sub-consultas con otras externas haciendo una búsqueda secuencial de los resultados de la sub-consulta para cada fila de la consulta externa. Un modo de evitar esto es reemplazar IN con EXISTS. Por ejemplo, cambie:

	SELECT *
	FROM tab
	WHERE col1 IN (SELECT col2 FROM TAB2)

por:

	SELECT *
	FROM tab
	WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)

Esperamos eliminar esta limitación en futuras versiones


Extendiendo PostgreSQL

5.1) He escrito una función de usuario. Cuando la ejecuto con psql, ¿por qué provoca un volcado de núcleo (dump core)?

El problema puede venir por varias cosas. Pruebe su función de usuario en un programa independiente.

5.2) ¿Que significa el mensaje: NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! ?

Está liberando con  pfree una memoria que no ha sido asignada con  palloc. Tenga cuidado de no mezclar malloc/free y palloc/pfree.

5.3) ¿Como puedo contribuir aportando algunos nuevos tipos y funciones a  PostgreSQL?

Envíe sus extensiones a la lista de correo pgsql-hackers, y puede que sean incluidas en el subdirectorio  contrib/.

5.4) ¿Como puedo escribir una función en C que devuelva un par de valores?

Esto requiere dominio tan extremo que los autores no lo han intentado nunca, aunque en principio puede hacerse.

5.5) He cambiado un fichero fuente ¿Por qué si recompilo no se observa el cambio?

 Makefiles no tiene las dependencias adecuadas para los ficheros incluidos. Tiene que hacer un  make clean y después otro  make