PostgreSQL * *

decubitisannouncerΔιαχείριση Δεδομένων

27 Νοε 2012 (πριν από 4 χρόνια και 11 μήνες)

225 εμφανίσεις

PostgreSQL￿
￿Ⴚ￿￿￿Ⴒ￿
￿￿￿ѢӟѢӟ￿
￿﨑￿Ⴚ￿￿肋￿￿
￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Agenda
•PostgreSQL￿
•￿￿￿￿￿Ⴛ￿￿￿ӹ￿
•￿￿￿￿￿Ⴛ￿￿Ⴤ￿￿￿Ⴐ￿￿￿
￿￿ӹ￿￿￿￿
•￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿￿ӹ￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
PostgreSQL￿
•Ⴉ￿Ⴤ￿Ⴖ￿ႲRDBMS
–http://www.jp.postgresql.org/
–￿￿￿￿6￿￿￿￿￿￿￿14￿￿￿￿￿2￿
–RDBMS￿ס￿￿￿￿￿￿ӹ￿￿
–￿￿￿￿￿￿￿Oracle,MSSQLServer￿￿
–￿￿￿￿￿￿￿￿￿￿
–￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿RDBMS￿￿￿￿￿
￿￿￿￿
￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿
￿￿￿￿￿￿￿
￿￿￿￿￿
￿￿￿￿￿￿
￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿
￿￿￿￿￿
￿￿￿￿￿￿
￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
PostgreSQL￿￿￿
•￿Ⴤ￿￿￿Ⴐ￿￿￿￿￿￿￿￿￿￿
–￿￿Ⴀ￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿Ⴀ￿￿￿￿￿ႰႲႹ￿￿ס￿￿
–24ﵶNon-stopႰႲႹ￿￿￿￿￿￿
•￿Ⴚ￿￿￿Ⴒ￿￿￿￿
–Ѣ￿￿&￿￿￿Ⴚ￿￿￿Ⴒ￿￿￿￿
•PC￿￿Ⴒ￿￿Ⴣ￿￿ႼႮ￿￿￿￿￿
–Ⴒ￿￿￿￿ႥႻ
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿Ⴚ￿￿￿Ⴒ￿￿
•￿￿
–￿￿￿Ⴤ￿￿￿Ⴐ￿￿￿￿￿￿Ⴡ￿Ⴜ
￿￿￿￿￿￿￿￿Ⴚ￿￿￿ႲႰႲႹ￿
•￿￿￿
–￿Ⴡ￿Ⴜ￿￿￿￿Ⴚ￿￿￿Ⴒ￿
￿Ⴙ￿Ⴣ￿￿￿ﲝ￿￿￿￿Ⴛ￿￿
Ⴏ￿Ⴐ￿￿￿￿ס￿￿Ⴚ￿￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴚ￿￿￿Ⴒӹ￿￿
•￿￿Ⴡ￿Ⴜﵶ￿￿￿￿￿￿￿￿￿
￿ס￿
•Ⴛ￿￿Ⴏ￿Ⴐ￿￿ACID￿،
–Atomicity￿￿Ӕ،￿￿Consistency￿￿￿،￿￿
Isolation￿￿￿،￿￿Durability￿￿￿،￿

￿￿￿￿￿Ⴛ￿
2-
phasecommit
￿ӹ￿
–￿￿Ⴡ￿Ⴜﵶ￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿
￿￿￿￿￿Ⴛ￿￿￿ӹ￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿ႻჄ￿Ⴛ￿￿￿
•￿￿￿￿￿Ⴛ￿2-phasecommit￿Ⴤ￿Ⴛ￿￿
–￿￿Ⴡ￿Ⴜ￿Ⴚ￿￿￿Ⴒ￿￿
￿￿￿￿
–￿￿￿￿￿￿￿￿
–Ⴛ￿￿Ⴏ￿Ⴐ￿￿
Atomicity￿Consistensy
￿￿￿￿
￿￿￿￿
￿￿￿
￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿ႻჄ￿Ⴛ￿￿
CoordinatorParticipantAParticipantB
commit
ok.
pre-commit
pre-commit
prepared
readyready
commit
commit
ackack
log
log
log
log
log
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿ႻჄ￿Ⴛ￿￿
CoordinatorParticipantAParticipantB
commit
ok.
pre-commit
pre-commit
prepared
readyabort
abort
abort
ackack
log
log
log
log
log
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿￿￿Ⴛ￿Ⴚ￿￿￿Ⴛ
•￿￿￿Ⴛ
–￿￿￿
–ӹ￿￿￿
–￿Ⴊ￿￿￿￿
–Ⴉ￿Ⴤ￿￿Ⴒ￿￿￿￿Ⴜ￿X/OpenXA￿
•Ⴚ￿￿￿Ⴛ
–￿￿ﱯჁ￿Ⴜ￿￿ჂႨ￿￿Ⴒ￿￿￿￿
￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿￿￿ӹ￿
•￿￿￿￿￿Ⴛס￿￿￿￿
–Pre-commit߹ٌ￿￿￿￿￿
–Pre-commitlogging
–￿￿￿Ⴛ￿￿￿￿刺￿￿￿刺￿￿￿
–Ⴤ￿Ⴛ￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿￿￿ӹ￿
•Ⴛ￿￿Ⴏ￿Ⴐ￿￿߹ٌ￿￿￿
–TransactionState
•TRANS_DEFAULT,_START,_INPROGRESS,_COMMIT,
_ABORT,_PRECOMMIT,_PREPARED
–TransactionBlockState
•TBLOCK_DEFAULT,_BEGIN,_INPROGRESS,_END,
_ENDABORT,_ABORT,_PREPARED
–TransactionLog(XLOG)/CommitLog(CLOG)
•XLOG_XACT_REPRECOMMIT0x10
•TRANSACTION_STATUS_PRECOMMITTED0x02
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Ⴛ￿￿Ⴏ￿Ⴐ￿￿߹ٌ￿燎
TransactionBlockState
TransactionState
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿￿￿ӹ￿
•CommitTransaction()￿￿￿￿￿
–PreCommitTransaction()
–CommitTransaction()
•RecordTransactionPreCommit()ӹ￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿￿￿ӹ￿
PreCommitTransaction(void)
{
TransactionStates=CurrentTransactionState;
if(s->state!=TRANS_INPROGRESS)
elog
(WARNING,"
PreCommitTransaction
andnotinin-progressstate");
DeferredTriggerEndXact();
HOLD_INTERRUPTS();
s->state=TRANS_PRECOMMIT;
lo_commit(true);
AtCommit_Notify();
AtEOXact_portals();
Re
cordTransactionPreCommit
();
s->state=TRANS_COMMIT_READY;
RESUME_INTERRUPTS();
elog(LOG,"PreCommitTransactiondone.xid=%x",s->transactionIdData);
}
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿￿￿ӹ￿
CommitTransaction(void)
{
TransactionStates=CurrentTransactionState;
if(s->state!=TRANS_COMMIT_READY)
elog
(WARNING,"notincommit-readystate");
HOLD_INTERRUPTS();
s->state=TRANS_COMMIT;
RecordTransactionCommit
();
if(MyProc!=(PGPROC*)NULL)
{
LWLockAcquire(SInvalLock,LW_EXCLUSIVE);
MyProc->xid=InvalidTransactionId;
MyProc->xmin=InvalidTransactionId;
LWLockRelease(SInvalLock);
}
smgrDoPendingDeletes(true);
AtEOXact_GUC(true);
AtEOXact_SPI();
AtEOXact_gist();
AtEOXact_hash();
AtEOXact_nbtree();
AtEOXact_rtree();
AtEOXact_Namespace(true);
AtCommit_Cache();
AtCommit_Locks();
AtEOXact_CatCache(true);
AtCommit_Memory();
AtEOXact_Buffers(true);
smgrabort();
AtEOXact_Files();
pgstat_count_xact_commit();
s->state=TRANS_DEFAULT;
RESUME_INTERRUPTS();
elog(LOG,"CommitTransactiondone.xid=%x",s->transactionIdData);
}
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿￿Ⴛ￿
•￿￿
•￿￿
CommitTransaction()
RecordTransactionCommit()
INPROGRESS
PreCommitTransaction()
DEFAULT
RecordTransactionPreCommit()
PREPARED
CommitTransaction()
RecordTransactionCommit()
INPROGRESS
DEFAULT
￿Ⴤ￿￿￿Ⴐ￿￿￿￿￿ӹ￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴤ￿￿￿Ⴐ￿￿￿︓
•￿Ⴇ￿￿SQL￿
–SQL￿￿￿￿Ⴡ￿Ⴜ￿￿￿
•￿￿￿Ⴜ￿Ⴚ￿Ⴒ￿I/O
–I/O￿￿￿￿￿￿￿￿￿￿
•Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿
–￿￿￿￿Ԉ￿￿

￿￿￿Ⴐ￿￿刺
SQLstring
Record
PageFile
Trans.Log
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴤ￿￿￿Ⴐ￿￿￿￿
￿￿￿￿
Ack.
Master
Slave
COMMIT
￿￿
PRECOMMIT
￿
COMMIT
￿￿￿
COMMIT
￿
Ack.
COMMIT
PRECOMMIT
￿￿￿￿
App.
Ack.
Ack.
COMMIT
UPDATE
UPDATE
UPDATE
￿￿￿￿
SELECT
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴤ￿￿￿Ⴐ￿￿￿￿
SQLstring
Record
PageFile
Trans.Log
SQLstring
Parsetree
Querytree
Plan
Parser
Analyzer&Rewriter
Planner
Executor
Querytree
Plan
Analyzer&Rewriter
Planner
Executor
Parser
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴇ￿￿￿￿￿Ⴤ￿￿￿Ⴐ￿￿
•￿￿￿Ⴛ
–￿￿￿Ⴐ￿Ⴤ￿￿ӹ￿￿￿￿
•Ⴚ￿￿￿Ⴛ
–Ⴡ￿Ⴜ￿￿￿￿￿￿￿￿￿SQLﵺ￿￿
￿CURRENT_TIMESTAMP,rand()￿￿￿
–Ⴡ￿Ⴜﵶsequence￿￿،
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Ⴤ￿Ⴛ￿￿￿￿
‘Q’begin;
Coordinator
Participant
‘C’BEGIN
‘Z’(readyforquery)
‘Q’insertintot1values(256);
‘C’INSERT
‘Z’(readyforquery)
‘Q’commit;
‘L’COMMIT
‘Z’(readyforquery)
‘C’COMMIT
‘L’COMMIT
ExtendedFE/BE
protocol
Pre-commitand
answerready
SendcommitCommit
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴤ￿￿￿Ⴐ￿￿ӹ￿
pg_exec_query_string()
finish_xact_command()
CommitTransactionCommand()
{DEFAULT|INPROGRESS}
PreCommitTransaction()
PrepareReplica()
pg_exec_query_string()
finish_xact_command()
CommitTransactionCommand()
PreCommitTransaction()
finish_xact_command()
CommitTransactionCommand()
{PREPARED}
PreCommitTransaction()
CommitReplica()
CommitTransactionCommand()
CommitTransaction()
[1stphase]
[2ndphase]
PostgresMain()
PostgresMain()
‘Q’commit;
‘L’COMMIT
‘L’COMMIT
‘C’COMMIT
RecordReplicaPrepared()
RecordReplicaCommitted()
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿ჂႨ￿￿Ⴒ￿￿
•10,000￿UPDATE￿￿￿￿￿
CREATETABLEt1(uidintegerprimarykey,countinteger);
INSERTINTOt1VALUES(1,0);
UPDATEt1SETcount=0WHEREuid=1;
UPDATEt1SETcount=1WHEREuid=1;
UPDATEt1SETcount=2WHEREuid=1;

UPDATEt1SETcount=9998WHEREuid=1;
UPDATEt1SETcount=9999WHEREuid=1;
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿ჂႨ￿￿Ⴒ￿￿
•UPDATE10,000￿
•COMMIT10,000￿&1￿
￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿
￿￿￿￿
￿￿￿￿￿￿￿
￿￿￿￿￿￿
￿￿￿￿
￿￿￿
￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Ⴛ￿Ⴠ￿￿￿￿﨑
•￿Ⴡ￿Ⴜ￿Pre-commitႰ￿￿￿Ⴒ
Pre-commit
(I/O)
Pre-commit
(I/O)
MasterSlave
Pre-commit
(I/O)
Pre-commit
(I/O)
MasterSlave
Ⴒ￿￿Ⴜ￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴤ￿￿￿Ⴐ￿￿￿
•￿￿￿￿￿Ⴛ￿￿Ⴤ￿￿￿Ⴐ￿￿ӹ
￿￿
•￿ჂႨ￿￿Ⴒ￿￿￿
–Loggingӹ￿￿￿￿￿￿￿
•￿￿￿￿￿ႻႧ￿￿￿Ⴊ￿￿￿￿Ⴒ￿￿Ⴛ￿
ӹ￿￿￿ס￿
￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿￿ӹ￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿
•￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿
–Ⴚ￿￿￿￿￿Ⴎ￿Ⴛ￿Ⴡ￿Ⴜ￿Ⴛ
￿￿Ⴏ￿Ⴐ￿￿
–Ⴛ￿￿Ⴏ￿Ⴐ￿￿ACID￿،
–ﱿ￿￿DB￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿
￿￿
︘￿￿
￿￿￿
￿￿￿￿
￿￿￿￿
￿￿
￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿
•￿
–Ѣ￿￿￿￿￿т￿￿￿￿￿￿￿￿
￿￿￿￿￿т￿￿￿￿￿
BEGIN;
SELECTitemIdFROMzaiko@osakaWHEREnumItem<10;
IF(SELECTnumItemFROMzaiko@nagoyaWHEREitemId=id)>100
INSERTINTOorder@nagoya(itemId,number)
VALUES(id,100);
ELSE
INSERTINTOorder@tokyo(itemId,number)
VALUES(id,100);
COMMIT;
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿￿ӹ￿
•￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿ӹ￿￿ס￿￿￿￿
–Executor￿Ⴠ￿Ⴛ￿￿￿￿￿￿￿￿￿ႻႮ￿Ⴛ
Ⴙ￿Ⴣ￿￿￿Ⴚ￿￿Ⴒ￿￿￿Ⴜ￿￿￿￿￿
￿￿Ⴛ￿￿￿RPC￿￿￿
–Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿،￿A￿￿￿￿،￿C￿
•￿￿￿￿￿Ⴛ￿￿
–Ⴚ￿￿￿ﲝ￿﬌ٚ￿ႩჄႹ￿￿Ⴏ
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿￿ӹ￿
SQLstring
Record
PageFile
Trans.Log
SQLstring
Parsetree
Querytree
Plan
Parser
Analyzer&Rewriter
Planner
Executor
Analyzer&Rewriter
Planner
Executor
Parser
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Parser￿￿
•Ⴙ￿Ⴣ￿￿￿￿￿￿￿￿￿￿￿￿￿Ԉ
–SELECT*FROMt1,t2@linkWHERE…
–RangeVar￿ﱟ￿￿Ⴙ￿Ⴣ￿￿￿Ⴚ￿￿￿ﱟ￿
￿￿￿￿￿￿￿￿Analyze&Rewrite￿
t2
HostB
t1
HostA
link
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿ႴႲ￿Ⴖ￿ႼRPC
•￿￿Ⴤ￿￿￿ႴႲ￿Ⴖ￿ႼRPC￿
–relation_openrv()￿RPC_relation_openrv()
•ႩჃႱႦ￿Ⴛ￿￿ﱟ￿￿Ⴐ￿￿￿￿Ⴓ
–￿￿￿￿￿￿Ⴣ￿￿￿￿￿￿
–SerializeXXX(),DeserializeXXX()
•Ⴐ￿￿￿￿Ⴓ￿ႩჃႱႦ￿Ⴛ￿￿
–RPC_FunctionCall()
–Executorﵶ￿ﱚ￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Ⴐ￿￿￿￿Ⴓ￿￿￿ﱚ￿
relation_openrv()
RPC_FunctionCall()
relation_openrv()
RPC_Receive()
SerializeXXX()
DeserializeXXX()
Local
Remote
SerializeXXX()
heap_openrv()
RPC_relation_openrv()
DeserializeXXX()
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
ႩჃႱႦ￿ႻID￿￿￿ﱚ￿
￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿
relation_openrv()
RPC_FunctionCall()
relation_openrv()
RPC_Receive()
Local
Remote
heap_openrv()
RPC_relation_openrv()
Poiner
(dummy)
Pointer
(dummy)
ObjectId
￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿
Pointer
(real)
Pointer
(real)
Pointer
(real)
Poiner
(dummy)
Poiner
(dummy)
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
ႩჄႹ￿￿Ⴏ
•￿喇￿
–￿￿￿￿￿￿￿￿Ⴕ￿￿￿￿￿￿
–￿﷧ႩჄႹ￿￿Ⴓ￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿
•Parser￿￿￿￿￿￿
•RPC￿￿ႴႲ￿Ⴖ￿Ⴜӹ￿￿
–￿￿￿API￿￿￿￿￿￿￿Ԕ￿￿…￿￿￿
￿￿RPC￿￿￿￿￿
–￿Ⴤ￿￿￿Ⴐ￿￿￿￿
•Ⴐ￿￿￿￿Ⴓ￿￿￿
–￿￿Ⴝ￿￿￿￿￿￿￿￿￿￿￿﷤￿￿џ
–￿￿￿￿ႲႻ￿ﱟ￿﷤￿￿џ
￿￿￿￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿￿￿￿RewriteRule￿
•￿￿￿￿￿￿￿Ⴇ￿￿￿￿
–CREATERULErule_nameASONevent
–TOobject[WHERErule_qualification]
–DO[INSTEAD][action|(actions)|NOTHING];
•￿Ⴛ￿￿Ⴏ￿Ⴐ￿￿￿￿￿Ⴚ￿￿ﲝ
￿￿￿￿￿￿￿￿￿
Rule
INSERTINTOt1VALUES(…)
INSERTINTOt2VALUES(…)
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
Ⴙ￿Ⴣ￿￿￿Ⴙ￿Ⴐ￿Ⴞ￿￿
ifuid<50000thenDB1
elseDB2
DB1
SELECT…
WHEREuid=50023
UPDATE…
WHEREuid=47015
DB2
￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿
￿
￿
￿
￿￿￿￿￿
￿￿￿￿￿
￿￿￿￿￿
￿￿￿￿￿
￿￿￿￿￿
￿
–Ѣ￿￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
ﮀ￿￿￿Ⴖ￿Ⴒ￿￿￿Ⴐ￿￿
•￿￿߹￿￿￿Ⴒ￿Ⴒ￿￿￿￿ႲႻ￿￿Ⴑ߹
￿￿￿￿￿￿Ⴚ￿￿ﲝ￿￿￿
–Ⴚ￿￿ﲝ￿￿￿￿￿￿￿￿￿￿+￿￿
￿￿￿￿
–￿￿￿￿￿ႴႲ￿￿￿￿￿т￿￿￿￿￿
2003/01/09
刺
44￿￿￿￿￿￿￿￿￿
￿ﰥ
•IPA￿￿￿￿Ⴒ￿PostgreSQL￿￿
Ⴚ￿￿￿Ⴒ￿￿
•￿￿PostgreSQL￿￿Ⴏ￿￿￿￿Ⴛ￿￿Ⴏ
￿Ⴐ￿￿￿￿￿￿
￿