<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>2ndQuadrant Italia</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/" />
    <link rel="self" type="application/atom+xml" href="http://blog.2ndquadrant.it/it/atom.xml" />
    <id>tag:blog.2ndquadrant.it,2008-11-08:/it//2</id>
    <updated>2012-03-20T22:08:49Z</updated>
    <subtitle>Il blog di 2ndQuadrant Italia.
PostgreSQL e argomenti correlati.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Open Source 4.12</generator>

<entry>
    <title>PostgreSQL 9.1 a Codemotion</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2012/03/postgresql-91-a-codemotion.html" />
    <id>tag:blog.2ndquadrant.it,2012:/it//2.192</id>

    <published>2012-03-20T20:45:02Z</published>
    <updated>2012-03-20T22:08:49Z</updated>

    <summary>Questo fine settimana parteciperò a Codemotion 2012, con un intervento su PostgreSQL 9.1, rappresentando l&apos;Associazione ITPUG - Italian PostgreSQL User Group. Per partecipare non occorrerà una preparazione specialistica. Esempio: chi usa già un database, magari di tipo diverso, e vorrebbe...</summary>
    <author>
        <name>Gianni Ciolli</name>
        <uri>http://www.2ndQuadrant.it/chi-siamo/#ciolli</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Eventi" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="codemotion2011" label="Codemotion 2011" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="novità" label="Novità" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql91" label="PostgreSQL 9.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql92" label="PostgreSQL 9.2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Questo fine settimana parteciperò a <a href="http://www.codemotion.it">Codemotion 2012</a>, con un intervento su PostgreSQL 9.1, rappresentando l'<a href="http://www.itpug.org">Associazione ITPUG - Italian PostgreSQL User Group</a>.</p>

<p>Per partecipare non occorrerà una preparazione specialistica. Esempio: chi usa già un database, magari di tipo diverso, e vorrebbe approfittare per conoscere meglio PostgreSQL. Oppure chi deve gestire un progetto e sta valutando le tecnologie da usare, incluso il tipo di database. Oppure chi conosce già PostgreSQL, però una versione precedente, e vuole un breve aggiornamento in 40 minuti...</p>
]]>
        <![CDATA[<p>Dal momento che il mio co-autore Gabriele Bartolini si trova in Australia, presenterò l'intervento da solo. L'appuntamento è per venerdì e sabato prossimi <a href="http://www.codemotion.it/dove">a Roma, presso la facoltà di Ingegneria della terza Università</a>.
Di PostgreSQL 9.1 parleremo poi <a href="http://www.codemotion.it/talk/postgresql-91">alle 14:10 di sabato</a>; altri soci di ITPUG hanno annunciato la loro presenza.</p>

<p>L'idea di proporre questa comunicazione era venuta in realtà a Gabriele, <a href="http://blog.2ndquadrant.it/it/2011/03/pensieri-da-codemotion.html">entusiasta partecipante alla scorsa edizione con un intervento sempre su PostgreSQL</a>. Non corriamo tuttavia il rischio di sovrapposizioni: grazie allo sviluppo inarrestabile di PostgreSQL è possibile proporre un intervento analogo, però con contenuti largamente nuovi.</p>

<p>Infatti, rispetto a 12 mesi fa ora c'è una nuova release (la 9.1), e tutte le novità allora preannunciate sono adesso parte di numerosi sistemi live; potrò quindi passare in rassegna le novità della 9.2, sia quelle confermate (JSON nativo, backup dallo standby, scansioni index-only, COUNT(*) veloce, ...) che quelle ancora in ballo (trigger sui comandi, chiavi esterne sugli array, controllo sintattico di funzioni, ...). Credo quindi che un eventuale spettatore di Codemotion 2011 non potrà annoiarsi, se non per ragioni indipendenti dalla quantità di fatti nuovi riguardanti PostgreSQL.</p>

<p>Ulteriori informazioni dopo la conferenza conclusa; per adesso vi dò appuntamento per venerdì e sabato a Roma...</p>
]]>
    </content>
</entry>

<entry>
    <title>PGDay 2011: pubblicato il programma</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/11/pgday-italiano-2011-pubblicato-il-programma.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.182</id>

    <published>2011-11-08T08:42:10Z</published>
    <updated>2011-11-08T08:48:34Z</updated>

    <summary>Reso noto il programma del PostgreSQL Day Italiano 2011, la conferenza nazionale sul database open-source PostgreSQL, giunta alla quinta edizione, che si svolgerà a Prato il 25 novembre prossimo. Previste due track parallele e la partecipazione di importanti membri della...</summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="pgdayit2011" label="PGDay.IT 2011" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p><em>Reso noto il programma del PostgreSQL Day Italiano 2011, la conferenza nazionale sul database open-source PostgreSQL, giunta alla quinta edizione, che si svolgerà a Prato il 25 novembre prossimo.
Previste due track parallele e la partecipazione di importanti membri della comunità internazionale.</em></p>
]]>
        <![CDATA[<p>È stato finalmente pubblicato e reso noto il <a href="http://2011.pgday.it/programma-talks">programma del PGDay</a>, che prevede due percorsi paralleli, uno di carattere generale e per DBA, l'altro per sviluppatori.</p>

<p>Ospite d'eccezione sarà <strong>Magnus Hagander</strong>, membro del Core Team di Postgres e presidente dell'associazione PostgreSQL Europe, che terrà il "Keynote speech" sulle novità di PostgreSQL 9.1.</p>

<p>Altri ospiti della comunità internazionale e del team di sviluppo saranno <strong>Simon Riggs</strong>, che presenterà due talk (uno sulle differenze fra PostgreSQL ed database NoSQL, l'altro sul futuro di PostgreSQL) e Andreas Scherbaum, che parlerà di Data warehousing con Postgres.</p>

<p>Un'esperienza importante sull'adozione del software open-source che verrà discussa nella track generale è quella di una pubblica amministrazione italiana importante come <strong>CSI Piemonte</strong>. Altri argomenti interessanti per database administrator saranno <strong>disaster recovery</strong>, <strong>alta disponibilità</strong> (HA), <strong>Serializable Snapshot Isolation Level</strong> (introdotto in 9.1) e infine l'utilizzo di PostgreSQL nel <strong>cloud di Amazon EC2</strong>.</p>

<p>La track per sviluppatori presenta interventi sia su importanti <strong>novità introdotte in Postgres 9.1</strong> (come tabelle esterne, estensioni, CTE scrivibili), che su argomenti di <strong>Business Intelligence</strong> (ETL con Kettle), <strong>sicurezza e protezione delle password</strong>, <strong>memorizzazione di contenuti binari</strong> nel database. Non mancherà un approfondimento sull'utilizzo di Perl e Node.js per l'interrogazione dei database.</p>

<p>Infine, è stata riservata una sessione speciale per i "<strong><a href="http://en.wikipedia.org/wiki/Lightning_Talk">lightning talk</a></strong>", che danno la possibilità a tutti i partecipanti di diventare protagonisti per 5 minuti (tassativi), salendo sul palco e condividendo le proprie esperienze e i propri progetti con Postgres.</p>

<p><strong>Il PGDay 2011 si propone di promuovere e divulgare l'utilizzo di PostgreSQL come strumento libero e completo per la gestione di basi di dati</strong>, una valida alternativa a soluzioni proprietarie per la rimozione del <strong>vendor lock-in</strong> e capace di <strong>ridurre il costo di proprietà totale</strong> (TCO).</p>

<p><a href="http://2011.pgday.it/registrazione">Per partecipare all'evento è necessario registrarsi online</a> direttamente dal sito.</p>
]]>
    </content>
</entry>

<entry>
    <title>PgTAP, l&apos;importanza dei test in PostgreSQL - Parte 2</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/10/pgtap-limportanza-dei-test-in-1.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.178</id>

    <published>2011-10-28T10:47:31Z</published>
    <updated>2011-10-28T14:15:16Z</updated>

    <summary>In questo articolo vedremo un esempio completo di test eseguiti su un semplice set di dati....</summary>
    <author>
        <name>Carlo Ascani</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="pgtap" label="PgTAP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>In questo articolo vedremo un esempio completo di test eseguiti su un semplice set di dati.</p>
]]>
        <![CDATA[<p>Ci sono diversi modi di eseguire i test con PgTAP.
È possibile usare <code>pg_prove</code>, uno script installabile attraverso il <code>CPAN</code>, oppure si può scrivere una funzione <code>plpgsql</code>
che esegua i test.</p>

<p>In questo esempio, useremo una funzione.</p>

<p>Creiamo un file che contenga i test, chiamamolo <code>risultati_test.sql</code>.</p>

<p>Scriviamo la funzione che lancia i test direttamente nel file, con il nostro editr preferito.</p>

<pre><code>CREATE OR REPLACE FUNCTION risultati_test()
    RETURNS SETOF TEXT
AS $$
BEGIN

    -- Controlliamo la presenza degli oggetti:
    -- Tabella foo
    RETURN NEXT tables_are(
        'public',
        ARRAY[ 'foo' ]
    );

    -- Schema nuovo_schema
    RETURN NEXT schemas_are(
        ARRAY['public','nuovo_schema']
    );

    -- Controlla che sia presente la funzione say_hello
    RETURN NEXT can(
        ARRAY['say_hello']
    );

    -- Controlla che la funzione say_hello sia scritta in SQL
    RETURN NEXT function_lang_is(
        'say_hello',
        'sql'
    );

    -- Controlla che la funzione say_hello non generi errori
    RETURN NEXT lives_ok(
        'SELECT say_hello()'
    );

    -- Controlla che la tabella foo contenga esattamente certi valori
    -- provate a cambiare uno dei valori ed osservare come si comporta il test
    RETURN NEXT results_eq(
        'SELECT * FROM foo',
        'VALUES (1),(2),(3),(4),(5)'
    );

END;
$$ LANGUAGE plpgsql;
</code></pre>

<p>Adesso creiamo il file che esegue questa funzione, chiamiamolo <code>test.sql</code></p>

<pre><code>BEGIN;
\i risultati_test.sql
SELECT PLAN(6); -- Necessario!
SELECT risultati_test();
ROLLBACK;
</code></pre>

<ul>
<li><p>La prima riga dà inizio ad una transazione. È consigliato inserire i test in una transazione che esegua un <em>rollback</em> prima di terminare, così da essere sicuri che lo stato del databse venga mantenuto intatto.</p></li>
<li><p>Successivamente, tramite il comando di psql <code>\i</code>, importiamo il file <code>risultati_test.sql</code>, che crea la funzione che lancia i test.</p></li>
<li><p>La riga successiva, <code>SELECT PLAN(6);</code>, serve a specificare il numero di test che intendiamo eseguire (6 in questo caso). È necessaria e controlla che l'esecuzione di un numero di test diverso rispetto a quello specificato, restituisca un fallimento.</p></li>
<li><p>La riga <code>SELECT risultati_test();</code> lancia la funzione che esegue i test.</p></li>
</ul>

<p>Abbiamo finito di scrivere i nostri test, possiamo eseguirli con:</p>

<pre><code>psql -f test.sql pgtap_db</code></pre>

<p>Il risultato dovrebbe essere:</p>

<pre><code>BEGIN
CREATE FUNCTION
 plan
------
 1..6
(1 row)

                     testfunction
------------------------------------------------------
 ok 1 - Schema public should have the correct tables
 ok 2 - There should be the correct schemas
 ok 3 - Schema pg_temp_2 or pg_catalog or public can
 ok 4 - Function say_hello() should be written in sql
 ok 5
 ok 6
(6 rows)

ROLLBACK
</code></pre>

<p>Si spiega da solo, no? :)</p>

<p>In effetti, lo scopo del protocollo TAP è di essere il più comprensibile possibile.
Una serie di <code>ok</code> (in caso di successo) e di <code>not ok</code> (in caso di fallimento) rendono estremamente
facile l'interpretazione dei test.</p>

<p>2ndQuadrant Italia utilizza estensivamente <code>PgTAP</code>, il tempo speso a scrivere i test risulta di vitale importanza per la manutenzione dei nostri progetti.</p>
]]>
    </content>
</entry>

<entry>
    <title>PgTAP, l&apos;importanza dei test in PostgreSQL</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/10/pgtap-limportanza-dei-test-in.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.176</id>

    <published>2011-10-25T10:26:39Z</published>
    <updated>2011-10-28T14:27:23Z</updated>

    <summary>TAP (Test Anything Protocol) è una semplice interfaccia per i test basata su file di testo. TAP nasce col Perl, ma ad oggi ha implementazioni per i più famosi linguaggi di programmazione. PgTAP è l&apos;implementazione di TAP in PostgreSQL....</summary>
    <author>
        <name>Carlo Ascani</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="pgtap" label="PgTAP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>TAP (Test Anything Protocol) è una semplice interfaccia per i test basata su file di testo.
TAP nasce col Perl, ma ad oggi ha implementazioni per i più famosi linguaggi di programmazione.
PgTAP è l'implementazione di TAP in PostgreSQL.</p>
]]>
        <![CDATA[<p>Non mi dilungherò a descrivere il motivo per cui i test sono importanti, specialmente nell'ottica dello <em>sviluppo agile</em>, che 2ndQuadrant adotta con successo.</p>

<p>PgTAP, sfruttando una sintassi <em>estremamente semplice</em>, permette di testare a fondo il proprio database.</p>

<p>Presupponendo che PgTAP sia stato installato correttamente in un database chiamato <code>pgtap_db</code>, procediamo con la creazione di alcuni oggetti sui quali eseguiremo dei test.</p>

<p>Per informazioni circa l'installazione di PgTAP in un determinato database, rimando alla <a href="http://pgtap.org/documentation.html#Installation">documentazione ufficiale</a>.</p>

<pre><code>$ psql -c "CREATE TABLE foo AS SELECT generate_series(1,5) AS x" pgtap_db
SELECT 1
$ psql -c "CREATE SCHEMA nuovo_schema" pgtap_db
CREATE SCHEMA
$ psql -c "CREATE FUNCTION say_hello() RETURNS TEXT LANGUAGE SQL AS $$SELECT 'Hello World'::TEXT$$;" pgtap_db
CREATE FUNCTION
</pre>

<p></code></p>

<h2>Tipi di utilizzo</h2>

<p>PgTAP può essere utilizzato per testare qualsiasi aspetto del database.
In particolare:</p>

<ul>
<li>Presenza di oggetti nel database</li>
<li>Controllo dell'esecuzione di query</li>
<li>Controllo dei risultati di una query</li>
<li>Altro</li>
</ul>

<p>Descriverò in ordine questi aspetti e poi vedremo un esempio pratico.</p>

<h3>Presenza di oggetti nel database</h3>

<p>Si può controllare l'esistenza di qualsiasi tipo di oggetto nel database.
Questo tipo di funzioni ha più o meno la stessa firma, in particolare:</p>

<pre><code>*tipo_di_oggetto*_are( [schema,] <array_di_nomi> [,description] )
</pre>

<p></code></p>

<p>Dove:</p>

<ul>
<li><p><code><em>tipo_di_oggetto</em></code> è la categoria di oggetti di cui vogliamo testare la presenza,
ad esempio tabelle (<strong>tables</strong>), funzioni (<strong>functions</strong>), schemi (<strong>schemas</strong>) ecc.</p></li>
<li><p><code>schema</code> definisce lo schema in cui gli oggetti <em>devono</em> trovarsi, questo parametro ha senso solo se non si
sta testando la presenza dello schema stesso.</p></li>
<li><p><code><em>array_di_nomi</em></code> è un array contenente i nomi degli oggetti che devono essere presenti perchè il test abbia successo</p></li>
</ul>

<p>Importante:
Per avere successo, <em>tutti</em> gli elementi specificati nell'array devono essere presenti. In caso di assenza di almeno uno degli elementi, il test fallirà. </p>

<ul>
<li><code>description</code> è una descrizione del test</li>
</ul>

<p>Nota:
Ovviamente, nel caso di <code>schemas_are</code>, il primo parametro, <code>schema</code>, viene omesso.</p>

<h3>Controllo dell'esecuzione di query</h3>

<p>È possibile testare in modo semplice che una query venga eseguita <em>senza</em> o <em>con</em> errori.
Per farlo sono disponibili le funzioni:</p>

<pre><code>throws_ok( query [, errcode] [, errmsg] [, description] )
lives_ok( query [, description] )
performs_ok( query, milliseconds [, description])
</code>
</pre>

<p>Queste tre funzioni controllano rispettivamente:</p>

<ul>
<li><p>Che la query generi un'eccezione. È possibile specificare l'errore voluto tramite il parametro <code>errcode</code></p></li>
<li><p>Che la query non generi un'eccezione</p></li>
<li><p>Che la query termini entro <code>milliseconds</code> millisecondi</p></li>
</ul>

<h3>Controllo dei risultati di una query</h3>

<p>Spesso si ha bisgno di controllare che una query restituisca <em>esattamente</em> un certo insieme di risultati.
PgTAP ha diverse funzioni per questo scopo, la principale è:</p>

<pre><code>results_eq( sql, array [, description] )
</code></pre>

<p>Molto intuitivamente, questo test passerà se l'insieme di risultati della query sarà <em>esattamente</em> uguale ai valori presenti in <code>array</code>.
Nell'esempio completo presente più in basso, vedremo come sfruttare questa funzione.</p>

<h3>Altro</h3>

<p>Vi sono poi altri tipi di test, ma citiamo qui solo i più importanti. Per una lista completa invitiamo a consultare la <a href="http://pgtap.org/documentation.html">documentazione ufficiale</a>.</p>

<ul>
<li>Per controllare qualsiasi elemento usando un'espressione regolare:</li>
</ul>

<pre><code>matches( anyelement, regex [, description] )
</code></pre>

<ul>
<li>Per controllare che un utente sia un superutente:</li>
</ul>

<pre><code>is_superuser( user [, description] )
</code></pre>

<ul>
<li>Per controllare che una funzione sia scritta in un determinato linguaggio:</li>
</ul>

<pre><code>function_lang_is( [schema,] function [, args[]] , language [, description])
</code></pre>

<ul>
<li>Per stampare messaggi di diagnostica che non interferiscano con i test:</li>
</ul>

<pre><code>diag( text )
</code></pre>

<p>Nel <a href="http://blog.2ndquadrant.it/it/2011/10/pgtap-limportanza-dei-test-in-1.html">prossimo articolo</a> vedremo un esempio pratico, dove eseguiremo dei test su un set di oggetti creati per l'occasione.</p>

<p>A presto!</p>
]]>
    </content>
</entry>

<entry>
    <title>Scansioni &quot;Index-Only&quot; in PostgreSQL 9.2</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/10/scansioni-indexonly-in-postgre.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.175</id>

    <published>2011-10-25T09:06:17Z</published>
    <updated>2011-10-25T10:10:05Z</updated>

    <summary>PostgreSQL 9.2 avrà una novità interessante (tra le altre): il supporto per le scansioni di tipo &quot;Index-only&quot;. Vedremo in breve cosa sono e perchè sono considerate così importanti dagli addetti ai lavori. Link al commit di riferimento: http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a2822fb9337a21f98ac4ce850bb4145acf47ca27...</summary>
    <author>
        <name>Carlo Ascani</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql92" label="PostgreSQL 9.2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>PostgreSQL 9.2 avrà una novità interessante (tra le altre): il supporto per le scansioni di tipo "Index-only".
Vedremo in breve cosa sono e perchè sono considerate così importanti dagli addetti ai lavori.</p>

<p>Link al commit di riferimento: <a href="http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a2822fb9337a21f98ac4ce850bb4145acf47ca27">http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a2822fb9337a21f98ac4ce850bb4145acf47ca27</a></p>
]]>
        <![CDATA[<h2>Cosa sono</h2>

<p>Le scansioni <em>Index-only</em> sono una novità pensata per migliorare le prestazioni di Postgres.
Storicamente ogni miglioramento delle prestazioni viene accolto con entusiasmo dalla comunità (e anche da noi di 2ndQuadrant).</p>

<p>Tramite le scansioni Index-only, una query può essere eseguita sfruttando solo gli Indici, senza andare a interrogare le pagine di memoria su disco dove effettivanente risiede la tabella.</p>

<p>Questo, in determinate circostanze, aumenta notevolmente le prestazioni - dato che vengono risparmiati accessi al disco.</p>

<h3>Ma le scansioni "Index" già presenti in Postgres non usano solo gli indici?</h3>

<p>Effettivamente no, PostgreSQL esegue le Index scan accedendo sia all'indice che alla tabella sulla quale l'indice è definito.</p>

<p>Questo succede a causa dell'MVCC.
Al momento che una tupla viene trovata (tramite ad es. una <em>SELECT</em>) con un Index scan, non è possibile stabilire se quella tupla sia realmente "visibile" a tutte le transazioni attive in quell'istante.</p>

<p>Ad esempio, una trasazione potrebbe aver eseguito un <em>COMMIT</em> che cancellava quella tupla <em>dopo</em> l'inizio della nostra <em>SELECT</em>.</p>

<h2>La "visibility map"</h2>

<p>L'innovazione che ha portato allo sviluppo delle scansioni "Index-only" si chiama <em>visibility map</em>, ed è presente da PostgreSQL 8.4.</p>

<p>La <em>visibility map</em> è una struttura che contiene un bit per ogni pagina di una tabella. Risulta quindi più piccola della pagina stessa, e risiede facilmente in cache.</p>

<p>Ognuno di questi bit indica se tutte le tuple di quella pagina sono visibili a tutte le transazioni correnti e future.</p>

<p>Sfruttando questa informazione, Postgres è in grado di discriminare se è necessario andare a prelevare dati dalla tabella su disco o meno.</p>

<h2>Un esempio pratico</h2>

<p>Creiamo, con <em>psql</em>, una tabella con 3000 record composti da un valore intero e da una stringa:</p>

<pre><code>$ CREATE TABLE indexonlytest AS
SELECT
    x AS intvalue,
    'stringa' || x AS stringvalue,
        repeat( md5('2ndQuadrant'),100 ) AS longstring
FROM generate_series(1,3000) x;
SELECT 3000
</pre>

<p></code></p>

<p>Creiamo un indice sulla tabella che contenga <em>tutti</em> i campi.</p>

<pre><code>$ CREATE INDEX indextest ON indexonlytest ( intvalue,stringvalue );
CREATE INDEX
</pre>

<p></code></p>

<p>Se provo ad eseguire una <em>SELECT</em> sulla tabella, ottengo un <strong>Index Only Scan</strong>:</p>

<pre><code>$ EXPLAIN ANALYZE SELECT intvalue,stringvalue FROM indexonlytest ORDER BY intvalue LIMIT 20;
                                                QUERY PLAN
 Limit  (cost=0.00..2.01 rows=20 width=36) (actual time=0.039..0.064 rows=20 loops=1)
   ->  Index Only Scan using indextest on indexonlytest  (cost=0.00..301.25 rows=3000 width=36) (actual tim
e=0.039..0.062 rows=20 loops=1)
 Total runtime: 0.078 ms
(3 rows)
</pre>

<p></code></p>

<p>Adesso proviamo la stessa cosa senza includere, nell'indice, tutti i campi della tabella.</p>

<pre><code>$ DROP INDEX indextest
DROP INDEX
$ CREATE INDEX indextest ON indexonlytest ( intvalue );
CREATE INDEX
</pre>

<p></code></p>

<p>Eseguiamo la stessa <em>SELECT</em> di prima, osservando come si comporta il "planner":</p>

<pre><code>$ EXPLAIN ANALYZE SELECT intvalue,stringvalue FROM indexonlytest ORDER BY intvalue LIMIT 20;
                                                QUERY PLAN
 Limit  (cost=0.00..0.95 rows=20 width=15) (actual time=0.027..0.033 rows=20 loops=1)
   ->  Index Scan using indextest on indexonlytest  (cost=0.00..142.25 rows=3000 width=15) (actual time=0.0
26..0.029 rows=20 loops=1)
 Total runtime: 0.665 ms
(3 rows)
</pre>

<p></code></p>

<p>Come si nota, in questo caso il <em>planner</em> ha scelto di utilizzare un normale Index Scan.</p>

<h2>Conclusioni</h2>

<p>Ovviamente, le informazioni contenute nell'indice devono essere sufficienti a soddisfare le richieste della query.
In altre parole, l'indice <em>deve</em> contenere tutti i campi presenti nelle clausole <em>SELECT</em>, <em>WHERE</em> e/o <em>ORDER BY</em> della query.</p>

<p>Ciò non significa che si debba sfruttare sempre questa funzionalità, piuttosto cercare un compromesso:
includere tutti i campi di una <em>SELECT</em> in un indice, aumenterà le dimensioni dello stesso, ma permetterà in alcuni casi di utilizzare le scansioni "Index Only".</p>
]]>
    </content>
</entry>

<entry>
    <title>Prorogata la Call for paper per il PGDay 2011</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/10/prorogata-call-for-paper-pgday-2011.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.172</id>

    <published>2011-10-15T14:18:29Z</published>
    <updated>2011-10-15T14:33:36Z</updated>

    <summary>Il comitato organizzatore del PostgreSQL Day italiano 2011 ha deciso di prorogare di un&apos;altra settimana la Call for Paper. La nuova scadenza è domenica 23 ottobre....</summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="pgdayit2011" label="PGDay.IT 2011" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Il comitato organizzatore del PostgreSQL Day italiano 2011 ha deciso di prorogare di un'altra settimana la Call for Paper. La nuova scadenza è domenica 23 ottobre.</p>
]]>
        <![CDATA[<p>Il PostgreSQL Day 2011 si svolgerà a Prato il giorno 25 novembre prossimo, presso il Monash University Prato Centre, sede delle prime edizioni (2007 e 2008).</p>

<p>Abbiamo già diversi talk interessanti inviati da personaggi di calibro internazionale, che ci parleranno delle novità di PostgreSQL 9.1 e del suo futuro.</p>

<p>Tuttavia, si ricorda che sono ben accetti anche casi d'uso su PostgreSQL. Per cui, se avete una vostra esperienza di eccellenza con PostgreSQL, siete pregati di <a href="http://2011.pgday.it/call-papers-cfp">inviare un abstract seguendo le istruzioni presenti sul sito</a>.</p>

<p>Si segnala infine che è ancora aperta la registrazione <em>early bird</em> che vi permetterà di partecipare al PGDay alla cifra di 41 euro + IVA (necessaria per coprire le spese dei coffee break e del pranzo). Al momento in cui verrà pubblicato il programma della manifestazione, la registrazione salirà a 82 euro + IVA.</p>

<p>Ci stiamo infine adoperando per organizzare attività sociali sia il giovedì sera che il venerdì sera, con l'obiettivo di estendere la partecipazione ai visitatori di questa bella area della Toscana fino a tutto il weekend. Vi terremo aggiornati!</p>

<p>Per maggiori informazioni: <a href="http://2011.pgday.it/">www.pgday.it</a></p>
]]>
    </content>
</entry>

<entry>
    <title>Importare dati in Greenplum da più file csv con Talend</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/09/etl-con-talend-su-greenplum.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.164</id>

    <published>2011-09-14T14:05:01Z</published>
    <updated>2011-09-16T08:45:30Z</updated>

    <summary>Lavorando con i database, capita spesso di dover importare i dati direttamente da uno o più file CSV. Esistono molteplici strumenti per farlo e spaziano dal copy di psql, via linea di comando, ai più complessi sistemi di ETL come...</summary>
    <author>
        <name>Giulio Calacoci</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="ETL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Greenplum" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="greenplumetalendopenstudio" label="Greenplum e Talend Open Studio" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Lavorando con i database, capita spesso di dover importare i dati direttamente da uno o più file CSV. Esistono molteplici strumenti per farlo e spaziano dal copy di psql, via linea di comando, ai più complessi sistemi di ETL come Talend o Kettle.
In questo articolo analizzeremo la capacità di Talend di interfacciarsi con un database Greenplum per importare i dati contenuti in 2 file di testo.</p>
]]>
        <![CDATA[<p>Dopo aver scaricato Talend Open Studio (<a href="http://www.talend.com/download_form.php?cont=gen&amp;lang=it&amp;src=ResourcePage">reperibile dal sito di Talend</a>) e dopo averlo installato, possiamo procedere creando un nuovo progetto, e all'interno di questo un nuovo job.</p>

<p>Creiamo quindi le connessioni alle risorse che ci serviranno durante l'importazione, ovvero la connessione al database remoto e i due file csv.</p>

<p>Nella sezione Metadata dell'interfaccia di Talend, aggiungiamo la connessione a Greenplum, dopo aver inserito il nome e i parametri di connessione, il programma creerà un nuovo oggetto di tipo <em>DbConnection</em>.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/connessionedb1.html" onclick="window.open('http://blog.2ndquadrant.it/it/connessionedb1.html','popup','width=600,height=1106,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/assets_c/2011/09/connessionedb-thumb-600x1106.png" width="300"   alt="connessionedb.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Cliccando su questo con il tasto destro e selezionando l'opzione "recupera schema", sarà possibile selezionare le tabelle su cui vogliamo lavorare, nel nostro caso la tabella <em>states</em> e la tabella <em>users</em>.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/recuperoschema1.html" onclick="window.open('http://blog.2ndquadrant.it/it/recuperoschema1.html','popup','width=600,height=1087,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/recuperoschema-thumb-300x543.png" width="300" height="543" alt="recuperoschema.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Aggiungiamo ora i file contenenti i dati.
Subito sotto l'icona delle connessioni ai database (DB connections), troviamo il gruppo dei file CSV, come precedentemente fatto per i database, clicchiamo con il tasto destro sul gruppo e poi su "crea file delimitato". </p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/creacsv1.html" onclick="window.open('http://blog.2ndquadrant.it/it/creacsv1.html','popup','width=600,height=1079,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/creacsv-thumb-300x539.png" width="300" height="539" alt="creacsv.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Nella prima schermata del wizard che si aprirà, ci verrà richiesto di inserire un nome e una descrizione per la risorsa che stiamo creando. 
Si passa quindi allo step due, nel quale dobbiamo identificare il file di testo a cui vogliamo riferirci, e la sua codifica.
Una volta fatto sarà possibile possibile passare al terzo step, nel quale dobbiamo istruire Talend su come gestire le colonne del CSV.
In questa schermata è possibile : selezionare l'encoding del file (1), i separatori di campo e i caratteri di fine linea (2), e qualora fosse necessario, segnalare quante e quali linee devono essere ignorate sia all'inizio che alla fine del file (3). 
È inoltre possibile segnalare a Talend di utilizzare la prima riga come "schema" del CSV, in maniera che possa prendere i nomi delle colonne direttamente dal file, risparmiando all'utilizzatore l'inserimento manuale del nome delle colonne ( 4 ).</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/step3csv.html" onclick="window.open('http://blog.2ndquadrant.it/it/step3csv.html','popup','width=924,height=751,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/step3csv-thumb-600x487.png" width="600" height="487" alt="step3csv.png" class="mt-image-none" style="" /></a></span></p>

<p>Nel quarto step resta solo da: modificare lo schema del file che stiamo associando, controllare e modificare i tipi di dato riconosciuti in automatico per ogni colonna e, qualora non fossero stati riconosciuti in automatico dalla testata del CSV, modificare i nomi delle colonne e la lunghezza dei campi.</p>

<p>Completato il 4° passo del wizard, il file è correttamente associato all'applicazione e pronto per essere usato. </p>

<p>Una volta aggiunte tutte le risorse che intendiamo utilizzare, è possibile procedere con la creazione del job.
Trasciniamo quindi i due file sull'editor visuale del job, e selezioniamo <em>tFileInputDelimited</em> come tipo di file.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/tfin1.html" onclick="window.open('http://blog.2ndquadrant.it/it/tfin1.html','popup','width=363,height=319,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/assets_c/2011/09/tfin-thumb-363x319.png" width="363" height="319" alt="tfin.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Dalla connessione a Greenplum precedentemente creata invece, trasciniamo sull'editor le due tabelle di destinazione (nel nostro caso <em>states</em> e <em>users</em>), e selezioniamo come tipo <em>tGreenplumOutput</em>.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/tgpout1.html" onclick="window.open('http://blog.2ndquadrant.it/it/tgpout1.html','popup','width=360,height=322,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/assets_c/2011/09/tgpout-thumb-360x322.png" width="360" height="322" alt="tgpout.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Inseriamo ora un oggetto di tipo <em>tMap</em> - che si trova nella palette degli strumenti alla destra dell'editor visuale - nella cartella "elaborazione" e posizioniamolo fra il file CSV contenente gli stati da importare e la tabella di Greenplum di destinazione.
Colleghiamo il file al componente <em>tMap</em> (clic con il destro sul file -> riga -> main) e il componente <em>tMap</em> alla tabella di destinazione (clic destro sulla tabella -> riga -> nuovo output).
Una volta collegati fra di loro i componenti possiamo fare doppio click sull'oggetto <em>tMap</em> che permette di associare le righe del file da importare a quelle della tabella di destinazione.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/connecting11.html" onclick="window.open('http://blog.2ndquadrant.it/it/connecting11.html','popup','width=546,height=174,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/assets_c/2011/09/connecting1-thumb-546x174.png" width="546" height="174" alt="connecting1.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Trascinando i vari campi dalla tabella di sinistra a quella di destra , è possibile associare ogni colonna del file alla colonna relativa sulla tabella di destinazione.
Cliccando su ok salveremo l'associazione appena effetuata e i dati sono pronti per essere importati dal file di origine alla tabella di destinazione.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/simplemap.html" onclick="window.open('http://blog.2ndquadrant.it/it/simplemap.html','popup','width=1268,height=491,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/simplemap-thumb-600x232.png" width="600" height="232" alt="simplemap.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Aggiungiamo ora l'importazione di una lista di utenti dal secondo csv, durante l'importazione è necessario fare <em>lookup</em> sulla tabella degli stati appena riempita, in maniera da verificare l'associazione "utente -> stato", riga per riga.
Con il gergo lookup si intende la ricerca di un valore all'interno di un dizionario, utilizzando una chiave al fine di recuperare un ID (solitamente la chiave primaria di quell'oggetto nel database, per garantire integrità referenziale).</p>

<p>Aggiungiamo quindi un oggetto <em>tMap</em> fra il file CSV con gli utenti e la tabella di destinazione, inoltre dalla lista delle tabelle di Greenplum trasciniamo nuovamente la tabella contenente gli stati sulla finestra dell'editor visuale, selezionando come tipo <em>tGreenplumInput</em>. </p>

<p>Colleghiamo quindi i tre elementi al componente <em>tMap</em>, come e' stato fatto precedentemente.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/schemalookup1.html" onclick="window.open('http://blog.2ndquadrant.it/it/schemalookup1.html','popup','width=551,height=356,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/assets_c/2011/09/schemalookup-thumb-551x356.png" width="551" height="356" alt="schemalookup.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Adesso eseguiamo il mapping fra i tre elementi: questa volta il campo  <em>idState</em> del CSV deve essere mappato sul campo <em>idState</em> della tabella <em>states</em> (row3) e quest'ultimo deve essere collegato alla tabella utenti di destinazione. In questa maniera per ogni linea del CSV viene eseguito il lookup sulla tabella stati, assicurando così l'integrità della relazione "Utente - Stato".</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/maplookup.html" onclick="window.open('http://blog.2ndquadrant.it/it/maplookup.html','popup','width=1272,height=519,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/maplookup-thumb-600x244.png" width="600" height="244" alt="maplookup.PNG" class="mt-image-none" style="" /></a></span></p>

<p>Per concludere, facciamo in modo che prima venga eseguita l'importazione dei dati relativi agli stati. Successivamente, quelli degli utenti, in modo da poter eseguire correttamente il lookup.
Tracciamo quindi una riga di tipo <em>OnComponentOK</em> (click destro -> attivare -> onComponentOk) dal componente di output della tabella stati a quello di input degli utenti (il file CSV).</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/schemafinito.html" onclick="window.open('http://blog.2ndquadrant.it/it/schemafinito.html','popup','width=1203,height=422,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.2ndquadrant.it/it/schemafinito-thumb-600x210.png" width="600" height="210" alt="schemafinito.PNG" class="mt-image-none" style="" /></a></span></p>

<p>In questo modo prima verrano importati gli stati e solo in caso di successo verranno impotati gli utenti.</p>

<p>Adesso basterà cercare il tab di esecuzione nella parte bassa dell'area di lavoro e premere il tasto run per fare in modo che il nostro job venga eseguito.</p>
]]>
    </content>
</entry>

<entry>
    <title>Rilasciato PostgreSQL 9.1</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/09/rilasciato-postgresql-91.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.162</id>

    <published>2011-09-12T13:26:00Z</published>
    <updated>2011-09-12T13:36:07Z</updated>

    <summary>Il PostgreSQL Global Development Group annuncia il rilascio di PostgreSQL 9.1. Quest&apos;ultima versione del leader dei database open source offre tecnologie innovative, estensibilità senza paragoni e nuove funzionalità come replica sincrona, estensioni, tabelle esterne (&quot;foreign data wrapper&quot;), indici &quot;K-Nearest Neighbor&quot;....</summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql91" label="PostgreSQL 9.1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Il PostgreSQL Global Development Group annuncia il rilascio di PostgreSQL 9.1. Quest'ultima versione del leader dei database open source offre tecnologie innovative, estensibilità senza paragoni e nuove funzionalità come replica sincrona, estensioni, tabelle esterne (<em>"foreign data wrapper"</em>), indici <em>"K-Nearest Neighbor"</em>.  
</p>

<p>Nei mesi scorsi, 2ndQuadrant aveva pubblicato una serie di articoli su alcune delle novità di PostgreSQL 9.1, fra cui <a href="http://blog.2ndquadrant.it/it/2011/06/postgresql-91-tabelle-unlogged.html">tabelle unlogged</a>, <a href="http://blog.2ndquadrant.it/it/2011/06/postgresql-91-tabelle-esterne.html">tabelle esterne</a> ed <a href="http://blog.2ndquadrant.it/it/2011/04/postgresql-9-1-le-estensioni.html">estensioni</a>.</p>
]]>
        <![CDATA[<p>
<em>"PostgreSQL 9.1 fornisce alcune delle più avanzate funzionalità a disposizione di tutti i database open source ed è sostenuto da una comunità attiva e innovativa, con dimostrata esperienza di successo in ambito aziendale. PostgreSQL è inoltre ben posizionato per costruire ed eseguire applicazioni nel cloud"</em>, afferma Charles Fan (Vice presidente, Dipartimento di Ricerca e sviluppo, VMware).
</p><p>
<h2>Risponde a importanti richieste degli utenti</h2>
<p>
La versione 9.1 introduce molte funzionalità che per anni sono state richieste dagli utenti, rimuovendo diverse barriere nell'adozione di nuove applicazioni o nella migrazione a PostgreSQL. Fra le altre, sono degne di nota:
</p><ul>
<li><strong>replica sincrona</strong>: sicurezza e consistenza dei dati (perdita zero) all'interno di un cluster in alta disponibilità di server PostgreSQL;</li>
<li><strong>collation a livello di colonna</strong>: definizione delle regole di ordinamento delle stringhe a livello di database, tabella o colonna;</li>
<li><strong>tabelle "unlogged"</strong>: miglioramenti prestazionali per dati volatili (i.e. caching o sessioni web).</li>
</ul><p>
<em>"Heroku offre il più grande servizio cloud per PostgreSQL del mondo come 'database-as-a-service'"</em>, svela James Lindenbaum, co-fondatore di Heroku. <em>"Il rilascio della replica sincrona dei dati nella 9.1 fornisce ai nostri clienti modalità innovative per la protezione di dati mission-critical. Consacra inoltre PostgreSQL come una delle soluzioni di memorizzazione dati più dinamiche al momento disponibili"</em>.
</p>

<h2>Avanza lo stato dell'arte</h2>

<p>
La nostra comunità di sviluppatori è in grado di innovare con funzionalità all'avanguardia. La versione 9.1 ne comprende diverse che rappresentano vere e proprie novità nell'industria dei database anche non open source, come:
</p><ul>
<li><strong>indicizzazione "K-Nearest-Neighbor"</strong>: indici basati sul concetto di distanza, che permettono interrogazioni più veloci nel campo delle ricerche testuali e geografiche;</li>
<li><strong>"Serializable Snapshot Isolation"</strong>: garanzia di consistenza fra transazioni concorrenti senza necessariamente doverle bloccare, mettendo in pratica il concetto di "true serializability";</li>
<li><strong>"Writeable Common Table Expression"</strong>: esecuzione di complessi aggiornamenti ai dati su più passi, utilizzando una singola query;</li>
<li><strong>"Security-Enhanced Postgres"</strong>: implementa la sicurezza di livello militare e il controllo d'accesso vincolato ("Mandatory Access Control").</li>
</ul><p>
<em>"OpenERP si è sempre avvalso delle funzionalità di classe enterprise di PostgreSQL per dotare di una base veloce, affidabile e scalabile le applicazioni che aiutano a gestire le operazioni quotidiane delle aziende nostre clienti. L'integrità dei dati in contesti altamente concorrenti e transazionali è un argomento di importanza critica per noi, e siamo veramente entusiasti della funzionalità 'Serializable Snapshot Isolation' introdotta in PostgreSQL 9.1!"</em>, aggiunge Olivier Dony, Community Manager di OpenERP.
</p>

<h2>Estende il motore del database</h2>

<p>
L'estensibilità di PostgreSQL consente agli utenti di aggiungere nuove funzionalità ad un database già in produzione e di sfruttarlo per compiti che nessun altro sistema di gestione di database è in grado di fare. La versione 9.1 aggiunge nuovi strumenti per l'estensibilità, fra cui:
</p><ul>
<li><strong>tabelle esterne tramite "Foreign Data Wrapper"</strong>: permette di collegare e interrogare altri database direttamente da PostgreSQL;</li>
<li><strong>estensioni</strong>: rende più facile creare, caricare e gestire nuove funzionalità del database.</li>
</ul>
<p>
Tutte le funzionalità descritte sopra e molte altre sono descritte in dettaglio sia nella pagina del wiki di PostgreSQL intitolata "<a href="http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.1">What's New In 9.1</a>" che nelle <a href="http://www.postgresql.org/documentation/current/static/release-9-1">note di rilascio</a>.
</p><p>
Nel 25° anniversario dello sviluppo del database PostgreSQL, la nostra comunità continua a migliorare la tecnologia dei database ad ogni rilascio annuale. Scarica subito la versione 9.1 e prova il più avanzato sistema di database open source al mondo.
</p><p>
<strong>Su PostgreSQL</strong>: PostgreSQL è il leader dei sistemi di gestione di database open source, con una comunità internazionale costituita da migliaia di utenti e sviluppatori nonché decine di aziende ed enti provenienti da tutte le parti del mondo. Il progetto PostgreSQL vanta 25 anni di attività di ingegneria del software, cominciata all'Università di California a Berkeley e oggi può vantare un ritmo di sviluppo senza uguali. La gamma di funzionalità mature messe a disposizione da PostgreSQL non soltanto è in grado di competere con quelle offerte da sistemi di database proprietari, ma le migliora in termini  di funzionalità avanzate, estensibilità, sicurezza e stabilità. Scopri maggiori informazioni su PostgreSQL e partecipa attivamente alla nostra comunità su <a href="http://www.postgresql.org/">http://www.postgresql.org</a> e, per l'Italia, <a href="http://www.itpug.org/">http://www.itpug.org</a>.
</p>

<p>Per maggiori informazioni in italiano sul rilascio: <a href="http://www.postgresql.org/about/press/presskit91">Press Kit di PostgreSQL 9.1</a></p>
]]>
    </content>
</entry>

<entry>
    <title>Come utilizzare la Virtual Machine di Greenplum Community Edition con VirtualBox</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/08/greenplum-vmware-virtualbox.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.158</id>

    <published>2011-08-26T15:30:03Z</published>
    <updated>2011-08-27T08:44:40Z</updated>

    <summary>Fra i vari download disponibili nella sezione community del sito di Greenplum, è possibile trovare una Virtual Machine con il software già configurato e installato su un sistema CentOs. La virtual machine è fatta per funzionare con VmWare, ma con...</summary>
    <author>
        <name>Giulio Calacoci</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="Greenplum" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="greenplumcommunityeditionsuvirtualbox" label="Greenplum Community Edition su VirtualBox" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Fra i vari download disponibili nella sezione community del sito di Greenplum, è possibile trovare una Virtual Machine con il software già configurato e installato su un sistema CentOs.</p>

<p>La virtual machine è fatta per funzionare con VmWare, ma con qualche piccola attenzione e per puri scopi di valutazione di Greenplum, è possibile farla funzionare anche con VirtualBox.</p>
]]>
        <![CDATA[<p>Dopo aver installato l'ultima versione di VirtualBox (disponibile su <a href="http://www.virtualbox.org/wiki/Downloads">http://www.virtualbox.org/wiki/Downloads</a> ) è possibile scaricare l'immagine di VmWare da <a href="http://www.greenplum.com/community/downloads/">http://www.greenplum.com/community/downloads/</a>. Una volta ultimato il download, e dopo aver scompattato l'archivio, è possibile procedere con l'installazione.</p>

<p>Innanzitutto creiamo una nuova virtual machine, semplicemente cliccando sul tasto "Nuovo" in alto a sinistra nella finestra di VirtualBox; avremo così accesso al wizard di creazione virtual machine.
Dopo la prima schermata introduttiva, nella seconda ci troveremo a scegliere il nome della macchina, che deve essere univoco, e il tipo di sistema operativo.
Nel primo dropdown deve essere selezionato "Linux", mentre come versione va scelta Red Hat a 64 bit, essendo la VM basata su CentOs.
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Schermata1.PNG" src="http://blog.2ndquadrant.it/it/Schermata%202011-08-26%20a%2009.55.21.PNG" width="600" class="mt-image-none" style="" /></span></p>

<p>Nel terzo step del wizard viene chiesta quanta RAM deve essere allocata alla virtual machine. Di default il programma ne assegna 512 MB, ma per il tipo di ambiente che sta per essere eseguito potrebbero essere pochi. Consiglio quindi di aumentare a 1024 MB la RAM da allocare.
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Schermata2" src="http://blog.2ndquadrant.it/it/Schermata%202011-08-26%20a%2009.45.40.PNG" width="600"  class="mt-image-none" style="" /></span></p>

<p>Nella quarta schermata deve essere deselezionato il flag "disco di avvio". Una volta cliccato su continua, VirtualBox ci avvertirà che, continuando senza disco, non potremo fare il boot della macchina. 
Il disco di boot verrà aggiunto manualmente in seguito: selezionare pertanto "continua".
Nell'ultima schermata bisogna semplicemente cliccare su "continua" per completare la creazione della VM.
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.2ndquadrant.it/it/Schermata%202011-08-26%20a%2017.37.47.PNG"><img alt="Schermata 2011-08-26 a 17.37.47.PNG" src="http://blog.2ndquadrant.it/it/Schermata 2011-08-26 a 17.37.47-thumb-600x359.png" width="600" height="359" class="mt-image-none" style="" /></a></span></p>

<p>E' il momento di aggiungere il disco di avvio alla VM appena creata: entrare nelle impostazioni relative alla virtual machine e andare nella sezione "archiviazione".
Nell'albero dei controller deve essere selezionata la voce "controller ide" , cliccando sull'immagine del disco con il "+" verde in basso a sinistra, comparirà l'opzione "aggiungi disco fisso. Alla domanda successiva, relativa alla creazione di un disco vuoto, deve essere selezionata la voce "scegli disco esistente". 
E' possibile ora navigare fino alla posizione dove è stata scompattata l'immagine della virtual machine, e selezionare il primo della serie di files che compongo l'immagine, in questo caso il file si chiama "CentOS 64-bit-cl1.vmdk", riconoscibile come primo della serie per l'assenza di numeri sequenziali nel nome.</p>

<p>Dopo aver aggiunto il disco la virtual machine è pronta per essere avviata.
Completata la fase di boot, il sistema proverà a far partire l'ambiente grafico, ma, essendo il sistema configurato per funzionare con VmWare, i driver attualmente installati non possono funzionare con la scheda video virtuale di VirtualBox. Verrà quindi mostrata una schermata blu di errore che chiederà se devono essere visualizzati i log. Dopo aver risposto "No", verrà mostrata un'ulteriore schermata per l'autoconfigurazione di GDM. Anche in questo caso non è quello che serve, quindi la risposta da dare è nuovamente "No".</p>

<p>Si viene quindi condotti a una schermata di login su shell; per accedere 
l' username è <code>root</code>, la password è <code>password</code>.</p>

<p>Essendo ora amministratori della macchina è possibile lanciare lo script che disinstallerà i driver specifici di VMWare: <code>vmware-uninstall-tools.pl</code>.</p>

<p>lo script eseguirà la disinstallazione completa dei driver. Una volta terminata, è necessario riavviare il sistema. 
Subito dopo il riavvio ci troveremo nuovamente di fronte alle domande relative al log e all'autoconfigurazione di GDM. Rifiutando come prima, sarà possibile effettuare nuovamente login da shell come root.</p>

<p>E' ora possibile installare i driver di VirtualBox. Per farlo è necessario andare nel menù "dispositivi" di VirtualBox, e selezionare l'opzione "installa guest additions". A questo punto tornando sulla shell è possibile lanciare il comando:</p>

<pre><code>mount /dev/cdrom /media</code></pre>

<p>Andiamo adesso nella directory media:</p>

<pre><code>cd /media</code></pre>

<p>e eseguiamo lo script di installazione dei driver di VirtualBox:</p>

<pre><code>bash VboxLinuxAdditions.run</code></pre>

<p>Purtroppo a  causa del kernel troppo vecchio di questa macchina virtuale, non sarà possibile avere l'accelerazione grafica, ma adesso il sistema è pronto per funzionare.</p>

<p>Dopo un ultimo riavvio, il sistema sarà correttamente funzionante anche su VirtualBox, e potrete pertanto avviare i primi passi con Greenplum direttamente da questo sistema.</p>

<p>Ricordiamo che il presente articolo deve essere considerato solamente per scopi di valutazione delle funzionalità di Greenplum Community Edition. Per ottenere performance maggiori, si consiglia di installare Greenplum Community Edition su sistemi non virtuali.</p>

<p>Buon divertimento!</p>
]]>
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.1 RC 1 è adesso disponibile</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/08/postgresql-91-rc-1.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.157</id>

    <published>2011-08-23T13:31:01Z</published>
    <updated>2011-08-23T13:42:11Z</updated>

    <summary>La prima release candidate di PostgreSQL 9.1 è adesso disponibile. Tutti gli utenti sono pregati di aiutare il progetto scaricando, installando e provando questa versione, in modo da accelerare il rilascio della versione 9.1....</summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql91rc1" label="PostgreSQL 9.1 RC 1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>La <strong>prima <em>release candidate</em> di PostgreSQL 9.1 è adesso disponibile</strong>. Tutti gli utenti sono pregati di aiutare il progetto scaricando, installando e provando questa versione, in modo da accelerare il rilascio della versione 9.1.</p>
]]>
        <![CDATA[<p>La nuova versione introduce funzionalità come <strong>replica sincrona</strong>, <strong>writeable common table expression</strong>, <strong>collation a livello di colonna</strong>, <strong>serializable snapshot isolation</strong> e molte altre ancora.</p>

<p>La versione RC 1 contiene correzioni per tutti i principali bug riscontrati nelle varie versioni beta di PostgreSQL 9.1. Al fine di prevenire malfunzionamenti nella prossima release di produzione di PostgreSQL 9.1, è fondamentale che tutti gli utenti testino questa versione e controllino la risoluzione dei bug conosciuti.</p>

<p><p>Il codice sorgente, insieme a <em>installer</em> binari per diverse piattaforme, sono a disposizione dal sito di PostgreSQL:</p>

<ul><li><a href="http://www.postgresql.org/download/">Download</a></li>
<li><a href="http://www.postgresql.org/docs/9.1/static/release-9-1.html">Release Note</a></li>
<li><a href="http://www.postgresql.org/developer/beta">Partecipare alla fase di test</a></li>
<li><a href="http://www.postgresql.org/docs/9.1/static/index.html">Documentazione beta</a></li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.1: Tabelle esterne con SQL/MED </title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/06/postgresql-91-tabelle-esterne.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.150</id>

    <published>2011-06-13T10:13:14Z</published>
    <updated>2011-06-13T19:28:17Z</updated>

    <summary>SQL/MED rappresenta la parte dello standard SQL dedicata alla gestione dei dati esterni (Management of External Data). Anche se SQL/MED è disponibile già a partire da PostgreSQL 8.4, nella versione 9.1 è stata introdotta la possibilità di definire tabelle speciali,...</summary>
    <author>
        <name>Carlo Ascani</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="Amministrazione" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql91" label="PostgreSQL 9.1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>SQL/MED rappresenta la parte dello standard SQL dedicata alla gestione dei dati esterni (<em>Management of External Data</em>). Anche se SQL/MED è disponibile già a partire da PostgreSQL 8.4, nella versione 9.1 è stata introdotta la possibilità di definire tabelle speciali, dette "<em>foreign</em>", per accedere a dati esterni al database tramite semplici <code>SELECT</code>.</p>

<p>Questo articolo mostra la procedura da seguire per creare una tabella esterna contenente dati ricavati da un file CSV locale e sfrutta un'altra caratteristica introdotta in PostgreSQL 9.1: le estensioni.</p>
]]>
        <![CDATA[<p>Prima di tutto, è necessario installare una estensione chiamata <strong>file_fdw</strong> distribuita nei moduli <em>contrib</em> di PostgreSQL 9.1. </p>

<p>Per installare i moduli contrib di PostgreSQL 9.1 dai sorgenti è sufficiente compilarli con <code>gmake world</code> e installarli con <code>gmake install-world</code>, oppure entrare nella directory <code>contrib</code> degli stessi sorgenti e digitare <code>gmake install</code>.</p>

<p>Una volta installati i moduli contrib, le estensioni si troveranno in <code>${postgresql_prefix}/share/extension</code>. Controllate che esistano i file <code>file_fdw.control</code> e <code>file_fdw--1.0.sql</code>, che definiscono l'estensione (si rimanda all'<a href="http://blog.2ndquadrant.it/it/2011/04/postgresql-9-1-le-estensioni.html">articolo sulle estensioni</a>  per maggiori informazioni).</p>

<p>Creare l'estensione con:</p>

<pre><code>CREATE EXTENSION file_fdw;</code></pre>

<p>Il comando psql per mostrare le estensioni è <code>\dx</code>, che possiede anche la variante <code>\dx+</code>, che mostra maggiori dettagli:</p>

<pre><code>test_db=# \dx+ file_fdw
     Objects in extension "file_fdw"
           Object Description            
-----------------------------------------
 foreign-data wrapper file_fdw
 function file_fdw_handler()
 function file_fdw_validator(text[],oid)
(3 rows)
</code></pre>

<p>Si noti che questa estensione crea automaticamente un oggetto di tipo <strong>FOREIGN DATA WRAPPER</strong> di nome <em>file_fdw</em>, che tornerà utile in seguito.</p>

<p>Dato che SQL/MED può gestire la copia dei dati anche attraverso database remoti, è necessario creare un server usando l'oggetto file_fdw (questo passo è necessario anche nel caso si stiano caricando dati da un file locale, come in questo esempio):</p>

<pre><code>CREATE SERVER file FOREIGN DATA WRAPPER file_fdw ;
</code></pre>

<p>A questo punto, è possibile creare la tabella esterna caricando i dati, con:</p>

<pre><code>CREATE FOREIGN TABLE statistical_data (field1 numeric, field2 numeric)
   SERVER file
   OPTIONS (filename '/tmp/statistical_data.csv', format 'csv', delimiter ';') ;
</code></pre>

<p>Attualmente, è possibile eseguire solo query di sola lettura tramite <code>SELECT</code> sulle tabelle foreign. Le tabelle <em>foreign</em> inoltre, funzionano anche attraverso dblink, il tool che permette la comunicazione tra database remoti.</p>

<p>Concludendo, questa caratteristica va a completare una piccola lacuna che Postgres aveva rispetto ad altri database. Va pertanto accolta con grande interesse data la sua utilità, specialmente nel settore del data warehousing, in particolare dell'estrazione e del caricamento dati (ETL), e in più in generale per l'integrazione del database con altri sistemi e altre fonti di dati.</p>

<p>Per maggiori informazioni si rimanda alla <a href="http://www.postgresql.org/docs/9.1/static/sql-createforeigntable.html">documentazione di PostgreSQL sul comando <code>CREATE FOREIGN TABLE</code></a>.</p>
]]>
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.1: le tabelle &quot;Unlogged&quot;</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/06/postgresql-91-tabelle-unlogged.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.146</id>

    <published>2011-06-06T08:00:10Z</published>
    <updated>2011-06-06T14:18:19Z</updated>

    <summary>Una delle novità introdotte in Postgres 9.1 è rappresentata dalle tabelle &quot;unlogged&quot;. Queste tabelle non producono file WAL, cioè quei file che contengono i log delle operazioni di scrittura sulle tabelle....</summary>
    <author>
        <name>Carlo Ascani</name>
        <uri>http://www.2ndQuadrant.it/</uri>
    </author>
    
        <category term="Amministrazione" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql91" label="PostgreSQL 9.1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Una delle novità introdotte in Postgres 9.1 è rappresentata dalle tabelle "unlogged".
Queste tabelle non producono file WAL, cioè quei file che contengono i log delle operazioni di scrittura sulle tabelle.</p>
]]>
        <![CDATA[<p>Eliminando del tutto la scrittura dei file WAL e di conseguenza l'operazione di <code>fsync()</code> al momento del COMMIT della transazione, aumenta considerevolmente la velocità di scrittura su queste particolari tabelle:</p>

<pre><code>
postgres=# CREATE TABLE tabella-normale AS SELECT generate_series( 1,1000000 );
SELECT 1000000
Time: 7626.138 ms
postgres=# CREATE UNLOGGED TABLE tabella-unlogged AS SELECT generate_series( 1,1000000 );
SELECT 1000000
Time: 503.786 ms
</code></pre>

<p>D'altra parte, l'assenza di file WAL relativi alle operazioni sulla tabella fa sì che il contenuto delle tabelle unlogged <strong>non</strong> venga mantenuto dopo un riavvio del server causato da un crash (potete divertirvi a provare questo comportamento usando il comando kill sul processo server - preferibilmente non in produzione).</p>

<p>Inoltre, se si usa un sistema di replica come warm standby o hot standby, il contenuto delle tabelle unlogged <strong>non</strong> viene replicato sui vari <em>slave</em>.</p>

<p>Concludendo, questa nuova funzionalità introduce vantaggi per la memorizzazione di dati facilmente generabili e non durabili.
Un caso d'uso comune potrebbe essere il <strong>caching</strong>, dove la velocità di scrittura è fondamentale e allo stesso tempo non ci si deve preoccupare della persistenza dei dati dopo un crash del server.</p>

<p>Per maggiori informazioni: <a href="http://www.postgresql.org/docs/9.1/static/sql-createtable.html">http://www.postgresql.org/docs/9.1/static/sql-createtable.html</a>.</p>

<p>ll presente articolo è ispirato dal <a href="http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.1">Wiki sulle novità della release 9.1</a> redatto dalla comunità PostgreSQL.</p>
]]>
    </content>
</entry>

<entry>
    <title>EuroPython 2011: PostgreSQL e Python</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/06/europython-2011-postgresql-e-p.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.143</id>

    <published>2011-06-02T17:12:24Z</published>
    <updated>2011-06-02T17:18:35Z</updated>

    <summary>Nel corso di EuroPython 2011, il principale evento annuale per gli sviluppatori e utenti Python in Europa, 2ndQuadrant terrà una sessione speciale di formazione intitolata &quot;The Python and the Elephant&quot;. Questo workshop di 4 ore si svolgerà giovedì 23 giugno...</summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="europython2011" label="EuroPython 2011" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Nel corso di EuroPython 2011, il principale evento annuale per gli sviluppatori e utenti Python in Europa, 2ndQuadrant terrà una sessione speciale di formazione intitolata "<strong><a href="http://ep2011.europython.eu/conference/talks/python-and-elephant">The Python and the Elephant</a></strong>".
Questo workshop di 4 ore si svolgerà giovedì 23 giugno e coprirà le due principali tecniche di scrittura di applicazioni in Python con PostgreSQL: applicazioni client di tipo standard utilizzando PsycoPG oppure estensioni interne utilizzando il linguaggio PL/Python per le stored procedure.</p>
]]>
        <![CDATA[<p>Il costo per la partecipazione al workshop è di 100 euro a persona. Il numero di posti è limitato e la partecipazione è riservata ai soli possessori di biglietti EuroPython. La registrazione è disponibile dal sito di EuroPython.</p>

<p>"The Python and the Elephant" sarà tenuto da un team di esperti PostgreSQL di 2ndQuadrant composto da Gabriele Bartolini, Peter Geoghegan, Harald Armin Massa e Marco Nenciarini.</p>

<p>2ndQuadrant è uno sponsor di Platino di PostgreSQL e costituisce il più vasto gruppo di "contributor" al progetto PostgreSQL. 2ndQuadrant infatti sviluppa e manutiene sia funzionalità del nucleo di PostgreSQL in materia di alta disponibilità (HA) e performance, che progetti satellite.</p>

<p>2ndQuadrant è uno sponsor di EuroPython 2011, che si svolgerà a Firenze dal 20 al 26 giugno prossimi.</p>

<p>Per maggiori informazioni:</p>

<ul>
<li>Sito di EuroPython: <a href="http://ep2011.europython.eu">http://ep2011.europython.eu/</a></li>
<li>Sito di 2ndQuadrant: <a href="http://www.2ndQuadrant.it/">http://www.2ndQuadrant.it/</a></li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>Brain Jumble</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/05/brain-jumble.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.141</id>

    <published>2011-05-16T08:47:16Z</published>
    <updated>2011-05-18T12:13:06Z</updated>

    <summary>Da Giovedì 19 a sabato 21 maggio, a Settala (Milano) si terrà l&apos;evento Brain Jumble organizzato dal Comune di Settala e dal Linux User Group di Vignate (VigLug). Giovedì 19 maggio alle ore 15.40 l&apos;Associazione Italian PostgreSQL Users Group terrà...</summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql90" label="PostgreSQL 9.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        <![CDATA[<p>Da Giovedì 19 a sabato 21 maggio, a Settala (Milano) si terrà l'evento <strong>Brain Jumble</strong> organizzato dal Comune di Settala e dal Linux User Group di Vignate (VigLug).
Giovedì 19 maggio alle ore 15.40 l'Associazione Italian PostgreSQL Users Group terrà un intervento su "<strong>PostgreSQL 9, il database open-source più avanzato al mondo</strong>", volto a illustrare le potenzialità di PostgreSQL e il suo utilizzo anche in ambienti business critical.
Per maggiori informazioni sull'evento Brain Jumble si rimanda al sito http://viglug.org/2011/02/03/brain-jumble-a-settala/</p>
]]>
        

    </content>
</entry>

<entry>
    <title>PostgreSQL 9.1 Beta 1 è adesso disponibile</title>
    <link rel="alternate" type="text/html" href="http://blog.2ndquadrant.it/it/2011/05/postgresql-91-beta-1.html" />
    <id>tag:blog.2ndquadrant.it,2011:/it//2.137</id>

    <published>2011-05-05T07:23:57Z</published>
    <updated>2011-08-23T13:41:18Z</updated>

    <summary></summary>
    <author>
        <name>Gabriele Bartolini</name>
        <uri>http://www.2ndquadrant.it/chi-siamo/#bartolini</uri>
    </author>
    
        <category term="Comunità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Novità" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql91beta1" label="PostgreSQL 9.1 beta 1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="it" xml:base="http://blog.2ndquadrant.it/it/">
        

        <![CDATA[<p>Un elevato numero di nuove funzionalità come mai si era visto in precedenza
è stato introdotto in PostgreSQL 9.1. Alcune di queste sono <strong>vere e proprie innovazioni che nessun altro DBMS (commerciale e non) può vantare</strong>. Fra le principali e più attese novità di questa versione ci sono:</p>

<ul>
    <li><strong>Replica sincrona</strong></li>
    <li>Collation a livello di colonna per database multi-lingua</li>
    <li>Unlogged Table</li>
    <li>Indicizzazione K-Nearest-Neighbor</li>
    <li>Serializable Snapshot Isolation</li>
    <li>Common Table Expression (Query WITH) scrivibili</li>
    <li>Integrazione con SE-Linux</li>
    <li><a href="http://blog.2ndquadrant.it/it/2011/04/extension.html" title="Articolo di 2ndQuadrant Italia su estensioni">Estensioni</a></li>
    <li>Tabelle esterne tramite SQL/MED</li>
</ul>

<p>Il progetto PostgreSQL è nelle mani di tutti gli utilizzatori che sono in grado di provare 9.1beta1, in modo da
ottenere un rapido feedback e rilasciare una versione 9.1 stabile che sia libera da bug.
Se sei in grado di aiutare nella fase di <strong>beta testing</strong>, sei pregato di visitare la <a href="http://wiki.postgresql.org/wiki/HowToBetaTest">pagina con le istruzioni sul Beta testing di PostreSQL</a>.</p>

<p>Le versioni beta non sono stabili per natura e non dovrebbero mai essere utilizzate in ambienti di produzione; sono esclusivamente ad uso di test. Ad ogni modo, essendo <strong>la lista di funzionalità e le API stabili</strong>, gli sviluppatori di applicazioni possono già cominciare a sviluppare applicazioni per PostgreSQL 9.1. Altre versioni beta oppure una versione di tipo "release candidate" saranno disponibili fra alcune settimane.</p>

<p><p>Il codice sorgente, insieme a <em>installer</em> binari per diverse piattaforme, sono a disposizione dal sito di PostgreSQL:</p>

<ul><li><a href="http://www.postgresql.org/download/">Download</a></li>
<li><a href="http://www.postgresql.org/docs/9.1/static/release-9-1.html">Release Note</a></li>
<li><a href="http://www.postgresql.org/developer/beta">Partecipare alla fase di test</a></li>
<li><a href="http://www.postgresql.org/docs/9.1/static/index.html">Documentazione 9.1</a></li>
</ul>
]]>
    </content>
</entry>

</feed>
