1. Bli kjent med
Bergen Linux User Group, 24. februar 2005
Oddbjørn Steffensen, IT Drift
2. Bakgrunn for presentasjonen
Dette er ikke...
en introduksjon til relasjonsdatabaser eller SQL
en uttømmende tutorial rundt PostgreSQL, mer en appetittvekker
PostgreSQL vs. mySQL vs. Oracle vs. ...
Jeg er...
ingen PostgreSQL-ekspert
ingen (god) DBA
ganske patetisk mhp. SQL
Presenterer som en fornøyd bruker
samme ”wow”-følelsen som da jeg konverterte
til FreeBSD i 1996 etter 3-4 år med Linux-bruk...
Hvorfor nå? Versjon 8.0 er akkurat lansert!
3. Agenda
1. Bakgrunn 3+6 slides
2. Praktisk bruk av PostgreSQL 22 slides
3. Egenskaper 24 slides
4. PostgreSQL bak kulissene 22 slides
5. Replikeringsløsninger 4 slides
6. Bruk av PostgreSQL fra ulike språk 15 slides
7. Tredjepartsverktøy 6 slides
8. Hvordan komme i gang! 11 + 3 slides
~45 minutter
10 minutter pause
~45 minutter
nn minutter med spørsmål og muligens svar
5. Hva er PostgreSQL?
PostgreSQL er en:
avansert
fritt tilgjengelig open source
relasjonsdatabaseserver
Støtter mye av SQL-standarden + avanserte egenskaper:
Komplekse spørringer (bla. subselects)
Fremmednøkler
Triggere
Views
Transaksjonsintegritet (ACID)
Multiversion concurrency control (MVCC)
BSD-lisens (”gjør hva du vil, men ikke skyld på oss”)
6. Bakgrunn for PostgreSQL
Fra INGRES til POSTGRES: 1977-1994
Michael Stonebraker, professor ved UC @ Berkeley fra 1971
Utviklet INGRES fra 1977
Proof-of-concept databasemotor for relasjonsdatabaser
Michael Stonebraker
Selskapet Ingres etbl. i 1980 for å kommersialisere forskningen
Oppkjøpt av CA i 1994, som opensourcet CA Ingres høsten 2004
Jobbet videre med POSTGRES fra 1986
En videreføring av INGRES med fokus på objektorientering / Quel
Kodebasen fra INGRES ble ikke videreført
Kommersialisert som Illustra (kjøpt av Informix, kjøpt av IBM)
Fra POSTGRES til PostgreSQL: 1994-1996
SQL-støtte lagt til i 1994, lansert som Postgres95 i 1995 1977-1985 INGRES
1977-1985 INGRES
Relansert som PostgreSQL 6.0 i 1996 1986-1994 POSTGRES
1986-1994 POSTGRES
1994-1995 Postgres95
1994-1995 Postgres95
Etablering av PostgreSQL Global Development Team
1996- PostgreSQL
1996- PostgreSQL
7. PostgreSQL Global Developments Team
Thomas Lockhart
Jolly Chen
Vadim Mikheev
Jan Wieck
Andrew Yu
Tom Lane
Bruce Momjian
Marc Fournier
8. PostgreSQL utviklingsmetodikk
Kjerneteam (a la FreeBSD)
Kildekoden i CVS (a la FreeBSD)
http://developer.postgresql.org/
Egne mailingliste for utviklerne
Todo-liste
Developer's FAQ
Beta-versjoner av PostgreSQL + dokumentasjon
Presentasjoner
Web-grensesnitt mot CVS
Patcher som venter på å legges inn
Oversikt over innrapporterte bugs
11. Installasjon av PostgreSQL
FreeBSD:
# cd /usr/ports/databases/postgresql80-server
# sudo make install distclean
# cd /usr/ports/databases/postgresql80-client
# sudo make install distclean
# cd /usr/ports/databases/postgresql-docs
# sudo make install distclean
======================================================================
To initialize the database, you should run initdb as the quot;pgsqlquot; user.
Example:
su -l pgsql -c initdb
You can then start PostgreSQL by running:
/usr/local/etc/rc.d/010.pgsql.sh start
For postmaster settings, see ~pgsql/data/postgresql.conf
For more tips, read ~pgsql/post-install-notes
======================================================================
12. Initialisering av PostgreSQL
pgsql@home> initdb
The files belonging to this database system will be owned by user quot;pgsqlquot;
This user must also own the server process.
The database cluster will be initialized with locale C.
creating directory /usr/local/pgsql/data... ok
creating directory /usr/local/pgsql/data/base... ok
creating directory /usr/local/pgsql/data/global... ok
creating directory /usr/local/pgsql/data/pg_xlog... ok
creating directory /usr/local/pgsql/data/pg_clog... ok
creating template1 database in /usr/local/pgsql/data/base/1... ok
creating configuration files... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
initializing pg_depend... ok
creating system views... ok
loading pg_description... ok
creating conversions... ok
setting privileges on built-in objects... ok
creating information schema... ok
vacuuming database template1... ok
copying template1 to template0... ok
Success. You can now start the database server using:
/usr/local/pgsql//bin/postmaster -D /usr/local/pgsql/data
or
/usr/local/pgsql//bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
13. Etablering av database
oddbjorn@home ~> createdb demo
createdb: database creation failed: ERROR: permission denied to create database
oddbjorn@home ~> su - pgsql
pgsql@home ~> createdb demo
CREATE DATABASE
pgsql@home ~> psql demo
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.
Type: copyright for distribution terms
h for help with SQL commands
? for help on internal slash commands
g or terminate with semicolon to execute query
q to quit
demo=# grant all on database demo to oddbjorn;
GRANT
oddbjorn@home ~> psql demo
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.
Type: copyright for distribution terms
h for help with SQL commands
? for help on internal slash commands
g or terminate with semicolon to execute query
q to quit
demo=>
14. psql: Den primære kommandolinjeklienten
Usage:
psql [OPTIONS]... [DBNAME [USERNAME]]
General options:
-d DBNAME specify database name to connect to (default: quot;oddbjornquot;)
-c COMMAND run only single command (SQL or internal) and exit
-f FILENAME execute commands from file, then exit
-l list available databases, then exit
-v NAME=VALUE set psql variable NAME to VALUE
-X do not read startup file (~/.psqlrc)
--help show this help, then exit
--version output version information, then exit
Input and output options:
-a echo all input from script
-e echo commands sent to server
-E display queries that internal commands generate
-q run quietly (no messages, only query output)
-o FILENAME send query results to file (or |pipe)
-n disable enhanced command line editing (readline)
-s single-step mode (confirm each query)
-S single-line mode (end of line terminates SQL command)
Output format options:
-A unaligned table output mode (-P format=unaligned)
-H HTML table output mode (-P format=html)
-t print rows only (-P tuples_only)
-T TEXT set HTML table tag attributes (width, border) (-P tableattr=)
-x turn on expanded table output (-P expanded)
-P VAR[=ARG] set printing option VAR to ARG (see pset command)
-F STRING set field separator (default: quot;|quot;) (-P fieldsep=)
-R STRING set record separator (default: newline) (-P recordsep=)
Connection options:
-h HOSTNAME database server host or socket directory (default: quot;local socketquot;)
-p PORT database server port (default: quot;5432quot;)
-U NAME database user name (default: quot;oddbjornquot;)
-W prompt for password (should happen automatically)
15. psql: ? lister psqls interne kommandoer
General
Informational
c[onnect] [DBNAME|- [USER]]
d [NAME] describe table, index, sequence, or view
connect to new database
d{t|i|s|v|S} [PATTERN] (add quot;+quot; for more detail)
cd [DIR] change the current working directory
list tables/indexes/sequences/views/system tables
copyright show PostgreSQL usage and distribution terms
da [PATTERN] list aggregate functions
encoding [ENCODING]
dc [PATTERN] list conversions
show or set client encoding
dC list casts
h [NAME] help on syntax of SQL commands, * for all commands
dd [PATTERN] show comment for object
q quit psql
dD [PATTERN] list domains
set [NAME [VALUE]]
df [PATTERN] list functions (add quot;+quot; for more detail)
set internal variable, or list all if no parameters
dn [PATTERN] list schemas
timing toggle timing of commands (currently off)
do [NAME] list operators
unset NAME unset (delete) internal variable
dl list large objects, same as lo_list
! [COMMAND] execute command in shell or start interactive shell
dp [PATTERN] list table access privileges
dT [PATTERN] list data types (add quot;+quot; for more detail)
Query Buffer
du [PATTERN] list users
e [FILE] edit the query buffer (or file) with external editor
l list all databases (add quot;+quot; for more detail)
g [FILE] send query buffer to server (and results to file or
z [PATTERN] list table access privileges (same as dp)
|pipe)
p show the contents of the query buffer
Formatting
r reset (clear) the query buffer
a toggle between unaligned and aligned output mode
s [FILE] display history or save it to file
C [STRING] set table title, or unset if none
w [FILE] write query buffer to file
f [STRING] show or set field separator for unaligned query output
H toggle HTML output mode (currently off)
Input/Output
pset NAME [VALUE]
echo [STRING] write string to standard output
set table output option
i FILE execute commands from file
(NAME := {format|border|expanded|fieldsep|footer|null|
o [FILE] send all query results to file or |pipe
recordsep|tuples_only|title|tableattr|pager})
qecho [STRING]
t show only rows (currently off)
write string to query output stream (see o)
T [STRING] set HTML <table> tag attributes, or unset if none
x toggle expanded output (currently off)
Copy, Large Object
copy ... perform SQL COPY with data stream to the client host
lo_export
lo_import
lo_list
lo_unlink large object operations
16. psql: d: Describe
d [NAME] describe table, index, sequence, or view
d{t|i|s|v|S} [PATTERN] (add quot;+quot; for more detail)
list tables/indexes/sequences/views/system tables
da [PATTERN] list aggregate functions
dc [PATTERN] list conversions
dC list casts
dd [PATTERN] show comment for object
dD [PATTERN] list domains
df [PATTERN] list functions (add quot;+quot; for more detail)
dn [PATTERN] list schemas
do [NAME] list operators
dl list large objects, same as lo_list
dp [PATTERN] list table access privileges
dT [PATTERN] list data types (add quot;+quot; for more detail)
du [PATTERN] list users
l list all databases (add quot;+quot; for more detail)
z [PATTERN] list table access privileges (same as dp)
17. psql: d-eksempel
testdb=> CREATE TABLE my_table (
testdb(> first integer not null default 0,
testdb(> second text
testdb-> );
CREATE TABLE
testdb=> d my_table
Table quot;my_tablequot;
Attribute | Type | Modifier
-----------+---------+--------------------
first | integer | not null default 0
second | text |
18. psql: h: SQL-hjelp
ABORT CREATE LANGUAGE DROP TYPE
ALTER AGGREGATE CREATE OPERATOR CLASS DROP USER
ALTER CONVERSION CREATE OPERATOR DROP VIEW
ALTER DATABASE CREATE RULE END
ALTER DOMAIN CREATE SCHEMA EXECUTE
ALTER FUNCTION CREATE SEQUENCE EXPLAIN
ALTER GROUP CREATE TABLE FETCH
ALTER LANGUAGE CREATE TABLE AS GRANT
ALTER OPERATOR CLASS CREATE TRIGGER INSERT
ALTER SCHEMA CREATE TYPE LISTEN
ALTER SEQUENCE CREATE USER LOAD
ALTER TABLE CREATE VIEW LOCK
ALTER TRIGGER DEALLOCATE MOVE
ALTER USER DECLARE NOTIFY
ANALYZE DELETE PREPARE
BEGIN DROP AGGREGATE REINDEX
CHECKPOINT DROP CAST RESET
CLOSE DROP CONVERSION REVOKE
CLUSTER DROP DATABASE ROLLBACK
COMMENT DROP DOMAIN SELECT
COMMIT DROP FUNCTION SELECT INTO
COPY DROP GROUP SET
CREATE AGGREGATE DROP INDEX SET CONSTRAINTS
CREATE CAST DROP LANGUAGE SET SESSION AUTHORIZATION
CREATE CONSTRAINT TRIGGER DROP OPERATOR CLASS SET TRANSACTION
CREATE CONVERSION DROP OPERATOR SHOW
CREATE DATABASE DROP RULE START TRANSACTION
CREATE DOMAIN DROP SCHEMA TRUNCATE
CREATE FUNCTION DROP SEQUENCE UNLISTEN
CREATE GROUP DROP TABLE UPDATE
CREATE INDEX DROP TRIGGER VACUUM
19. CREATE / ALTER / DROP av objekter
AGGREGATE OPERATOR
CAST RULE
CONSTRAINT SCHEMA
CONVERSION SEQUENCE
DATABASE TABLE
DOMAIN TYPE
FUNCTION TRIGGER
GROUP USER
LANGUAGE VIEW
20. SQL-transaksjoner + vedlikehold
Oppdatering av data
INSERT / UPDATE / DELETE
COPY
TRUNCATE
Spørringer
SELECT
SELECT INTO
Rettigheter
GRANT / REVOKE
Vedlikehold
EXPLAIN
ANALYZE
VACUUM
21. SQL: Annet
Transaksjoner
BEGIN / ABORT / ROLLBACK / CHECKPOINT / COMMIT
SET TRANSACTION / START TRANSACTION / SET CONSTRAINTS
Cursorer
DECLARE / FETCH / MOVE / CLOSE
Triggere
LISTEN / NOTIFY / UNLISTEN
Parametere
SHOW / SET / RESET
Annet
PREPARE / EXECUTE / DEALLOCATE
LOAD
LOCK
COMMENT
REINDEX
CLUSTER
SET SESSION AUTHORIZATION
22. psql: h select: Informasjon om kommando
testdb=> h select
Command: SELECT
Description: retrieve rows from a table or view
Syntax:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
[ FOR UPDATE [ OF table_name [, ...] ] ]
where from_item can be one of:
[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...]
)]]
( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
function_name ( [ argument [, ...] ] ) [ AS ] alias [ (
column_alias [, ...] | column_definition [, ...] ) ]
function_name ( [ argument [, ...] ] ) AS ( column_definition [,
...] )
from_item [ NATURAL ] join_type from_item [ ON join_condition |
USING ( join_column [, ...] ) ]
23. psql: Ymse egenskaper
Bruk av psql i batch:
psql –f fil.sql dbnavn
program | psql –f - dbnavn
Readline-støtte (!)
Innebygget tidtaking på operasjoner:
db=> timing
Timing is on.
net=> select count(*) from tabellnavn;
count
-------
25523
(1 row)
Time: 52.729 ms
Valg av format på output
HTML|format|border|expanded|fieldsep|footer|null
recordsep|tuples_only|title|tableattr|pager
24. psql: Kopiering av data i bulk: COPY
Laster inn rå tabseparerte datafiler i èn transaksjon
Fordel: går raskt
Ulempe: dersom èn rad ikke blir akseptert,
forkastes alle radene
copy tabellnavn from ’filename’
psql støtter også last av store objekter (lo_*)
25. pgAdmin III
Fritt tilgjengelig grafisk
administrasjonsverktøy for
PostgreSQL
Kjører på:
Linux,
FreeBSD &
Windows
Versjon 1.2 støtter 8.0
28. Pgbash
home ~> pgbash
Welcome to Pgbash version 7.3 ( bash-2.05a.0(1)-release )
Type '?' for HELP.
Type 'connect to DB;' before executing SQL.
Type 'SQL;' to execute SQL.
Type 'exit' or 'Ctrl+D' to terminate Pgbash.
home ~> CONNECT TO testdb;
home ~> SELECT * FROM iso3166 LIMIT 10;
cc | country
----+---------------------
AF | Afghanistan
AL | Albania
DZ | Algeria
AS | American Samoa
AD | Andorra
AO | Angola
AI | Anguilla
AQ | Antarctica
AG | Antigua and Barbuda
AR | Argentina
(10 rows)
29. Andre kommandoer
Administrative verktøy
pg_ctl – start, stop eller restart av server
pg_config – dumper config-informasjon
Dump & restore
pg_dump og pg_dumpall
Førstnevnte dumper én database, sistnevnte alle
Valg mellom alt/schema/data på tabell/databasenivå
Output: plain-text SQL, tar, eget arkivformat (m/kompr)
pg_restore
Laster inn input fra pg_dump*
30. Contrib
Egen contrib-distribusjon, med dels utvidelser og dels støttefunksjonalitet:
dblink - Allows remote query execution
dbmirror - Replication server
dbsize - Reports database and table disk space
fuzzystrmatch - Levenshtein, metaphone, and soundex fuzzy string matching
isbn_issn - PostgreSQL type extensions for ISBN and ISSN
mysql - Utility to convert MySQL schema dumps to PostgreSQL
oracle - Converts Oracle database schema to PostgreSQL
pg_autovacuum - Automatically performs vacuum
pg_upgrade - Upgrade from previous PostgreSQL version
pgbench - TPC-B like benchmarking tool
pgcrypto - Cryptographic functions
reindexdb - Reindexes a database
apache_logging - Getting Apache to log to PostgreSQL
tsearch2 - Full-text-index support using GiST
xml2 - Storing XML in PostgreSQL
32. Overordnede egenskaper
Fritt tilgjengelig; ingen lisenskostnader å tenke på
Ekstremt robust gjennom mange år
Designet for å kreve et minimum av administrasjon; enkle,
men gode administrasjonsmekanismer (CLI og GUI)
Portabel, kjører på ”alle” relevante plattformer
Utvidbar, med godt dokumenterte API for å legge til
funksjonalitet
Flere ulike alternativ for høytilgjengelighet / replikering
Veldig god de facto support, med mulighet for kommersiell
support for de som ønsker det
33. Egenskaper
SQL-støtte
Database
Fullt ut ACID-kompatibel God ANSI SQL-støtte
Fremmednøkler (referential integrity) Rules
Bedre enn rad-nivå låsing (MVCC)
Views 5.0
Funksjonelle og partielle indekser
Triggers 5.1 (rudimentary)
Cursors 5.0
Utvikling
Unicode
Stored procedures 5.0
Sequences 5.1?
Procedural languages
Inheritance ?
Native interfaces for ODBC,
Outer Joins
JDBC, C, C++, PHP, Perl, TCL,
Sub-selects
ECPG, Python, and Ruby
Support for UNION
Et åpent og veldokumentert API
(ALL/EXCEPT)
Sikkerhet
Utvidbar
Native SSL support
Datatyper
Native Kerberos autentisering
Funksjoner
Operatorer
34. Etterlevelse av SQL-standarden
SQL-standarden
ISO/IEC 9075 “Database Language SQL”
Sist revidert i 2003, aka ISO/IEC 9075:2003 eller bare SQL:2003
Tidligere versjoner var SQL:1999 og SQL-92, men SQL:2003
erstatter disse
Kravene er definert som individuelle egenskaper:
“Core”, som alle SQL-implementasjoner må etterleve
resten er valgfrie, gruppert i ”packages”
Ingen kjente databasesystemer som fullt ut etterlever Core SQL:2003
PostgreSQL versus SQL:2003
PostgreSQL forsøker å etterleve standarden der det er mulig uten å
ødelegge bakoverkompatibilitet og ”sunn fornuft”
Mye av SQL:2003 er støttet, men iblant med noe forskjellig syntax
Det arbeides med å ytterligere forbedre etterlevelsen
255 krav (58%) etterlevd, 184 (42%) er ikke etterlevd.
35. Egenskaper for å sikre integritet: ACID
Atomisk / Atomic
En transaksjon er udelelig – ”alt eller intet”
Konsistent / Consistent
En transaksjon skal bringe databasen fra en
konsistent til en konsistent tilstand uten at den
nødvendigvis er konsistent underveis
Isolert / Isolated
Transaksjoner berøres ikke av konsekvensene til
andre transaksjoner som kjøres samtidig
Holdbarhet / Durable
Når en transaksjon har gjort COMMIT, er
endringene permanent lagret, også etter et havari
36. MultiVersion Concurrency Control (MVCC)
I motsetning til tradisjonell rad-låsing ved oppdateringer,
vedlikeholder MVCC flere versjoner av en gitt rad, og
muliggjør derfor:
1. Hver transaksjon ser et snapshot slik databasen så ut ved
transaksjonens start, uavhengig av hva andre transaksjoner gjør
mens den kjører
2. Leseoperasjoner blokkerer ikke skriveoperasjoner
3. Skriveoperasjoner blokkerer ikke leseoperasjoner
4. Skriveoperasjoner blokkerer bare når de oppdaterer samme rad
En annen fordel med MVCCs snapshot er muligheten for
varme backuper
Se “Transaction Processing in PostgreSQL” av Tom Lane
37. Transaksjoner
Tett knyttet til ACID/MVCC er transaksjonsbegrepet:
En transaksjon grupperer flere steg til ètt atomisk steg
Resultatet av transaksjonen er enten komplett eller intet
Dersom en feil oppstår i ett av stegene, forkastes hele
transaksjonen
BEGIN;
Én transaksjonsblokk
UPDATE accounts SET balance = balance - 100.00
WHERE name = ’Alice’;
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts
WHERE name = ’Alice’);
UPDATE accounts SET balance = balance + 100.00
WHERE name = ’Bob’;
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts
WHERE name = ’Bob’);
COMMIT;
38. Views
Et view maskerer en spørring bak en virtuell tabell; fordeler:
Konsistent grensesnitt selv om tabeller i bakgrunnen endrer seg
Innpakking av detaljer i tabeller
Views basert på views kan maskere kompleksitet
Kan gi selektiv tilgang til informasjon, og dermed økt sikkerhet
Fletting av utvalgte kolonner fra to tabeller:
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;
PostgreSQL støtter foreløpig ikke materialserte views, dvs.
lagring av resultatet av spørringer bak views (nyttig ifb.
datavarehus / analytiske databaser).
39. Schemas
Schemas er en måte å dele opp namespace internt i
en database, omtrent som filkataloger (bare ett nivå):
Separere ulike brukere fra hverandre
Gruppere databaseobjekter logisk sammen
Unngå navnekollisjoner i større database
(Ingen føringer mhp. rettigheter)
CREATE SCHEMA blug;
CREATE TABLE blug.tabell (..);
SHOW search_path;
DROP SCHEMA blug [CASCADE];
public er default; i tillegg inneholder hver database
pg_catalog som inneholder systemtabeller mv.
40. Constraints
Datatypene som definerer kolonnene i en tabell gir
begrensninger på hvilke data som kan legges inn
Constraints gir ytterligere fleksibilitet mhp. begrensninger på
hva som kan legges inn; kan defineres for kolonner & tabeller
Eksempel: En kolonne med priser vil være hel- eller flyttall, men i
tillegg bare positive verdier
PostgreSQL støtter fem former for constraints
Check - price numeric CHECK (price > 0)
Not NULL - product_no integer NOT NULL
Unikhet - product_no integer UNIQUE
Primærnøkler - Unik + !NULL: PRIMARY KEY (a, c)
Fremmednøkler - product_no integer REFERENCES products
(product_no),
41. Triggere
En trigger kan defineres til å eksekvere før eller
etter en INSERT, UPDATE eller DELETE, enten per
statement eller modifisert rad
Eksempel:
CREATE TRIGGER if_film_exists
BEFORE DELETE OR UPDATE ON distributors
FOR EACH ROW
EXECUTE PROCEDURE check_foreign_key
(1, 'CASCADE', 'did', 'films', 'did');
Funksjonen må være definert i et prosedyrespråk
42. Inheritance / Arv
Arv i PostgreSQL er samme konsept som arv mellom
objekter i objektorienterte språk som C++
En tabell som arver en annen får med seg alle
kolonner fra foreldretabellen.
Kan også begrense spørringer til foreldretabeller:
SELECT a, b from ONLY tableA
Støttes også av UPDATE, DELETE og andre
Ikke fullt ut integrert med unike begrensninger eller
fremmednøkler
43. Eksempel på inheritance
CREATE TABLE capitals (
name text,
population real,
altitude int, -- (in ft)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
altitude int -- (in ft)
);
CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
SELECT name, population, altitude FROM non_capitals;
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
44. Cursorer / Markører
Cursorer gir oss muligheten for å for å hente ut
resultatsettet i lettfordøyelige blokker av rader.
Dette kan bidra til å unngå ressursproblemer på
klientsiden, og muliggjør retur av referanse til en
cursor i stedet for resultatsettet
45. Sekvenser
testdb=> CREATE TABLE tabell (
id integer default nextval('news_id') UNIQUE not
NULL,
news text not NULL,
post_time time default now()
);
testdb=> INSERT INTO tabell (news) VALUES (‘abc');
INSERT 7259941 1
testdb=> INSERT INTO tabell (news) VALUES (‘def');
INSERT 7259943 1
testdb=> INSERT INTO tabell (news) VALUES (‘ghi');
INSERT 7259944 1
testdb=> SELECT * FROM tabell;
id | news | post_time
------+-------+----------
1000 | abc | 15:18:40
1001 | def | 15:18:56
1002 | ghi | 15:19:36
46. Subqueries
Subqueries som en konstant:
SELECT f1.firstname, f1.lastname, f1.state
FROM friend f1
WHERE f1.state <> ( SELECT f2.state
FROM friend f2
WHERE f2.firstname = ‘Dick’ AND
f2.lastname = ‘Cleason’ );
Subqueries som korrellerte verdier:
SELECT f1.firstname, f1.lastname, f1.age
FROM friend f1
WHERE age = ( SELECT MAX(f2.age)
FROM friend f2
WHERE f1.state = f2.state );
Multiple kolonner støttes:
WHERE (uppercol1, uppercol2) IN (SELECT col1, col2 FROM
subtable)
Subqueries kan også brukes ifb. DELETE, INSERT, UPDATE
(SELECT INTO oppretter en ny tabell med resultatet)
48. Write-Ahead Logging (WAL)
Standard teknikk for transaksjonslogging
Endringer i datafiler kan bare skrives etter at
endringene er logget, og loggen skrevet til disk
Trenger ikke flushe datafilene etter hver commit
Fordeler
Redusert antall skriveoperasjoner mot disk
Èn sync mot loggfilen i stedet for potensielt mange
mot datafilene
Loggfilen skrives sekvensielt
Datafilene er konsistente
Muliggjør online backup og point-in-time recovery
49. Nytt i versjon 8.0
7.0 lansert i midten av 2000, så 4.5 år med utvikling
8 måneder med utvikling i forhold til 7.x
Totalt 17 sider med endringer
5 måneder med betatesting
Mål: Gjøre PostgreSQL til en ’enterprise’-kandidat
Viktigste nye egenskaper:
Tablespaces: spre databaser på tvers av disker
Savepoints
Point-in-time Recovery (PITR)
Perl integrert i server
Native støtte for Windows (~10 årsverk)
50. Tablespaces
I PostgreSQL < 8 måtte man bruke symlinker for å legge
ulike datafiler på ulike partisjoner
Tablespaces lar oss styre hvilken disk som lagrer ulike:
Database
Schema
Tabell
Indekser
Fordeler:
Styres på individuelt objektnivå
Forbedrer ytelse og kontroll over hvordan diskene utnyttes
Større fleksibilitet til å legge til plass når en disk går full
CREATE TABLESPACE fastspace LOCATION ’/disk1/pgsql/data’;
CREATE TABLE foo(i int) TABLESPACE fastspace;
51. Savepoints
Savepoints gir oss muligheten til å håndtere feil inne i
transaksjoner på en grasiøs måte, uten nødvendigvis å måtte
avbryte hele transaksjonen
Endringer før savepoint gjennomføres selv om rollback til det skjer
Eventuelle rollbacks m/konsekvenser er ikke synlig utenfor
transaksjonen, jfr. ACID-prinsippene
BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE name = ’Alice’;
SAVEPOINT my_savepoint;
Èn transaksjon
UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Bob’;
Oops ... bruk Charlie sin konto i stedet!
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Charlie’;
COMMIT;
52. Point-In-Time Recovery
I PostgreSQL < 8, var den eneste måten å komme
seg videre etter et diskcrash enten å:
Gjenskape data fra backup, eller
Bruke en replikerende server
Point-in-time recovery muliggjør kontinuerlig
backup av serveren:
Write-ahead log’en (WAL) beskriver alle endringer; ved å
ta backup av denne, kan vi ”spole” databasetilstanden frem
og tilbake.
PITR baserer seg på løpende overføring av WAL til
failovermaskine, basert på en fritt valgt arkiverings-
mekanisme
Recover frem til crashtidspunktet, eller et vilkårlig valgt
tidspunkt
53. Støtte for, eh, Windows #1
Har tidligere vært tilgjengelig via Cygwin, nå native
Støtter 2000, XP & 2003
Kan kjøre som service
Installer som fungerer rimelig bra:
54. Støtte for, eh, Windows #2
Inkluderer følgende add-ons:
Npgsql
JDBC
psqlODBC
pgAdmin III
56. Overordnet arkitektur
Klientprosesser Serverprosesser
Initiell forbindelse
Klient- postmaster Disk-
og autentisering Kernel disk
buffers
(daemon)
applikasjon buffere
Spawner
serverprosess
Tabeller
Klient postgres
libpq
postgres
Spørringer
bibliotek (backend)
postgres
og resultatsett
Disk
(backend) Delte
(backend)
23961 Ss 0:05.64 /usr/local/bin/postmaster (postgres)
23963 S 0:01.13 postmaster: stats buffer process (postgres)
23966 S 0:03.24 postmaster: stats collector process (postgres)
36324 I 0:00.43 postmaster: oddbjorn testdb [local] idle (postgres)
36428 I 0:00.23 postmaster: oddbjorn testdb [local] idle (postgres)
57. Hva skjer med en spørring?
1. Spørring ankommer via en socket,
legges i en streng
Postgres
2. Lex/yacc parser strengen, og type
spørring identifiseres
Parser
3. Hvis kompleks spørring gå videre,
query tree
hvis ikke:
Traffic cop Utility cmd
4. Send til respektive spesialfunk.
query tree
Rewrite &
Generate paths 5. Tar hensyn til regler, views++
query tree + views og annet
Planner /
6. Velger optimal plan basert på
optimizer
kostnad av query tree, og sender
query plan
denne til executor
Executor
7. Gjennomfører henting av data, sort,
joins, kvalifiseringer av data og
leverer til slutt resultatet
58. Tuning: EXPLAIN
PostgreSQL lager en query plan for hver spørring
Viktig redskap for å forstå og tune spørringer inkl. bruk av indekser
EXPLAIN foran en SELECT viser den respektive planen:
testdb=> EXPLAIN SELECT * FROM syslog;
QUERY PLAN
------------------------------------------------------------
Seq Scan on syslog (cost=0.00..20.00 rows=1000 width=104)
(1 row)
Kostnadene er målt i antall pages som
1. Estimert oppstartskostnad må hentes fra disk. CPU-kostnadene
konverteres til disk-enheter.
2. Estimert totalkostnad (for alle rader)
3. Estimert antall rader som spørringen resulterer i
4. Bredde målt i bytes per rad som spørringen resulterer i
(Mye mer info): Efficient SQL, OSCON 2003
http://www.gtsm.com/oscon2003/toc.html
59. Tuning: ANALYZE
testdb=> ANALYZE VERBOSE syslog;
INFO: analyzing quot;public.syslogquot;
INFO: quot;syslogquot;: 3614 pages, 3000 rows sampled, 26243 estimated total rows
ANALYZE
testdb=> EXPLAIN SELECT * from syslog;
QUERY PLAN
---------------------------------------------------------------
Seq Scan on syslog (cost=0.00..3876.43 rows=26243 width=132)
(1 row)
Kvaliteten på planen er altså avhengig av:
kunnskapen PostgreSQL har om tabeller, indekser mv
kombinert med parametersettingene i postgresql.conf
60. Tuning: VACUUM
VACUUM må kjøres periodisk av følgende årsaker:
1. Frigjøre diskplass brukt av oppdaterte eller slettede rader
2. Oppdatere statistikken som benytes for å lage query plans
3. Beskytte mot tap av veldig gamle data på grunn av wraparound av
transaksjons-IDen
Kan kjøres parallellt med vanlig bruk av databasen
pg_autovacuum
contrib-klient som overvåker alle databaser i en PostgreSQL-instans
Bruker statistikkinnsamlingen til å overvåke INSERT-, UPDATE- og
DELETE-aktiviteten
Starter automagisk VACUUM når definerte grenseverdier overstiges
61. Katalogstruktur #1
/usr/local/pgsql/data
PG_VERSION f.eks. ”8.0”
postgresql.conf konfigurasjonfil
postmaster.opts evt. opsjoner
postmaster.pid PID + litt til
pg_hba.conf tilgangskontroll
pg_ident.conf mapping mellom identer
base/ databasefilene
global/
pg_log/ applikasjonslogger fra pg
pg_clog/ transaksjonslogger
pg_xlog/ WALtransaksjonslogger
pg_tblspc/ tablespaces
63. postgresql.conf: Resource Settings
# - Memory -
shared_buffers = 1000 # min 16, at least max_connections*2, 8KB each
#sort_mem = 1024 # min 64, size in KB
#vacuum_mem = 8192 # min 1024, size in KB
# - Free Space Map -
#max_fsm_pages = 20000 # min max_fsm_relations*16, 6 bytes each
#max_fsm_relations = 1000 # min 100, ~50 bytes each
# - Kernel Resource Usage -
#max_files_per_process = 1000 # min 25
#preload_libraries = ''
64. postgresql.conf: Annet
Security & Authentication
Write Ahead Log
Settings
Checkpoints
Query Tuning
Planner Method Enabling
Planner Cost Constants
Genetic Query Optimizer
Error Reporting and Logging
syslog
When to log
What to log
Runtime Statistics
Statistics Monitoring
Query/Index Statistics Collector
Client Connection Defaults
Statement Behaviour
Locale and Formatting
Lock Management
Version / Platform Compatibility
65. Tilgangskontroll: pg_hba.conf
# PostgreSQL Client Authentication Configuration File
# ===================================================
#
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access. Records take one of seven forms:
#
# local DATABASE USER METHOD [OPTION]
# host DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION]
# hostssl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION]
# hostnossl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION]
# host DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION]
# hostssl DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION]
# hostnossl DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION]
#
# [..]
# METHOD can be quot;trustquot;, quot;rejectquot;,quot;md5quot;, quot;cryptquot;,
# quot;passwordquot;, quot;krb4quot;, quot;krb5quot;, quot;identquot;, or quot;pamquot;.
#
# If you want to allow non-local connections, you need to add more
# quot;hostquot; records. Also, remember TCP/IP connections are only enabled
# if you enable quot;tcpip_socketquot; in postgresql.conf.
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
local all all trust
host all all 127.0.0.1 255.255.255.255 trust
host all all 192.168.1.2 255.255.255.255 trust
66. Sjekk av status: pg_controldata
home ~> pg_controldata /usr/local/pgsql/data
pg_control version number: 72
Catalog version number: 200310211
Database cluster state: in production
pg_control last modified: Sun Jan 30 17:08:32 2005
Current log file ID: 0
Next log file segment: 57
Latest checkpoint location: 0/3879ABE4
Prior checkpoint location: 0/3879ABA4
Latest checkpoint's REDO location: 0/3879ABE4
Latest checkpoint's UNDO location: 0/0
Latest checkpoint's StartUpID: 78
Latest checkpoint's NextXID: 886791
Latest checkpoint's NextOID: 5065687
Time of latest checkpoint: Thu Jan 27 16:19:38 2005
Database block size: 8192
Blocks per segment of large relation: 131072
Maximum length of identifiers: 64
Maximum number of function arguments: 32
Date/time type storage: floating-point numbers
Maximum length of locale name: 128
LC_COLLATE: C
LC_CTYPE: C
67. Systemkatalogen & Information schema
Systemkatalogen: pg_catalog
Systemkatalogen er et schema som inneholder
PostgreSQL-spesifikke tabeller og views som beskriver
tilgjengelige datatyper, funksjoner, operatorer mv.
Information schema: information_schema
Blir automatisk etablert i alle databaser
Inneholder, i likhet med pg_catalog, et antall views med
informasjon om objekter i databasen
Er en del av SQL-standarden; stabil og portabel
Inneholder ikke PostgreSQL-spesifikk informasjon
71. Nettverkstyper
Følgende tre datatyper:
inet - host eller nettmaske, fex. 10.0.0.1
cidr - nettverksmasker, fex 10.0.0.0/8
macaddr - fex ’08:00:2b:01:02:03’
Gir endel kule muligheter:
1. WHERE ’192.168.1.5’ < ’192.168.1.6’
2. WHERE ’192.168.1/24’ >> ’192.168.1.5’
3. WHERE ip << ’192.168.1.0/24’
4. trunc(macaddr)
73. Støtte for regulære uttrykk
Støtte for flere former for pattern matching:
SQL LIKE-operatøren
SQL99 SIMILAR TO-operatøren
POSIX-style regulære uttrykk
Eksempel på sistnevnte:
’abc’ ~ ’abc’ true
’abc’ ~ ’^a’ true
’abc’ ~ ’(b|d)’ true
’abc’ ~ ’^(b|c)’ false
74. psql: Liste systemkatalogen
test=> dS
List of relations
Schema | Name | Type | Owner
------------+--------------------------+---------+-------
pg_catalog | pg_aggregate | table | pgsql
pg_catalog | pg_am tabellene i systemkatalogen, | table | pgsql
I lagrer PostgreSQL metadata;
pg_catalog | pg_amop informasjon om databaser,table views, brukere
| tabeller, | pgsql
f.eks.
pg_catalog | pg_amproc | table | pgsql
og så videre. Ved CREATE DATABASE blir f.eks.
pg_catalog | pg_attrdef | table | pgsql
pg_database oppdatert, samt databasen skrevet til disk.
pg_catalog | pg_attribute | table | pgsql
pg_catalog | pg_cast | table | pgsql
pg_catalog | pg_class | table | pgsql
pg_catalog | pg_constraint | table | pgsql
pg_catalog | pg_conversion | table | pgsql
pg_catalog | pg_database | table | pgsql
pg_catalog | pg_depend | table | pgsql
pg_catalog | pg_description | table | pgsql
pg_catalog | pg_group | table | pgsql
pg_catalog | pg_index | table | pgsql
pg_catalog | pg_indexes | view | pgsql
pg_catalog | pg_inherits | table | pgsql
[..]
75. Utvidelse av SQL-reportoaret
SQL-støtten i PostgreSQL kan utvides vha. bla. følgende:
funksjoner
aggregater (min, max, sum osv)
datatyper
operatorer
Dette er relativt enkelt, ettersom definisjonene for disse
ligger i systemkatalogen.
Potensielt mulig å skyte seg selv i foten..
PostgreSQL kan dessuten laste brukerutviklet kode vha.
dynamisk lasting av bibliotek som implementerer en type
eller en funksjon
77. Slony-I
En “master to multiple slaves” replikeringsløsning
Utvikles av Jan Wieck
Slony er russisk flertall for elefant
http://www.slony.info
Støtter:
etablering av en replika ”i fart”
asynkron replikering
enhver replika kan overta for enhver annen node
promotering av slave til master hvis master dør
Slony-2 kommer til å støtte multi-master
Introducing Slony & Building and Configuring Slony
A. Elein Mustain
http://www.onlamp.com/lpt/a/{5328,5486}
79. Andre replikeringsløsninger
pgcluster
Synkron replikering inkl. lastbalansering
http://pgcluster.projects.postgresql.org/
pgpool
Connection-pool-server; ligger som et lag mellom klienter og opp til 2 PostgreSQL-
servere
Cacher connections for å redusere overhead
Automatisk failover til sekundær server når primær går ned
Replikering ved ag pgpool sender transaksjonene parallellt til hver server (synkron
replikering)
eRServer
Trigger-basert single-master/multi-slave asynkron replikeringsløsning
Ikke lenger i live?
http://www.erserver.com/
pgreplicator
“Store and forward” asynkron replikering
To-veis synkronisering, differensiell replikering
Ikke lenger i live?
http://pgreplicator.sourceforge.net
81. Språk: Frontend versus backend
Frontend: Språk for å aksessere data fra ’utsiden’,
fex. script eller applikasjoner
Backend: Språk for å utvide funksjonaliteten internt
i databaseserveren
Praktisk talt alle språkene kan benyttes i begge roller
Klassisk avveining om funksjonalitet skal ligger i
databasen eller i applikasjonen
82. Funksjoner i andre språk enn SQL&C
PostgreSQL støtter brukerdefinerte funksjoner i et assortert
utvalg språk ut over SQL og C.
PL/pgSQL
PL/Tcl
PL/Perl
PL/Python
PL/PHP
PL/Java / pl-j
PL = procedural languages
Andre språk kan defineres av brukeren
PostgreSQL forholder seg ikke til kildekoden; overfører bare
kallet til en handler som deretter fungerer som lim i forhold
til det aktuelle språket.
83. Bruk av språk
createlang plperl dbname
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
if ($_[0] > $_[1]) { return $_[0]; }
return $_[1];
$$ LANGUAGE plperl;
CREATE TABLE employee (
name text,
basesalary integer,
bonus integer
);
CREATE FUNCTION empcomp(employee) RETURNS integer AS $$
my ($emp) = @_;
return $emp->{basesalary} + $emp->{bonus};
$$ LANGUAGE plperl;
SELECT name, empcomp(employee.*) FROM employee;
84. PL/pgSQL
PL/pgSQL er et lastbart prosedyrespråk
Støtter:
Definering av funksjoner og triggere
Kontrollstrukturer
Beregninger
Gjenbruker alle datatyper, funksjoner og operatorer som
er tilgjengelig i PostgreSQL
Gruppering av transaksjoner i ett kall internt i
databaseserveren, unngår overhead med klient/tjener-
arkitekturen
85. PL/pgSQL: Eksempel #1
CREATE FUNCTION tax(numeric)
RETURNS numeric
AS ‘SELECT ($1 * 0.06::numeric(8,2))::numeric(8,2);’
LANGUAGE ‘sql’;
CREATE FUNCTION shipping(numeric)
RETURNS numeric
AS ‘SELECT CASE
WHEN $1 < 2 THEN CAST(3.00 AS numeric(8,2))
WHEN $1 >= 2 AND $1 < 4 THEN CAST(5.00 AS numeric(8,2))
WHEN $1 >=4 THEN CAST(6.00 AS numeric(8,2))
END;’
LANGUAGE ‘sql’;
SELECT part_id, trim(name) AS name, cost, tax(cost), cost +
tax(cost) AS subtotal, shipping(weight), cost + tax(cost) +
shipping(weight) AS total
FROM part
ORDER BY part_id;
86. PL/pgSQL: Eksempel #2
CREATE TABLE emp (empname text, salary int4,
last_date datetime, last_user name);
CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS
BEGIN
-- Check that empname and salary are given
IF NEW.empname ISNULL THEN
RAISE EXCEPTION ''empname cannot be NULL value' ';
END IF;
IF NEW.salary ISNULL THEN
RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
END IF;
-- Who works for us when she must pay for?
IF NEW.salary < 0 THEN
RAISE EXCEPTION ''% cannot have a negative salary'',
NEW.empname;
END IF;
-- Remember who changed the payroll when
NEW.last_date := ' 'now' ';
NEW.last_user := getpgusername();
RETURN NEW;
END; '
LANGUAGE 'plpgsql';
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
87. pl/R
R er et integrert miljø for manipulering av data, beregninger
og grafisk visning
Nært basert på AT&Ts S
R inkluderer:
effektiv håndtering og lagring av data
operatorer for beregninger over tabeller og matriser
et større antall koherente og integrerte verktøy for analyse av data
verktøy for å generere høykvalitets grafer, både til skjerm og print
et modent programmeringsspråk for å knytte det hele sammen
PL/R er et lastbart prosedyrespråk som muliggjør funksjoner
og triggere i PostgreSQL til å uttrykkes i R
Skrevet av Joe Conway
How to Graph data in PostgreSQL av Robert Bernier:
http://www.varlena.com/varlena/GeneralBits/Tidbits/ +
bernier/art_66/graphingWithR.html
88. pl/R: Plotting av brannvegglogger
BEGIN;
CREATE TEMPORARY TABLE
mytemp(id serial, hit int, source_ip inet)
ON COMMIT DROP;
INSERT INTO mytemp(hit,source_ip)
SELECT count(*) AS counterhits, source_ip
FROM firewall
GROUP BY source_ip
ORDER BY counterhits DESC;
CREATE OR REPLACE FUNCTION f_graph2() RETURNS text AS '
sql <- paste(quot;SELECT id as x,hit as y FROM mytemp LIMIT 30quot;,sep=quot;quot;);
str <- c(pg.spi.exec(sql));
mymain <- quot;Graph 2quot;;
mysub <- paste(quot;The worst offender is: quot;,str[1,3],quot; with quot;,str[1,2],quot; hitsquot;,sep=quot;quot;);
myxlab <- quot;Top 30 IP Addressesquot;;
myylab <- quot;Number of Hitsquot;;
pdf(''/tmp/graph2.pdf'');
plot(str,type=quot;bquot;,main=mymain,sub=mysub,xlab=myxlab,ylab=myylab,lwd=3);
mtext(quot;Probes by intrusive IP Addressesquot;,side=3);
dev.off();
print(''DONE'');
' LANGUAGE plr;
-- now generating the graph
SELECT f_graph2();
COMMIT;
89. Andre grensesnitt
psqlODBC
This is the most common interface for Windows applications.
pgjdbc
A JDBC interface.
Npgsql
.Net interface for more recent Windows applications.
libpqxx
A newer C++ interface.
libpq++
An older C++ interface.
pgperl
A Perl interface with an API similar to libpq.
DBD-Pg
A Perl interface that uses the DBD-standard API.
pgtclng
A newer version of the Tcl interface.
pgtcl
The original version of the Tcl interface.
PyGreSQL
A Python interface library.
90. Bruk av PostgreSQL fra Perl
DBI / DBD::Pg / DBD::PgPP (ikke libpq-basert)
#!/usr/local/bin/perl –w
use DBI;
$dbh = DBI->connect('dbi:Pg:dbname=testdb;', ‘username', '');
$sth = $dbh->prepare(“SELECT id,news from news”);
$sth->execute;
while (@news = $sth->fetchrow) {
$date = $news[0];
$article = $news[1];
print(“$date:t $articlen”);
}
91. Bruk av PostgreSQL fra Python #1
PygreSQL
Eldst og velprøvd
Nær libpq
http://www.pygresql.org
psycopg
Basert på libpq, med DB API-grensesnitt
Benyttes mye ifb. Zope
Smart gjenbruk av connections
http://initd.org/software/initd/psycopg
og flere (pyPgSQL, DB-API)
92. Bruk av PostgreSQL fra Python #2
import psycopg
o = psycopg.connect('dbname=mydb user=fog')
c = o.cursor()
c.execute('SELECT * FROM addressbook WHERE name = %s', [‘Bob'])
data = c.fetchone()
print quot;Saving image of %s %squot; % (data[0], data[1])
open(data[0]+quot;.pngquot;, 'w').write(data[3])
99. PostGIS
PostGIS implementerer støtte for “spatial data”
Data som beskriver lokasjon eller form
Punkter
Linjer
Polygoner
samt funksjoner mhp. forhold disse i mellom:
Avstand
Nærhet (”touching” og ”connectivity”)
Inneholder (”inside” og ”overlapping”)
100. PostGIS: Eksempel
CREATE TABLE pubs (name VARCHAR, beer_price FLOAT4);
ADDGEOMETRYCOLUMN (‘beer_db’,'pubs','location’ ,2167,'POINT',3);
INSERT INTO pubs VALUES ('Garricks Head',4.50,GeometryFromText('POINT
(1196131 383324)’,2167));
SELECT name, beer_price,
DISTANCE(location, GeometryFromText('POINT(1195722 383854)',2167))
FROM pubs ORDER BY beer_price;
name | beer_price | distance
---------------+------------+------------------
Fireside | 4.25 | 1484.10275160491
The Forge | 4.33 | 1533.06561109862
Rumours | 4.46 | 2042.00094093097
Garricks Head | 4.5 | 669.389105609889
Slap Happy | 4.5 | 1882.31910168298
Old Bailys | 4.55 | 1147.20900404641
Black Sheep | 4.66 | 536.859935972633
Big Bad Daves | 4.75 | 907.446543878884
SELECT name, beer_price + 0.001 * DISTANCE(location,
GeometryFromText('POINT(1195722 383854)',2167))
AS net_price FROM pubs ORDER BY price;
name | net_price
---------------+------------------
Garricks Head | 5.16938910560989
Black Sheep | 5.19685978338474
Big Bad Daves | 5.65744654387888
Old Bailys | 5.69720919478127
Fireside | 5.73410275160491
The Forge | 5.86306553480468
Slap Happy | 6.38231910168298
Rumours | 6.50200097907794
107. Mailinglister & IRC
pgsql-admin
pgsql-advocacy
Et assortert utvalg mailinglister er tilgjengelig:
pgsql-announce
http://www.postgresql.org/community/lists/subscribe
Generelt høyt volum pgsql-bugs
Høy kompetanse
pgsql-docs
Strekker seg langt for å hjelpe
pgsql-general
pgsql-hackers
Arkiv tilgjengelig på:
pgsql-interfaces
http://archives.postgresql.org/
pgsql-jdbc
pgsql-novice
IRC: irc.freenode.net/#postgresql
pgsql-odbc
En unik kombinasjon av kompetanse og
imøtekommendehet
pgsql-performance
pgsql-php
pgsql-sql
108. Webressurser
http://techdocs.postgresql.org/
Tekniske artikler og ymse
General Bits av A. Elein Mustain
http://www.varlena.com/GeneralBits
Ukentlig oppsummering av pgsql-general-listen
PGSearch:
http://www.pgsql.ru/db/pgsearch
Søkemotor basert på PostgreSQL og TSearch2
109. pg_live
Knoppix-basert live-CD med PostgreSQL
Satt sammen av Robert Bernier
Nyeste versjon er 1.3.3, 8. februar 2005
http://www.sraapowergres.com +
/en/newsletter/issue_02/pg_live/pg_live.1.3.3.iso