varlena
varlena
PostgreSQL Training,
Consulting & Support
General Bits
By A. Elein Mustain


3-Nov-2003 Edición: 50

Archives | General Tidbits | Google General Bits | Docs | Castellano | Português | Subscriptions | Notifications

General Bits General Bits es una publicación periódica escrita con información desde la lista de PostgreSQL, pgsql-general.
Para saber más sobre pgsql-general y PostgreSQL, visite www.PostgreSQL.org.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Cincuenta Ediciones
General Bits 03-Nov-2003

Ha sido mi costumbre escribir una editorial o una encuesta cada diez ediciones. Ahora se han cumplido 50 semanas en que esta columna ha sido publicada. Eso es casi un año completo de publicación. Espero que hayan encontrado que la calidad ha mejorado con el paso del tiempo.

Celebro la adición de traducciones a los idiomas portugués y español. Juliano da Silva y Álvaro Herrera han tomado una difícil tarea y han hecho un maravilloso trabajo ayudando a divulgar esta columna a sus comunidades.

En el futuro, me gustaría solicitar más contribuciones de funciones, esquemas y tips desde ustedes directamente. Expandiré los archivos de Tidbits para incluir más código de las ediciones regulares. Quiero que Tidbits sea un buen lugar para buscar ejemplos de cosas interesantes.

Hay dos ejemplos de contribuciones en esta edición. El primero es una guía COMO (How-to) y el segundo es una función plpgsql muy útil. Compartiendo varios documentos, como los documentos de rendimiento de Josh y código documentado como los Ejemplos de Funciones que Retornan Conjuntos de Stephan Szabo, espero proveer un recurso rico para PostgreSQL.

La palabra de la semana es colaboración. Pueden enviar comentarios, sugerencias, documentos y ejemplos de código a elein.

Editor: elein at varlena.com

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CÓMO de eRServer en Debian
[Erserver-general] Erserver Debian HOWTO URL 24-Oct-2003

Ivailo T. Ivanov de Mag Studio ha escrito una breve guía COMO de eRServer en Debian. Proveerá un buen punto de partida para los problemas iniciales de la instalación con Debian. También está disponible en el área Tidbits.

Nota de la Editora: La secuencia completa de pasos no fue verificada

Contribuyó: Ivailo Toshev Ivanov ivo at magstudio.net

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Validación de Tarjetas de Crédito
[sfpug] [cool hack] Credit Card validator 30-Oct-2003

David Fetter portó el módulo Business::CreditCard a plpgsql. Esto es muy útil si no puede usar plperl en su base de datos por alguna razón y necesita hacer validación de tarjetas de crédito. La evaluación de los números de la tarjeta es un buen ejemplo del uso del operador ~.

Este es un buen ejemplo de la clase de procesamiento necesario para aplicaciones de negocios que puede ser hecha en el servidor. Puesto que muchas aplicaciones pueden acceder a la base de datos, es bueno contar con una rutina centrada en la base de datos de manera que todas las aplicaciones puedan hacer la validación consistentemente.

CREATE OR REPLACE FUNCTION cc_check (VARCHAR) RETURNS BOOLEAN AS '
DECLARE
    cc_num     ALIAS FOR $1;
    i          INTEGER;
    d          VARCHAR;
    weight     INTEGER;
    checksum   INTEGER := 0;
    oddness    INTEGER;
    num        INTEGER;
    tempstring VARCHAR;
BEGIN
    -- Strip out non-digits.  Oh, for an s/// construct! :)
    tempstring := '''';
    FOR i IN 1 .. length(cc_num)
    LOOP
        d := SUBSTRING(cc_num, i, 1);
        IF d ~ ''[0-9]''
        THEN
            tempstring := tempstring || d;
        END IF;
    END LOOP;
    -- Check length for reasonableness.
    IF (length(tempstring) < 13)
    THEN
        RAISE NOTICE ''% is too short to be a credit card number.'', cc_num;
        RETURN FALSE;
    END IF;
    -- Do a Luhn checksum.
    oddness := length(tempstring) % 2;
    FOR i IN 1 .. length(tempstring)
    LOOP
        num := SUBSTRING(tempstring, i, 1)::integer;
        IF (oddness = 0 AND i % 2 = 1)
        THEN
            num := num * 2;
        ELSIF (oddness = 1 AND i%2 = 0)
        THEN
            num := num * 2;
        END IF;
        IF num > 9
        THEN
            num := num - 9;
        END IF;
        checksum := checksum + num;
    END LOOP;
    IF checksum % 10 <> 0
    THEN
        RAISE NOTICE ''% does not have a valid checksum.'', cc_num;
        RETURN FALSE;
    END IF;
    IF tempstring ~ ''^3[47][0-9]{13}$''
    THEN
        RAISE NOTICE ''% is an American Express card.'', cc_num;
    ELSIF tempstring ~ ''^4[0-9]{12}([0-9]{3})?$''
    THEN
        RAISE NOTICE ''% is a VISA card.'', cc_num;
    ELSIF tempstring ~ ''^5[1-5][0-9]{14}$''
    THEN
        RAISE NOTICE ''% is a MasterCard.'', cc_num;
    ELSIF tempstring ~ ''^6011[0-9]{12}$''
    THEN
        RAISE NOTICE ''% is a Discover card.'', cc_num;
    ELSIF tempstring ~ ''^3(0[0-5]|[68][0-9])[0-9]{11}$''
    THEN
        RAISE NOTICE ''% is a Diners Club/Carte Blanche.'', cc_num;
    ELSIF tempstring ~ ''^2(014|149)\d{11}$''
    THEN
        RAISE NOTICE ''% is an enRoute card.'', cc_num;
    ELSIF tempstring ~ ''^(3\d{4}|2131|1800)\d{11}$''
    THEN
        RAISE NOTICE ''% is a JCB card.'', cc_num;
    ELSIF tempstring ~ ''^56(10\d\d|022[1-5])\d{10}$''
    THEN
        RAISE NOTICE ''% is a BankCard.'', cc_num;
    END IF;
    RETURN TRUE;
END;
' LANGUAGE 'plpgsql';

Contribuyó: David Fetter david at fetter.org

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Respuestas a Algunas Preguntas sobre Optimización
[GENERAL] formatting of SQL sent by PHP to postgres 30-Oct-2003

Pregunta: ¿Es superfluo el punto y coma (;) al final de una sentencia SQL cuando se envía a Postgres desde PHP?
Respuesta: Sí, el punto y coma es innecesario cuando se envían sentencias desde PHP.

Pregunta: ¿La cantidad de espacio en blanco generado por PHP en consultas SQL tiene algún efecto en la velocidad de la consulta?
Respuesta: No. Probablemente no puede medirse, a menos que hayan varios kilobytes de espacios.

Pregunta: ¿Cómo puedo acelerar

select max(id) from table;
Respuesta: Reemplácelo por
select id from table order by id desc limit 1;

Pregunta: ¿Por qué uno es más rápido que el otro? En SQL Server funcionan igual.
Respuesta: Debido a MVCC, PostgreSQL no usa el índice para la agregación, de manera que max() es más lento que la consulta que usa el índice. Note que esto sólo funciona si no hay NULLs en la columna y si hay un índice en la columna.

Para información general y discusión acerca de rendimiento en PostgreSQL, suscríbase a la lista pgsql-performance.

Contribuyeron: Ken Guest kguest@stockbyte.com, scott.marlowe scott.marlowe@ihs.com, David Green david@sagerobot.com, Robert Treat xzilla@users.sourceforge.net, Greg Stark gsstark@mit.edu, Hervé Piedvache herve@elma.fr, Tom Lane tgl at sss.pgh.pa.us

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Módulos de Perl para PostgreSQL
[GENERAL] Best Perl Option? 30-Oct-2003

El mejor módulo de Perl para PostgreSQL es DBD::Pg, que ahora se hospeda en gborg. Pg.pm también está disponible, junto con otros, a través de gborg y CPAN.

Contribuyeron: David Busby busby at pnts.com Doug McNaught doug at mcnaught.org Network Administrator netadmin at vcsn.com


Comments and Corrections are welcome. Suggestions and contributions of items are also welcome. Send them in!.
Copyright A. Elein Mustain 2003, 2004,2005

Google
Search General Bits & varlena.com Search WWW