From: branch-fixup Date: Wed, 21 Feb 2007 16:42:36 +0000 (+0000) Subject: Add files from parent branch HEAD: X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=ff589f94a05b324f4e04f27f95e596dfe6f46bff;p=users%2Fbernd%2Fpostgres.git Add files from parent branch HEAD: doc/FAQ_chinese_simp doc/FAQ_chinese_trad doc/src/FAQ/FAQ_chinese_simp.html doc/src/FAQ/FAQ_chinese_trad.html --- diff --git a/doc/FAQ_chinese_simp b/doc/FAQ_chinese_simp new file mode 100644 index 0000000000..fde161fa10 --- /dev/null +++ b/doc/FAQ_chinese_simp @@ -0,0 +1,801 @@ + + PostgreSQL 常è§é®é¢ï¼FAQï¼ + + æè¿æ´æ°ï¼2007 å¹´ 1 æ 30 æ¥ ææäº 17:37:01 EST + 䏿çæè¿æ´æ°ï¼2007 å¹´ 2 æ 1 æ¥ ææå 12:55:04 CST + + ç®åç»´æ¤äººåï¼Bruce Momjian (pgman@candle.pha.pa.us) + 䏿çç»´æ¤äººåï¼Daojing.Zhouï¼doudou586@gmail.comï¼ + + æ¬ææ¡£çææ°çæ¬å¯ä»¥å¨ + http://www.postgresql.org/files/documentation/faqs/FAQ.htmlæ¥çã + + 䏿ä½ç³»ç»å¹³å°ç¸å³çé®é¢å¯å¨http://www.postgresql.org/docs/faq/éæ¾å°ç­ + æ¡ã + _________________________________________________________________ + +常è§é®é¢ + + 1.1)PostgreSQL æ¯ä»ä¹ï¼è¯¥æä¹åé³ï¼ + 1.2)è°æ§å¶å管çPostgreSQL ï¼ + 1.3)PostgreSQLççææ¯ä»ä¹ï¼ + 1.4)PostgreSQLå¯ä»¥è¿è¡å¨åªäºæä½ç³»ç»å¹³å°ä¸ï¼ + 1.5)æä»åªéè½å¾å°PostgreSQLï¼ + 1.6)ææ°ççPostgreSQL æ¯ä»ä¹ï¼ + 1.7)æä»åªéè½å¾å°å¯¹PostgreSQL çæ¯æï¼ + 1.8)æå¦ä½æäº¤ä¸ä¸ªBUGæ¥åï¼ + 1.9)æå¦ä½äºè§£å·²ç¥ç BUG ææç¼ºçåè½ï¼ + 1.10)è½å¤è·åçææ°ææ¡£æåªäºï¼ + 1.11)æåºè¯¥ææ ·å¦ä¹ SQL ï¼ + 1.12)å¦ä½æäº¤è¡¥ä¸ææ¯å å¥å¼åéä¼ï¼ + 1.13)PostgreSQL åå¶ä»æ°æ®åºç³»ç»æ¯èµ·æ¥å¦ä½ï¼ + 1.14)PostgreSQL å¯ä»¥å¤çæè¿å个å½å®¶å¤æ¶å¶çåååï¼ + +ç¨æ·å®¢æ·ç«¯é®é¢ + + 2.1)æä»¬å¯ä»¥ç¨ä»ä¹è¯è¨åPostgreSQL æäº¤éï¼ + 2.2)æä»ä¹å·¥å·å¯ä»¥æPostgreSQL ç¨äº Web 页é¢ï¼ + 2.3)PostgreSQL æ¥æå¾å½¢ç¨æ·çé¢åï¼ + +ç³»ç»ç®¡çé®é¢ + + 3.1)æææ ·æè½æPostgreSQL è£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼ + 3.2)æå¦ä½æ§å¶æ¥èªå¶ä»çµèçè¿æ¥ï¼ + 3.3)æææ ·è°æ´æ°æ®åºæå¡å¨ä»¥è·å¾æ´å¥½çæ§è½ï¼ + 3.4)PostgreSQL éå¯ä»¥è·å¾ä»ä¹æ ·çè°è¯ç¹æ§ï¼ + 3.5)为ä»ä¹å¨è¯å¾è¿æ¥ç»å½æ¶æ¶å°âSorry, too many clientsâ æ¶æ¯ï¼ + 3.6)PostgreSQLçå级è¿ç¨æåªäºåå®¹ï¼ + 3.7)(使ç¨PostgreSQL)æéè¦ä½¿ç¨ä»ä¹è®¡ç®æºç¡¬ä»¶ ï¼ + +æä½é®é¢ + + 4.1) å¦ä½åªéæ©ä¸ä¸ªæ¥è¯¢ç»æç头å è¡ï¼ææ¯éæºçä¸è¡ï¼ + 4.2) + å¦ä½æ¥ç表ãç´¢å¼ãæ°æ®åºä»¥åç¨æ·çå®ä¹ï¼å¦ä½æ¥çpsqléç¨å°çæ¥è¯¢æä»¤å¹¶æ¾ç + ¤ºå®ä»¬ï¼ + 4.3) å¦ä½æ´æ¹ä¸ä¸ªåæ®µçæ°æ®ç±»åï¼ + 4.4) åæ¡è®°å½ï¼å个表ï¼ä¸ä¸ªæ°æ®åºçæå¤§éå¶æ¯å¤å°ï¼ + 4.5) åå¨ä¸ä¸ªå¸åçææ¬æä»¶éçæ°æ®éè¦å¤å°ç£ç空é´ï¼ + 4.6) 为ä»ä¹æçæ¥è¯¢å¾æ¢ï¼ä¸ºä»ä¹è¿äºæ¥è¯¢æ²¡æå©ç¨ç´¢å¼ï¼ + 4.7) æå¦ä½æè½çå°æ¥è¯¢ä¼å卿¯ææ ·è¯ä¼°å¤çæçæ¥è¯¢çï¼ + 4.8) æææ ·åæ£åè¡¨è¾¾å¼æç´¢å大å°åæ å³çæ­ + £åè¡¨è¾¾å¼æ¥æ¾ï¼ææ ·å©ç¨ç´¢å¼è¿è¡å¤§å°åæ 峿¥æ¾ï¼ + 4.9) å¨ä¸ä¸ªæ¥è¯¢éï¼æææ ·æ£æµä¸ä¸ªå段æ¯å¦ä¸º + NULLï¼æå¦ä½æè½åç¡®æåºèä¸è®ºæå段æ¯å¦å«NULLå¼ï¼ + 4.10) åç§å符类åä¹é´æä»ä¹ä¸åï¼ + 4.11.1) æææ ·å建ä¸ä¸ªåºåå·åææ¯èªå¨éå¢çåæ®µï¼ + 4.11.2) æå¦ä½è·å¾ä¸ä¸ªæå¥çåºåå·çå¼ï¼ + 4.11.3) åæ¶ä½¿ç¨ currval() ä¼å¯¼è´åå¶ä»ç¨æ·çå²çªæåµåï¼ + 4.11.4) 为ä»ä¹ä¸å¨äºå¡å¼å¸¸ä¸æ¢åéç¨åºåå·å¢ï¼ä¸ºä»ä¹å¨åºåå·å段çåå¼ä¸­ + åå¨é´æå¢ï¼ + 4.12) ä»ä¹æ¯ OIDï¼ä»ä¹æ¯ CTID ï¼ + 4.13) 为ä»ä¹ææ¶å°é误信æ¯âERROR: Memory exhausted in + AllocSetAlloc()âï¼ + 4.14) æå¦ä½æè½ç¥éæè¿è¡ç PostgreSQL ççæ¬ï¼ + 4.15) æå¦ä½å建ä¸ä¸ªç¼ºç弿¯å½åæ¶é´çåæ®µï¼ + 4.16) å¦ä½æ§è¡å¤è¿æ¥ï¼outer joinï¼æ¥è¯¢ï¼ + 4.17) å¦ä½æ§è¡æ¶åå¤ä¸ªæ°æ®åºçæ¥è¯¢ï¼ + 4.18) å¦ä½è®©å½æ°è¿åå¤è¡æå¤åæ°æ®ï¼ + 4.19) 为ä»ä¹æå¨ä½¿ç¨PL/PgSQL彿°åå临æ¶è¡¨æ¶ä¼æ¶å°é误信æ¯ârelation + with OID ##### does not existâï¼ + 4.20) ç®åæåªäºæ°æ®å¤å¶æ¹æ¡å¯ç¨ï¼ + 4.21) ä¸ºä½æ¥è¯¢ç»ææ¾ç¤ºç表åæååä¸æçæ¥è¯¢è¯å¥ä¸­ + çä¸åï¼ä¸ºä½å¤§åç¶æä¸è½ä¿çï¼ + _________________________________________________________________ + +常è§é®é¢ + + 1.1)PostgreSQL æ¯ä»ä¹ï¼è¯¥æä¹åé³ï¼ + + PostgreSQL è¯»ä½ Post-Gres-Q-Lï¼ææ¶åä¹ç®ç§°ä¸ºPostgres + ãæ³å¬ä¸ä¸å¶åé³ç人åå¯ä»è¿éä¸è½½å£°é³æä»¶ï¼ MP3 æ ¼å¼ ã + + PostgreSQL + æ¯é¢åç®æ çå³ç³»æ°æ®åºç³»ç»ï¼å®å·æä¼ ç»å䏿°æ®åºç³»ç»çææåè½ï¼åæ¶å嫿å°å + ¨ä¸ä¸ä»£ DBMS ç³»ç»ç使ç¨çå¢å¼ºç¹æ§ãPostgreSQL + æ¯èªç±åè´¹çï¼å¹¶ä¸æææºä»£ç é½å¯ä»¥è·å¾ã + + PostgreSQL + çå¼åéä¼ä¸»è¦ä¸ºå¿æ¿èï¼ä»ä»¬éå¸ä¸çåå°å¹¶éè¿äºèç½è¿è¡èç³»ï¼è¿æ¯ä¸ä¸ªç¤¾å + ºå¼å项ç®ï¼å®ä¸è¢«ä»»ä½å¬å¸æ§å¶ã + 妿³å å¥å¼åéä¼ï¼è¯·åè§å¼å人å常è§é®é¢ï¼FAQï¼ + http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html + + 1.2) è°æ§å¶PostgreSQL ï¼ + + å¦æä½ å¨å¯»æ¾PostgreSQLçæé¨äººï¼ææ¯ä»ä¹ä¸­ + 央å§åä¼ï¼ææ¯ä»ä¹æå±å¬å¸ï¼ä½ åªè½æ¾å¼äº---å 为ä¸ä¸ªä¹ä¸å­ + å¨ï¼ä½æä»¬çç¡®æä¸ä¸ª + æ ¸å¿å§åä¼åCVS管çç»ï¼ä½è¿äºå·¥ä½ç»ç设ç«ä¸»è¦æ¯ä¸ºäºè¿è¡ç®¡çå·¥ä½è䏿 + ¯å¯¹PostgreSQLè¿è¡ç¬å 弿§å¶ï¼PostgreSQLé¡¹ç®æ¯ç±ä»»ä½äººå + å¯åå çå¼å人å社åºåææç¨æ·æ§å¶çï¼ä½ æéè¦åçå°±æ¯è®¢éé®ä»¶å表ï¼åä¸è®¨è®º + å³å¯ï¼è¦åä¸PostgreSQLçå¼åè¯¦è§ å¼å人å常é®é¢ (Developer's FAQ) + è·åä¿¡æ¯ï¼ã + + 1.3)PostgreSQLççææ¯ä»ä¹? + + PostgreSQLçåå¸éµä»ç»å¸çBSDçæãå®åè®¸ç¨æ·ä¸éç®çå°ä½¿ç¨PostgreSQLï¼çè³ä½ + å¯ä»¥éå®PostgreSQLèä¸å«æºä»£ç ä¹å¯ä»¥ï¼å¯ä¸çéå¶å°±æ¯ä½ ä¸è½å 软件èªè + º«é®é¢èåæä»¬è¿½è¯æ³å¾è´£ä»»ï¼å¦å¤å°±æ¯è¦æ±ææç软件æ·è´ä¸­ + 须忬以ä¸çæå£°æãä¸é¢å°±æ¯æä»¬æä½¿ç¨çBSDçæå£°æåå®¹ï¼ + + PostgreSQLæ°æ®åºç®¡çç³»ç» + + é¨åçæï¼cï¼1996-2005ï¼PostgreSQL å¨çå¼åå°ç»ï¼é¨åçæï¼cï¼1994-1996 + å å·å¤§å¦è£äº + + ï¼Portions copyright (c) 1996-2005,PostgreSQL Global Development Group + Portions Copyright (c) 1994-6 Regents of the University of + Californiaï¼ + + å许为任ä½ç®ç使ç¨ï¼æ·è´ï¼ä¿®æ¹åååè¿ä¸ªè½¯ä»¶åå®çææ¡£è䏿¶åä»»ä½è´¹ç + ¨ï¼ 并䏿 é¡»ç¾ç½²å æ­ + ¤è产ççè¯æï¼åææ¯ä¸é¢ççæå£°æåæ¬æ®µä»¥åä¸é¢ä¸¤æ®µæååºç°å¨æææ·è´ä¸ã + + ï¼Permission to use, copy, modify, and distribute this software and + its documentation for any purpose, without fee, and without a written + agreement is hereby granted, provided that the above copyright notice + and this paragraph and the following two paragraphs appear in all + copies.ï¼ + + å¨ä»»ä½æåµä¸ï¼å å·å¤§å¦é½ä¸æ¿æå ä½¿ç¨æ­ + ¤è½¯ä»¶åå¶ææ¡£è导è´ç对任ä½å½äºäººçç´æ¥çï¼ + é´æ¥çï¼ç¹æ®çï¼éå çæèç¸ä¼´èççæåï¼åæ¬å©çæå¤±ç责任ï¼å³ä½¿å å·å¤§å­ + ¦å·²ç»å»ºè®®äºè¿äºæå¤±çå¯è½æ§æ¶ä¹æ¯å¦æ¤ã + + ï¼IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY + PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA + HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.ï¼ + + å å·å¤§å¦æç¡®æ¾å¼ä»»ä½ä¿è¯ï¼åæ¬ä½ä¸å±éäºæä¸ç¹å®ç¨éçåä¸åå©ççéå«ä¿è¯ã + è¿éæä¾çè¿ä»½è½¯ä»¶æ¯åºäºâå½ä½æ¯âçåºç¡çï¼å èå å·å¤§å­ + ¦æ²¡æè´£ä»»æä¾ç»´æ¤ï¼æ¯æï¼æ´æ°ï¼å¢å¼ºæèä¿®æ¹çæå¡ã + + ï¼THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF + CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, + UPDATES, ENHANCEMENTS, OR MODIFICATIONS.ï¼ + + 1.4)PostgreSQL å¯ä»¥è¿è¡å¨åªäºæä½ç³»ç»å¹³å°ä¸ï¼ + + ä¸è¬è¯´æ¥ï¼ä»»ä½ç°å¨å¯¹ UNIX å¼å®¹çæä½ç³»ç»ä¹ä¸é½è½è¿è¡PostgreSQL + ãå¨å®è£æåéååºäºå叿¶ç»è¿æç¡®æµè¯çå¹³å°ã + + PostgreSQlä¹å¯ä»¥ç´æ¥è¿è¡å¨åºäºå¾®è½¯Windows-NTçæä½ç³»ç»ï¼å¦Win2000 + SP4ï¼WinXP å Win2003ï¼å·²å¶ä½å®æçå®è£åå¯ä» + http://pgfoundry.org/projects/pginstallerä¸è½½ï¼åºäºMSDOSçWindowsæä½ç³ + »ç» ï¼Win95ï¼Win98ï¼WinMeï¼éè¦éè¿Cygwin模æç¯å¢è¿è¡PostgreSQLã + + 忶乿ä¸ä¸ªä¸ºNovell Netware 6å¼åççæ¬å¯ä» + http://forge.novell.comè·åï¼ä¸ºOS/2(eComStation)å¼åççæ¬å¯ä» + http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre + SQL&stype=all&sort=type&dir=%2F ä¸è½½ã + + 1.5) æä»åªéè½å¾å°PostgreSQLï¼ + + éè¿æµè§å¨å¯ä»http://www.postgresql.org/ftp/ä¸è½½ï¼ä¹å¯éè¿FTPï¼ä» + ftp://ftp.PostgreSQL.org/pub/ç«ç¹ä¸è½½ã + + 1.6) ææ°ççPostgreSQLæ¯ä»ä¹ï¼ + + PostgreSQL ææ°ççæ¬æ¯çæ¬ 8.2.1 ã + + æä»¬è®¡åæ¯å¹´åå¸ä¸ä¸ªä¸»è¦åçº§çæ¬ï¼æ¯å 个æåå¸ä¸ä¸ªå°çæ¬ã + + 1.7) æä»åªéè½å¾å°å¯¹PostgreSQLçæ¯æï¼ + + PostgreSQL社åºéè¿é®ä»¶å表为å¶å¤§å¤æ°ç¨æ·æä¾å¸®å©ï¼è®¢éé®ä»¶å表ç主 + ç«ç¹æ¯ + http://www.postgresql.org/community/lists/ï¼ä¸è¬æåµä¸ï¼åå å¥General æ + Bugé®ä»¶å表æ¯ä¸ä¸ªè¾å¥½çå¼å§ã + + 主è¦çIRCé¢éæ¯å¨FreeNode(irc.freenode.net)ç#postgresqlï¼ä¸ºäºè¿ä¸æ­ + ¤é¢éï¼å¯ä»¥ä½¿ç¨UNIXç¨åºircï¼å¶æä»¤æ ¼å¼ï¼ irc -c '#postgresql' + "$USER" irc.freenode.net ï¼æè使ç¨å¶ä»IRC客æ·ç«¯ç¨åºã卿¤ç½ç»ä¸è¿å­ + å¨ä¸ä¸ªPostgreSQLç西ççé¢é(#postgersql-es)åæ³è¯é¢é + (#postgresql-fr)ãåæ ·å°ï¼å¨EFNETä¸ä¹æä¸ä¸ªPostgreSQLç交æµé¢éã + + 坿ä¾å䏿¯æçå¬å¸å表å¯å¨http://techdocs.postgresql.org/companies.phpæµ + è§ã + + 1.8) æå¦ä½æäº¤ä¸ä¸ªBUGæ¥åï¼ + + å¯è®¿é® + http://www.postgresql.org/support/submitbugï¼å¡«åBug䏿¥è¡¨æ ¼å³å¯ï¼åæ + ·ä¹å¯è®¿é®ftpç«ç¹ftp://ftp.PostgreSQL.org/pub/ + æ£æ¥ææ æ´æ°çPostgreSQLçæ¬æè¡¥ä¸ã + + éè¿ä½¿ç¨Bugæäº¤è¡¨æ ¼ææ¯åå¾PostgreSQLé®ä»¶å表çBugé叏伿以ä¸ä¹ä¸åå¤ï + ¼ + * ææäº¤å容䏿¯ä¸ä¸ªBugåå¶ä¸æ¯Bugçåå ã + * ææäº¤å容æ¯ä¸ä¸ªå·²ç¥çBugå¹¶ä¸å·²ç»å å¥TODOå¾å¤çä»»å¡å表ã + * ææäº¤çBugå·²å¨å½åçæ¬ä¸è¢«ä¿®æ£ã + * ææäº¤çBug已修æ£ä½å°æªå°è¡¥ä¸å å¥ç°å¨çåå¸è½¯ä»¶åã + * è¯·æ±æäº¤èæä¾æ´è¯¦ç»çä¿¡æ¯ï¼ + + æä½ç³»ç» + + PostgreSQLçæ¬ + + å¯éç°Bugçæµè¯æ¡ä¾ + + è°è¯ä¿¡æ¯ + + è°è¯è·è¸ªè¾åº + * ææäº¤å容æ¯ä¸ä¸ªæ°Bugï¼å°æ§è¡ä»¥ä¸å·¥ä½ï¼ + + å建ä¸ä¸ªæ°è¡¥ä¸å¹¶å°å¶å å¥ä¸ä¸ä¸ªä¸»è¦çæ¬ææ¯å°çæ¹è¿çæ¬ä¸ã + + æ¤Bugææ¶ä¸è½ä¿®æ£ï¼å°è¢«å è³TODOå¾å¤çä»»å¡å表ã + + 1.9) æå¦ä½äºè§£å·²ç¥ç BUG ææç¼ºçåè½ï¼ + + PostgreSQL æ¯æä¸ä¸ªæ©å±ç SQL:2003 çåéãåéæä»¬çTODO + å表ï¼äºè§£å·²ç¥Bugå表ãæç¼ºçåè½åå°æ¥çå¼å计åã + + è¦æ±å¢å æ°åè½çç³è¯·é叏伿¶å°ä»¥ä¸ä¹ä¸çåå¤ï¼ + * 该åè½å·²å å¥TODOå¾å¤çä»»å¡å表ã + * 该åè½ä¸æ¯å¿é¡»çï¼å ä¸ºï¼ + + 宿¯ç°æçä¸ç¬¦åSQLæ åçæåè½çéå¤ã + + 该åè½æ§ä¼å¤§å¤§å¢å 代ç ç夿ç¨åºï¼è带æ¥ç好夿¯å¾®ä¸è¶³éçã + + 该åè½æ¯ä¸å®å¨ææ¯ä¸å¯é çã + * 该åè½å°è¢«å å¥TODOå¾å¤çä»»å¡å表ã + + PostgreSQLä¸ä½¿ç¨Bugè·è¸ªç³»ç»ï¼å 为æä»¬åç°å¨é®ä»¶å表中 + ç´æ¥åå¤ä»¥åä¿è¯TODOä»»å¡åè¡¨æ»æ¯å¤äºææ°ç¶æçæ¹å¼å·¥ä½æç伿´é«ä¸äºãäºå®ä + ¸ï¼Bugä¸ä¼å¨æä»¬ç软件ä¸åå¨å¾é¿æ¶é´ï¼ + 对影åå¾å¤ç¨æ·çBug乿»æ¯å¾å¿«ä¼è¢«ä¿®æ£ãå¯ä¸è½æ¾å°æææ¹è¿ãæé«åä¿®æ­ + £çå°æ¹æ¯CVSçæ¥å¿ä¿¡æ¯ï¼å³ä½¿æ¯å¨è½¯ä»¶æ°çæ¬çåå¸ä¿¡æ¯ä¸­ + ä¹ä¸ä¼ååºæ¯ä¸å¤çè½¯ä»¶æ´æ°ã + + 1.10) è½å¤è·åçææ°ææ¡£æåªäºï¼ + + PostgreSQLåå«å¤§éçææ¡£ï¼ä¸»è¦æè¯¦ç»çåèæåï¼æå页åä¸äºçæµè¯ä¾åãåè§ /doc + ç®å½ï¼è¯æ³¨ï¼åºä¸º $PGHOME/docï¼ã + ä½ è¿å¯ä»¥å¨çº¿æµè§PostgreSQLçæåï¼å¶ç½åæ¯ï¼http://www.PostgreSQL.org/d + ocsã + + æä¸¤æ¬å³äºPostgreSQLç书å¨çº¿æä¾ï¼å¨ + http://www.PostgreSQL.org/docs/awbook.html å + http://www.commandprompt.com/ppbook/ ã 乿大éçPostgreSQL书ç±å¯ä¾è´­ + ä¹°ï¼å¶ä¸æä¸ºæµè¡ç䏿¬æ¯ç±Korry Douglasç¼åçãå¨ + http://techdocs.PostgreSQL.org/techdocs/bookreviews.phpä¸ + 䏿大éæå³PostgreSQL书ç±çç®ä»ã å¨ + http://techdocs.PostgreSQL.org/䏿¶éäºæå³PostgreSQLç大鿿¯æç« ã + + 客æ·ç«¯çå½ä»¤è¡ç¨åºpsqlæä¸äºä»¥ \d + å¼å¤´çå½ä»¤ï¼å¯æ¾ç¤ºå³äºç±»åï¼æä½ç¬¦ï¼å½æ°ï¼èåçä¿¡æ¯ï¼ä½¿ç¨ \? + å¯ä»¥æ¾ç¤ºææå¯ç¨çå½ä»¤ã + + æä»¬ç web ç«ç¹å嫿´å¤çææ¡£ã + + 1.11) æåºè¯¥ææ ·å¦ä¹ SQL ï¼ + + é¦åèèä¸è¿°æå°çä¸PostgreSQLç¸å³ç书ç±ï¼å¦å¤ä¸æ¬æ¯Teach Yourself SQL in + 21 Days, Second Editionï¼å¶è¯¦ç»ä»ç»çç½åæ¯ + http://members.tripod.com/er4ebus/sql/index.htmï¼ + æä»¬ç许å¤ç¨æ·å欢The Practical SQL Handbookï¼ Bowman, Judith S. + ç¼åï¼Addison-Wesleyå¬å¸åºçï¼å¶ä»çå忬¢ The Complete Reference SQL, + Groff ç¼åï¼McGraw-Hillå¬å¸åºçã + + å¨ä¸åç½åä¸ä¹æå¾å¥½çæç¨ï¼ä»ä»¬æ¯ + * http://www.intermedia.net/support/sql/sqltut.shtm + * http://sqlcourse.com. + * http://www.w3schools.com/sql/default.asp + * http://mysite.verizon.net/Graeme_Birchall/id1.html + + 1.12)å¦ä½æäº¤è¡¥ä¸ææ¯å å¥å¼åéä¼ï¼ + + è¯¦è§ å¼å人å常è§é®é¢ (Developer's FAQ) ã + + 1.13)PostgreSQLåå¶ä»æ°æ®åºç³»ç»æ¯èµ·æ¥å¦ä½ï¼ + + è¯ä»·è½¯ä»¶æå¥½å ç§æ¹æ³ï¼åè½ï¼æ§è½ï¼å¯é æ§ï¼æ¯æåä»·æ ¼ã + + åè½ + PostgreSQL æ¥æå¤§ååç¨æ°æ®åºæå¤çåè½ï¼ä¾å¦ï¼äºå¡ï¼å­ + æ¥è¯¢ï¼è§¦åå¨ï¼è§å¾ï¼å¤é®åè宿´æ§å夿çéå®çã + æä»¬è¿æä¸äºå®ä»¬æ²¡æçç¹æ§ï¼å¦ç¨æ·å®ä¹ç±»åï¼ç»§æ¿ï¼è§ååå¤çæ¬å¹¶è + ¡æ§å¶ä»¥åå°éçäºç¨çã + + æ§è½ + PostgreSQLåå¶ä»åç¨å弿ºçæ°æ®åºå·æç±»ä¼¼çæ§è½ã对æäºå¤ç宿¯è¾å¿« + ï¼å¯¹å¶ä»ä¸äºå¤ç宿¯è¾æ¢ã ä¸å¶ä»æ°æ®åºç¸æ¯ï¼æä»¬çæ§è½ä¼å£éå¸¸å¨ + +/- 10%ä¹é´ã + + å¯é æ§ + æä»¬é½ç¥éæ°æ®åºå¿é¡»æ¯å¯é çï¼å¦åå®å°±ä¸ç¹ç¨é½æ²¡æãæä»¬åªååå°åå¸ + ç»è¿è®¤çæµè¯çï¼ç¼ºé·æå°ç稳å®ä»£ç ãæ¯ä¸ªçæ¬è³å°æä¸ä¸ªæç beta + æµè¯æ¶é´ï¼å¹¶ä¸æä»¬çåå¸å岿¾ç¤ºæä»¬å¯ä»¥æä¾ç¨³å®çï¼ç¢åºçï¼å¯ç¨ä + ºç产使ç¨ççæ¬ãæä»¬ç¸ä¿¡å¨è¿æ¹é¢æä»¬ä¸å¶ä»çæ°æ®åºè½¯ä»¶æ¯ç¸å½çã + + æ¯æ + æä»¬çé®ä»¶å表æä¾ä¸ä¸ªé常大çå¼å人ååç¨æ·çç»ä»¥å¸®å©è§£å³æç¢°å + °çä»»ä½é®é¢ãæä»¬ä¸è½ä¿è¯æ»æ¯è½è§£å³é®é¢ï¼ç¸æ¯ä¹ä¸ï¼åç¨æ°æ®åºè½¯ + ä»¶ä¹å¹¶ä¸æ¯æ»è½å¤æä¾è§£å³æ¹æ³ã + ç´æ¥ä¸å¼å人åï¼ç¨æ·ç¾¤ï¼æååæºç¨åºæ¥è§¦ä½¿PostgreSQLçæ¯ææ¯å¶ä»æ° + æ®åºè¿è¦å¥½ãè¿æä¸äºå䏿§çå¨é¢ææ¯æ¯æï¼å¯ä»¥ç»æä¾ç»é£äºéè¦ç人ãï¼ + åé1.7 å°èï¼ + + ä»·æ ¼ + æä»¬å¯¹ä»»ä½ç¨éé½åè´¹ï¼åæ¬åç¨åéåç¨ç®çã + ä½ å¯ä»¥ä¸å éå¶å°åä½ ç产åéå 奿们ç代ç ï¼é¤äºé£äºæä»¬å¨ä¸é¢çç + æå£°æé声æç BSDçæä¹å¤çå容ã + + 1.14) PostgreSQLå¯ä»¥å¤çæè¿å个å½å®¶å¤æ¶å¶çååå? + + PostgreSQL 8.0ä¹åççæ¬æ¯ä½¿ç¨æä½ç³»ç»ä¸­ + çæ¶åºæ°æ®åºæ¥å¤ç夿¶å¶çä¿¡æ¯ï¼èª8.0çå以åççæ¬PostgreSQLä¼èªèº«å«æææ°çæ + ¶åºä¿¡æ¯ã + _________________________________________________________________ + +ç¨æ·å®¢æ·ç«¯é®é¢ + + 2.1) æä»¬å¯ä»¥ç¨ä»ä¹è¯è¨åPostgreSQLæäº¤éï¼ + + PostgreSQL(缺çæåµ)åªå®è£æCåååµå¼Cçæ¥å£ï¼å¶ä»çæ¥å£é½æ¯ç¬ç«ç项ç®ï¼è½å¤ + åå«ä¸è½½ï¼è¿äºæ¥å£é¡¹ç®ç¬ç«çå¥½å¤ + æ¯ä»ä»¬å¯ä»¥æåèªçåå¸è®¡åååèªç¬ç«çå¼åç»ã + + ä¸äºç¼ç¨è¯­ + è¨å¦PHPé½æè®¿é®PostgreSQLçæ¥å£ï¼PerlãTCLãPython以åå¾å¤å¶ä»è¯è¨çæ¥å£å¨ + http://gborg.postgresql.orgç½ç«ä¸çDrivers/Interfaceså°è坿¾å°ï¼ + å¹¶ä¸éè¿Internetå¾å®¹ææç´¢å°ã + + 2.2) æä»ä¹å·¥å·å¯ä»¥æPostgreSQLç¨äº Web 页é¢ï¼ + + ä¸ä¸ªä»ç»ä»¥æ°æ®åºä¸ºåå°çæºä¸éçç«ç¹æ¯ï¼http://www.webreview.comã + + å¯¹äº Web éæï¼PHP æ¯ä¸ä¸ªæå¥½çæ¥å£ãå®å¨http://www.php.net/ã + + 对äºå¤æçä»»å¡ï¼å¾å¤äººéç¨ Perl æ¥å£å 使ç¨CGI.pmçDBD::Pg æ mod_perl ã + + 2.3)PostgreSQLæ¥æå¾å½¢ç¨æ·çé¢åï¼ + + åä¸ç¨æ·ææ¯å¼æºå¼å人åè½æ¾å°å¾å¤çæå³PostgreSQLçGUIå¾å½¢å·¥å·è½¯ä»¶ï¼å¨ + PostgreSQLç¤¾åºææ¡£æä¸ä¸ªè¯¦ç»çå表ã + _________________________________________________________________ + +ç³»ç»ç®¡çé®é¢ + + 3.1)æææ ·è½æPostgreSQLè£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼ + + å¨è¿è¡ configure æ¶å ä¸ --prefix é项ã + + 3.2) æå¦ä½æ§å¶æ¥èªå¶ä»çµèçè¿æ¥ï¼ + + 缺çæåµä¸ï¼PostgreSQLåªå许æ¥èªæ¬æºä¸éè¿ unix å奿¥åæTCP/IPæ¹å¼çè¿æ¥ã + ä½ åªæå¨ä¿®æ¹äºéç½®æä»¶postgresql.conf中 + çlisten_addressesï¼ä¸ä¹å¨éç½®æä»¶$PGDATA/pg_hba.conf䏿å¼äº + åºäºè¿ç¨çµèï¼ host-based + ï¼ç身份认è¯ï¼å¹¶éæ°å¯å¨PostgreSQLï¼å¦åå¶ä»çµèæ¯ä¸è½ä¸ä½ çPostgreSQL + æå¡å¨è¿è¡è¿æ¥çã + + 3.3) æææ ·è°æ´æ°æ®åºå¼æä»¥è·å¾æ´å¥½çæ§è½ï¼ + + æä¸ä¸ªä¸»è¦æ¹é¢å¯ä»¥æåPostgreSQLçæ½è½ã + + æ¥è¯¢æ¹å¼çåå + è¿ä¸»è¦æ¶åä¿®æ¹æ¥è¯¢æ¹å¼ä»¥è·åæ´å¥½çæ§è½: + + + å建索å¼ï¼åæ¬è¡¨è¾¾å¼åé¨åç´¢å¼ï¼ + + 使ç¨COPYè¯å¥ä»£æ¿å¤ä¸ªInsertè¯å¥ï¼ + + å°å¤ä¸ªSQLè¯å¥ç»æä¸ä¸ªäºå¡ä»¥åå°æäº¤äºå¡çå¼éï¼ + + ä»ä¸ä¸ªç´¢å¼ä¸æå夿¡è®°å½æ¶ä½¿ç¨CLUSTERï¼ + + ä»ä¸ä¸ªæ¥è¯¢ç»æä¸ååºé¨åè®°å½æ¶ä½¿ç¨LIMITï¼ + + 使ç¨é¢ç¼è¯å¼æ¥è¯¢ï¼Prepared Query)ï¼ + + 使ç¨ANALYZEä»¥ä¿æç²¾ç¡®çä¼åç»è®¡ï¼ + + å®æä½¿ç¨ VACUUM æ pg_autovacuum + + è¿è¡å¤§éæ°æ®æ´æ¹æ¶åå é¤ç´¢å¼ï¼ç¶åé建索å¼ï¼ + + æå¡å¨çéç½® + éç½®æä»¶postgres.conf中 + çå¾å¤è®¾ç½®é½ä¼å½±åæ§è½ï¼ææåæ°çå表å¯è§ï¼ + 管çåæå/æ°æ®åºæå¡å¨è¿è¡ç¯å¢/æ°æ®åºæå¡å¨è¿è¡éç½®ï¼ + æå³åæ°çè§£éå¯è§ï¼http://www.varlena.com/varlena/GeneralBits/Tid + bits/annotated_conf_e.html å + http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.htmlã + + 硬件çéæ© + è®¡ç®æºç¡¬ä»¶å¯¹æ§è½çå½±å坿µè§ + http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde + x.html å http://www.powerpostgresql.com/PerfList/ã + + 3.4)PostgreSQLéå¯ä»¥è·å¾ä»ä¹æ ·çè°è¯ç¹æ§ï¼ + + PostgreSQL æå¾å¤ç±»ä¼¼ log_* + çæå¡å¨éç½®åéå¯ç¨äºæ¥è¯¢çæå°åè¿ç¨ç»è®¡ï¼èè¿äºå·¥ä½å¯¹è°è¯åæ§è½æµè¯å¾æå¸ + ®å©ã + + 3.5) 为ä»ä¹å¨è¯å¾è¿æ¥æ¶æ¶å°âSorry, too many + clientsï¼å·²æå¤ªå¤ç¨æ·è¿æ¥ï¼âæ¶æ¯ï¼ + + è¿è¡¨ç¤ºä½ 已达å°ç¼ºç100个并ååå°è¿ç¨æ°çéå¶ï¼ä½ éè¦éè¿ä¿®æ¹postgres + ql.confæä»¶ä¸çmax_connections弿¥ + å¢å postmasterçåå°å¹¶åå¤çæ°ï¼ä¿®æ¹åééæ°å¯å¨postmasterã + + 3.6)PostgreSQLçå级è¿ç¨æåªäºå容 ï¼ + + PostgreSQL å¼åç»å¯¹æ¯æ¬¡å°çæ¬çå级主è¦åªåäºä¸äºBugä¿®æ£å·¥ä½ï¼å æ¤ä» + 7.4.8 åçº§å° 7.4.9 ä¸éè¦ dump å restoreï¼ä»éè¦åæ­ + ¢æ°æ®åºæå¡å¨ï¼å®è£æ´æ°åç软件åï¼ç¶åé坿å¡å¨å³å¯ã + + ææPostgreSQLçç¨æ·åºè¯¥å¨ææ¥è¿ï¼ä½ æä½¿ç¨çä¸»çæ¬ï¼çå°æ¹è¿çæ¬åå¸å°½å¿«åç + º§ãå°½ç®¡æ¯æ¬¡å级å¯è½é½æä¸ç¹é£é©ï¼PostgreSQLçå°æ¹è¿çä»ä»æ¯è®¾è®¡ç¨æ¥ä + ¿®æ­ + £ä¸äºBugçï¼ä»£ç æ¹å¨è¾å°ï¼æä»¥é£é©è¿æ¯å¾å°çãPostgreSQL社åºè®¤ä¸ºä¸è¬æ + åµä¸ä¸å级çé£é©è¿æ¯å¤äºå级çã + + ä¸»çæ¬çå级ï¼ä¾å¦ä» 7.3 å° 7.4ï¼é常ä¼ä¿®æ¹ç³»ç»è¡¨åæ°æ®è¡¨çå鍿 ¼å¼ã + è¿äºæ¹åä¸è¬æ¯è¾å¤æï¼å æ¤æä»¬ä¸ç»´ææ°æ®æä»¶çååå¼å®¹æ§ãå æ¤ä»èçæ¬ä¸­ + è¿è¡æ°æ®å¯¼åºï¼dumpï¼/ç¶å卿°çæ¬ä¸­ + è¿è¡æ°æ®å¯¼å¥ï¼reloadï¼å¯¹ä¸»çæ¬çå级æ¯å¿é¡»çã + + 3.7)(使ç¨PostgreSQL)æéè¦ä½¿ç¨ä»ä¹è®¡ç®æºç¡¬ä»¶ ï¼ + + ç±äºè®¡ç®æºç¡¬ä»¶å¤§å¤æ°æ¯å¼å®¹çï¼äººä»¬æ»æ¯å¾åäºç¸ä¿¡ææè®¡ç®æºç¡¬ä»¶è + ´¨é乿¯ç¸åçãäºå®ä¸ä¸æ¯ï¼ ECC RAMï¼å¸¦å¥å¶æ ¡éªçååï¼ï¼SCSI + ï¼ç¡¬çï¼åä¼è´¨çä¸»æ¿æ¯ä¸äºä¾¿å®è´§è¦æ´å å¯é ä¸å·ææ´å¥½çæ§è½ãPostgreSQL + å ä¹å¯ä»¥è¿è¡å¨ä»»ä½ç¡¬ä»¶ä¸ï¼ + ä½å¦æå¯é æ§åæ§è½å¯¹ä½ çç³»ç»å¾éè¦ï¼ä½ å°±éè¦å¨é¢çç ç©¶ä¸ä¸ä½ ç硬件éç + ½®äºã卿们çé®ä»¶å表ä¸ä¹æå³äº 硬件éç½®åæ§ä»·æ¯ç讨论ã + _________________________________________________________________ + +æä½é®é¢ + + 4.1) å¦ä½åªéæ©ä¸ä¸ªæ¥è¯¢ç»æç头å è¡ï¼ææ¯éæºçä¸è¡ï¼ + + å¦æä½ åªæ¯è¦æåå è¡æ°æ®ï¼å¹¶ä¸ä½ 卿§è¡æ¥è¯¢ä¸­ + ç¥éç¡®åçè¡æ°ï¼ä½ å¯ä»¥ä½¿ç¨LIMITåè½ã 妿æä¸ä¸ªç´¢å¼ä¸ ORDER BY中 + çæ¡ä»¶å¹éï¼PostgreSQL å¯è½å°±åªå¤çè¦æ±çå¤´å æ¡è®°å½ï¼ + ï¼å¦åå°å¯¹æ´ä¸ªæ¥è¯¢è¿è¡å¤çç´å°çæéè¦çè¡ï¼ã妿卿§è¡æ¥è¯¢åè½æ¶ä¸ç¥éç¡®å + çè®°å½æ°ï¼ å¯ä½¿ç¨æ¸¸æ (cursor)åFETCHåè½ã + + å¯ä½¿ç¨ä»¥ä¸æ¹æ³æåä¸è¡éæºè®°å½çï¼ + SELECT cols + FROM tab + ORDER BY random() + LIMIT 1 ; + + 4.2) + å¦ä½æ¥ç表ãç´¢å¼ãæ°æ®åºä»¥åç¨æ·çå®ä¹ï¼å¦ä½æ¥çpsqléç¨å°çæ¥è¯¢æä»¤å¹¶æ¾ç¤ºå®ä»¬ + ï¼ + + å¨psqlä¸ä½¿ç¨ \dt å½ä»¤æ¥æ¾ç¤ºæ°æ®è¡¨çå®ä¹ï¼è¦äºè§£psql中 + ç宿´å½ä»¤å表å¯ä½¿ç¨\? ï¼å¦å¤ï¼ä½ ä¹å¯ä»¥é读 psql çæºä»£ç + æä»¶pgsql/src/bin/psql/describe.cï¼å®åæ¬ä¸ºçæpsqlåææ å½ä»¤çè¾åºçææ SQL + å½ä»¤ãä½ è¿å¯ä»¥å¸¦ -E é项å¯å¨ psqlï¼ è¿æ ·å®å°æå°åºä½ å¨psql中 + æç»åºçå½ä»¤æ§è¡æ¶çåé¨å®é使ç¨çSQLæ¥è¯¢è¯­ + å¥ãPostgreSQL乿ä¾äºä¸ä¸ªå¼å®¹SQLçINFORMATION SCHEMAæ¥å£ï¼ + ä½ å¯ä»¥ä»è¿éè·åå³äºæ°æ®åºçä¿¡æ¯ã + + å¨ç³»ç»ä¸ä¹æä¸äºä»¥pg_ æå¤´çç³»ç»è¡¨ä¹æè¿°äºè¡¨çå®ä¹ã + + ä½¿ç¨ psql -l æä»¤å¯ä»¥ååºææçæ°æ®åºã + + ä¹å¯ä»¥æµè§ä¸ä¸ + pgsql/src/tutorial/syscat.sourceæä»¶ï¼å®å举äºå¾å¤å¯ä»æ°æ®åºç³»ç»è¡¨ä¸ + è·åä¿¡æ¯çSELECTè¯æ³ã + + 4.3) å¦ä½æ´æ¹ä¸ä¸ªåæ®µçæ°æ®ç±»åï¼ + + å¨8.0çæ¬éæ´æ¹ä¸ä¸ªåæ®µçæ°æ®ç±»åå¾å®¹æï¼å¯ä½¿ç¨ ALTER TABLE ALTER + COLUMN TYPE ã + + å¨ä»¥åççæ¬ä¸ï¼å¯ä»¥è¿æ ·åï¼ + BEGIN; + ALTER TABLE tab ADD COLUMN new_col new_data_type; + UPDATE tab SET new_col = CAST(old_col AS new_data_type); + ALTER TABLE tab DROP COLUMN old_col; + COMMIT; + + ä½ ç¶åå¯ä»¥ä½¿ç¨VACUUM FULL tab æä»¤æ¥ä½¿ç³»ç»æ¶åæ ææ°æ®æå ç¨ç空é´ã + + 4.4) åæ¡è®°å½ï¼å个表ï¼åä¸ªæ°æ®åºçæå¤§éå¶æ¯å¤å°ï¼ + + ä¸é¢æ¯ä¸äºéå¶ï¼ + + åä¸ªæ°æ®åºæå¤§å°ºå¯¸ï¼ æ éå¶ï¼å·²å卿 32TB çæ°æ®åºï¼ + å个表çæå¤§å°ºå¯¸ï¼ 32 TB + ä¸è¡è®°å½çæå¤§å°ºå¯¸ï¼ 1.6 TB + ä¸ä¸ªå段çæå¤§å°ºå¯¸? 1 GB + ä¸ä¸ªè¡¨éæå¤§è¡æ°ï¼ æ éå¶ + ä¸ä¸ªè¡¨éæå¤§åæ°ï¼ 250-1600 ï¼ä¸åç±»åæå³ï¼ + ä¸ä¸ªè¡¨éçæå¤§ç´¢å¼æ°éï¼ æ éå¶ + + å½ç¶ï¼å®é䏿²¡æçæ£çæ éå¶ï¼è¿æ¯è¦åå¯ç¨ç£ç空é´ãå¯ç¨åå/交æ¢åºçå¶çº¦ã + äºå®ä¸ï¼å½ä¸è¿°è¿äºæ°å¼åå¾å¼å¸¸å°å¤§æ¶ï¼ç³»ç»æ§è½ä¹ä¼åå¾å¤§å½±åã + + å表çæå¤§å¤§å° 32 TB + ä¸éè¦æä½ç³»ç»å¯¹å个æä»¶ä¹éè¿ä¹å¤§çæ¯æã大表ç¨å¤ä¸ª 1 GB çæä»¶å­ + å¨ï¼å æ¤æä»¶ç³»ç»å¤§å°çéå¶æ¯ä¸éè¦çã + + å¦æç¼ºççå大å°å¢é¿å° 32K ï¼æå¤§çå表大å°åæå¤§åæ°è¿å¯ä»¥å¢å å°ååã + + æä¸ä¸ªéå¶å°±æ¯ä¸è½å¯¹å¤§å°å¤äº2000å­ + èçåå建索å¼ã幸è¿å°æ¯è¿æ ·çç´¢å¼å¾å°ç¨å°ãéè¿å¯¹å¤å­ + èåçå容è¿è¡MD5åç¨è¿ç®ç»æè¿è¡å½æ°ç´¢å¼å¯å¯¹åçå¯ä¸æ§å¾å°ä¿è¯ï¼ + å¹¶ä¸å¨ææ£ç´¢å许对åä¸çåè¯è¿è¡æç´¢ã + + 4.5) åå¨ä¸ä¸ªå¸åçææ¬æä»¶éçæ°æ®éè¦å¤å°ç£ç空é´ï¼ + + ä¸ä¸ª Postgres æ°æ®åºï¼å­ + å¨ä¸ä¸ªææ¬æä»¶ï¼æå ç¨çç©ºé´æå¤å¯è½éè¦ç¸å½äºè¿ä¸ªææ¬æä»¶èªèº«å¤§å°5åçç£ + ç空é´ã + + ä¾å¦ï¼å设æä¸ä¸ª 100,000 è¡çæä»¶ï¼æ¯è¡æä¸ä¸ªæ´æ°åä¸ä¸ªææ¬æè¿°ã + åè®¾ææ¬ä¸²çå¹³åé¿åº¦ä¸º20åèãææ¬æä»¶å ç¨ 2.8 MBãå­ + æ¾è¿äºæ°æ®çPostgreSQLæ°æ®åºæä»¶å¤§çº¦æ¯ 6.4 MB: + 28 åè: æ¯è¡ç头ï¼å¤§çº¦å¼ï¼ + 24 åè: ä¸ä¸ªæ´æ°ååæ®µåä¸ä¸ªææ¬ååæ®µ + + 4 åè: 页é¢åæååç»çæé + ---------------------------------------- + 56 åèæ¯è¡ + + PostgreSQL æ°æ®é¡µç大尿¯ 8192 åè (8 KB)ï¼åï¼ + + 8192 åèæ¯é¡µ + ------------------- = 146 è¡/æ°æ®é¡µï¼åä¸åæ´ï¼ + 56 åèæ¯è¡ + + 100000 æ°æ®è¡ + -------------------- = 685 æ°æ®é¡µï¼åä¸åæ´ï¼ + 146 è¡/æ°æ®é¡µ + + 685 æ°æ®é¡µ * 8192 åè/页 = 5,611,520 åèï¼5.6 MBï¼ + + ç´¢å¼ä¸éè¦è¿ä¹å¤çé¢å¤æ¶èï¼ä½ä¹ç¡®å®åæ¬è¢«ç´¢å¼çæ°æ®ï¼å æ­ + ¤å®ä»¬ä¹å¯è½å¾å¤§ã + + 空å¼NULLåæ¾å¨ä½å¾ä¸ï¼å æ¤å ç¨å¾å°ç空é´ã + + 4.6) 为ä»ä¹æçæ¥è¯¢å¾æ¢ï¼ä¸ºä»ä¹è¿äºæ¥è¯¢æ²¡æå©ç¨ç´¢å¼ï¼ + + å¹¶éæ¯ä¸ªæ¥è¯¢é½ä¼èªå¨ä½¿ç¨ç´¢å¼ãåªæå¨è¡¨ç大å°è¶è¿ä¸ä¸ªæå°å¼ï¼å¹¶ä¸æ¥ + 询åªä¼éä¸è¡¨ä¸è¾å°æ¯ä¾çè®°å½æ¶æä¼éç¨ç´¢å¼ã + è¿æ¯å ä¸ºç´¢å¼æ«æå¼èµ·çéå³ç£çååå¯è½æ¯ç´æ¥å°è¯»å表ï¼é¡ºåºæ«æï¼æ´æ¢ã + + 为äºå¤æ­ + æ¯å¦ä½¿ç¨ç´¢å¼ï¼PostgreSQLå¿é¡»è·å¾æå³è¡¨çç»è®¡å¼ãè¿äºç»è®¡å¼å¯ä»¥ä½¿ç + ¨ VACUUM ANALYZEï¼æ ANALYZE è·å¾ã 使ç¨ç»è®¡å¼ï¼ä¼åå¨ç¥é表中 + æå¤å°è¡ï¼å°±è½å¤æ´å¥½å°å¤ææ¯å¦å©ç¨ç´¢å¼ã + ç»è®¡å¼å¯¹ç¡®å®ä¼åçè¿æ¥é¡ºåºåè¿æ¥æ¹æ³ä¹å¾æç¨ãå¨è¡¨çå容åçååæ¶ï¼åºå®æè¿ + è¡ç»è®¡å¼çæ´æ°æ¶éã + + ç´¢å¼é常ä¸ç¨äº ORDER BY + ææ§è¡è¿æ¥ã对ä¸ä¸ªå¤§è¡¨ç䏿¬¡é¡ºåºæ«æåå䏿¬¡æåºé常æ¯ç´¢å¼æ«æè¦å¿«ãç¶ + èï¼å¦æå° LIMIT å ORDER BY + ç»åå¨ä¸èµ·ä½¿ç¨çè¯ï¼é常å°ä¼ä½¿ç¨ç´¢å¼ï¼å ä¸ºè¿æ¶ä»è¿å表中 + çä¸å°é¨åè®°å½ã + + å¦æä½ ç¡®ä¿¡PostgreSQLçä¼åå¨ä½¿ç¨é¡ºåºæ«ææ¯ä¸æ£ç¡®çï¼ä½ å¯ä»¥ä½¿ç¨SET + enable_seqscan TO 'off'æä»¤æ¥å³éé¡ºåºæ«æï¼ + ç¶å忬¡è¿è¡æ¥è¯¢ï¼ä½ å°±å¯ä»¥çåºä½¿ç¨ä¸ä¸ªç´¢å¼æ«ææ¯å¦ç¡®å®è¦å¿«ä¸äºã + + å½ä½¿ç¨éé符æä½ï¼ä¾å¦ LIKE æ ~ æ¶ï¼ç´¢å¼åªè½å¨ç¹å®çæåµä¸ä½¿ç¨ï¼ + * å符串çå¼å§é¨åå¿é¡»æ¯æ®éå符串ï¼ä¹å°±æ¯è¯´ï¼ + + LIKE 模å¼ä¸è½ä»¥ % æå¤´ã + + ~ ï¼æ£å表达å¼ï¼æ¨¡å¼å¿é¡»ä»¥ ^ æå¤´ã + * å符串ä¸è½ä»¥å¹éå¤ä¸ªåç¬¦çæ¨¡å¼ç±»æå¤´ï¼ä¾å¦ [a-e]ã + * 大å°åæ å³çæ¥æ¾ï¼å¦ ILIKE å ~* çä¸ä½¿ç¨ç´¢å¼ï¼ä½å¯ä»¥ç¨ 4.8 + èæè¿°ç表达å¼ç´¢å¼ã + * å¨å initdb æ¶å¿é¡»éç¨ç¼ºççæ¬å°è®¾ç½® C + localeï¼å 为系ç»ä¸å¯è½ç¥éå¨éC localeæåµæ¶ä¸ä¸ä¸ªæå¤§å符æ¯ä»ä¹ã + å¨è¿ç§æåµä¸ï¼ä½ å¯ä»¥å建ä¸ä¸ªç¹æ®çtext_pattern_opsç´¢å¼æ¥ç¨äºLIKE + çç´¢å¼ã + + å¨8.0ä¹åççæ¬ä¸­ + ï¼é¤éè¦æ¥è¯¢çæ°æ®ç±»ååç´¢å¼çæ°æ®ç±»åç¸å¹éï¼å¦åç´¢å¼ç»å¸¸æ¯æªè¢«ç¨å°ï¼ç + ¹å«æ¯å¯¹int2,int8åæ°å¼åçç´¢å¼ã + + 4.7) æå¦ä½æè½çå°æ¥è¯¢ä¼å卿¯ææ ·è¯ä¼°å¤çæçæ¥è¯¢ï¼ + + åè EXPLAIN æå页ã + + 4.8) æææ ·åæ£åè¡¨è¾¾å¼æç´¢å大å°åæ å³çæ­ + £åè¡¨è¾¾å¼æ¥æ¾ï¼ææ ·å©ç¨ç´¢å¼è¿è¡å¤§å°åæ 峿¥æ¾ï¼ + + æä½ç¬¦ ~ å¤çæ£å表达å¼å¹éï¼è ~* å¤ç大å°åæ å³çæ­ + £å表达å¼å¹éã大å°åæ å³ç LIKE åç§æä¸º ILIKEã + + 大å°åæ å³çç弿¯è¾é常ååï¼ + SELECT * + FROM tab + WHERE lower(col) = 'abc'; + + è¿æ ·å°ä¸ä¼ä½¿ç¨æ åçç´¢å¼ã使¯å¯ä»¥å建ä¸ä¸ªå¨è¿ç§æåµä¸ä½¿ç¨ç表达å¼ç + ´¢å¼: + CREATE INDEX tabindex ON tab (lower(col)); + + 妿ä¸è¿°ç´¢å¼å¨å建æ¶å å¥UNIQUE约æï¼è½ç¶ç´¢å¼å段èªèº«å容å¯ä»¥å­ + å¨å¤§å°åä¸éçå容ï¼ä½å¦ææUNIQUE约æåï¼è¿äºå容ä¸è½ä»ä»æ¯å¤§å°åä¸åï¼å¦åä + ¼é æå²çªï¼ã为äºä¿è¯ä¸åçè¿ç§æåµï¼å¯ä»¥ä½¿ç¨CHECKçº¦ææ¡ä»¶ææ¯è§¦åå¨å¨å½ + 奿¶è¿è¡éå¶ã + + 4.9) å¨ä¸ä¸ªæ¥è¯¢éï¼æææ ·æ£æµä¸ä¸ªå段æ¯å¦ä¸º NULL ï¼æå¦ä½æè½åç¡®æåºèä¸è®ºæå­ + 段æ¯å¦å« NULL å¼ï¼ + + ç¨ IS NULL å IS NOT NULL æµè¯è¿ä¸ªå段ï¼å·ä½æ¹æ³å¦ä¸ï¼ + SELECT * + FROM tab + WHERE col IS NULL; + + 为äºè½å¯¹å« NULLåæ®µæåºï¼å¯å¨ ORDER BY æ¡ä»¶ä¸ä½¿ç¨ IS NULLå IS NOT + NULL ä¿®é¥°ç¬¦ï¼æ¡ä»¶ä¸ºç true å°æ¯æ¡ä»¶ä¸ºåfalse æå¨åé¢ï¼ä¸é¢çä¾å­ + å°±ä¼å°å« NULL çè®°å½æå¨ç»æçä¸é¢é¨åï¼ + SELECT * + FROM tab + ORDER BY (col IS NOT NULL) + + 4.10) åç§å符类åä¹é´æä»ä¹ä¸åï¼ + + ç±»å åé¨åç§° 说æ + VARCHAR(n) varchar æå®äºæå¤§é¿åº¦ï¼åé¿å­ + 符串ï¼ä¸è¶³å®ä¹é¿åº¦çé¨åä¸è¡¥é½ + CHAR(n) bpchar å®é¿å符串ï¼å®éæ°æ®ä¸è¶³å®ä¹é¿åº¦æ¶ï¼ä»¥ç©ºæ ¼è¡¥é½ + TEXT text 没æç¹å«çä¸ééå¶ï¼ä»åè¡çæå¤§é¿åº¦éå¶ï¼ + BYTEA bytea åé¿åèåºåï¼ä½¿ç¨NULLåç¬¦ä¹æ¯å许çï¼ + "char" char å个å符 + + å¨ç³»ç»è¡¨åå¨ä¸äºé误信æ¯éä½ å°çå°åé¨åç§°ã + + ä¸é¢æåçååç§ç±»åæ¯"varlena"ï¼åé¿ï¼ç±»åï¼ä¹å°±æ¯è¯´ï¼å¼å¤´çåä¸ªå­ + èæ¯é¿åº¦ï¼åé¢ææ¯æ°æ®ï¼ã äºæ¯å®éå ç¨çç©ºé´æ¯å£°æç大å°è¦å¤ä¸äºã + ç¶èè¿äºç±»åå¦å®ä¹å¾é¿æ¶é½å¯ä»¥è¢«å缩åå¨ï¼å æ­ + ¤ç£ç空é´ä¹å¯è½æ¯é¢æ³çè¦å°ã + + VARCHAR(n) å¨åå¨éå¶äºæå¤§é¿åº¦çåé¿åç¬¦ä¸²æ¯æå¥½çã TEXT éç¨äºå­ + 卿大å¯è¾¾ 1Gå·¦å³ä½æªå®ä¹éå¶é¿åº¦çå符串ã + + CHAR(n) æéåäºåå¨é¿åº¦ç¸åçå符串ã CHAR(n)伿 ¹æ®æç»å®çå­ + 段é¿åº¦ä»¥ç©ºæ ¼è¡¥è¶³ï¼ä¸è¶³çåæ®µå容ï¼ï¼ è VARCHAR(n) åªå­ + 卿ç»å®çæ°æ®å容ã BYTEA ç¨äºåå¨äºè¿å¶æ°æ®ï¼å°¤å¶æ¯åå« NULL å­ + èçå¼ãè¿äºç±»åå·æå·®ä¸å¤çæ§è½ã + + 4.11.1) æææ ·å建ä¸ä¸ªåºåå·ææ¯èªå¨éå¢çåæ®µï¼ + + PostgreSQL æ¯æ SERIAL æ°æ®ç±»åãï¼å­ + 段å®ä¹ä¸ºSERIALåï¼å°èªå¨å建ä¸ä¸ªåºåçæå¨ï¼ä¾å¦ï¼ + CREATE TABLE person ( + id SERIAL, + name TEXT + ); + + ä¼èªå¨è½¬æ¢ä¸ºä»¥ä¸SQLè¯å¥ï¼ + CREATE SEQUENCE person_id_seq; + CREATE TABLE person ( + id INT4 NOT NULL DEFAULT nextval('person_id_seq'), + name TEXT + ); + + åè create_sequence æå页è·åå³äºåºåçæå¨çæ´å¤ä¿¡æ¯ã + + 4.11.2) æå¦ä½è·å¾ä¸ä¸ªæå¥çåºåå·çå¼ï¼ + + ä¸ç§æ¹æ³æ¯å¨æå¥ä¹ååç¨å½æ° nextval() ä»åºåå¯¹è±¡éæ£ç´¢åºä¸ä¸ä¸ª SERIAL + å¼ï¼ç¶ååç¨æ¤å¼ç²¾ç¡®å°æå¥ãä½¿ç¨ 4.11.1 éçä¾è¡¨ï¼å¯ç¨ä¼ªç è¿æ ·æè¿°ï¼ + new_id = execute("SELECT nextval('person_id_seq')"); + execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); + + è¿æ ·è¿è½å¨å¶ä»æ¥è¯¢ä¸ä½¿ç¨åæ¾å¨ new_id éçæ°å¼ï¼ä¾å¦ï¼ä½ä¸ºåç§ person + 表çå¤é®ï¼ã 注æèªå¨å建ç SEQUENCE 对象çåç§°å°ä¼æ¯ + __seqï¼ è¿é table å serialcolumn + å嫿¯ä½ ç表çåç§°åä½ ç SERIAL åæ®µçåç§°ã + + 类似çï¼å¨ SERIAL 对象缺çæå¥åä½ å¯ä»¥ç¨å½æ° currval() æ£ç´¢åèµå¼ç + SERIAL å¼ï¼ä¾å¦ï¼ + execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); + new_id = execute("SELECT currval('person_id_seq')"); + + 4.11.3) åæ¶ä½¿ç¨ currval() ä¼å¯¼è´åå¶ä»ç¨æ·çå²çªæåµåï¼ + + ä¸ä¼ãcurrval() è¿åçæ¯ä½ æ¬æ¬¡ä¼è¯è¿ç¨æèµçå¼è䏿¯ææç¨æ·çå½åå¼ã + + 4.11.4) 为ä»ä¹ä¸å¨äºå¡å¼å¸¸ä¸æ¢åéç¨åºåå·å¢ï¼ä¸ºä»ä¹å¨åºåå·å段çåå¼ä¸åå¨é´æ­ + å¢ï¼ + + ä¸ºäºæé«å¹¶åæ§ï¼åºåå·å¨éè¦çæ¶åèµäºæ­ + £å¨è¿è¡çäºå¡ï¼å¹¶ä¸å¨äºå¡ç»æä¹åä¸è¿è¡éå®ï¼ è¿å°±ä¼å¯¼è´å¼å¸¸ä¸­ + æ¢çäºå¡åï¼åºåå·ä¼åºç°é´éã + + 4.12) ä»ä¹æ¯ OID ï¼ä»ä¹æ¯ CTID ï¼ + + PostgreSQL + éåå»ºçæ¯ä¸è¡è®°å½é½ä¼è·å¾ä¸ä¸ªå¯ä¸çOIDï¼é¤éå¨å建表æ¶ä½¿ç¨WITHOUT + OIDSé项ã OIDå建æ¶ä¼èªå¨çæä¸ä¸ª4åèçæ´æ°ï¼ææ OID + å¨ç¸åºPostgreSQLæå¡å¨ä¸åæ¯å¯ä¸çã ç¶èï¼å®å¨è¶è¿40亿æ¶å°æº¢åºï¼ OIDæ­ + ¤åä¼åºç°éå¤ãPostgreSQL å¨å®çåé¨ç³»ç»è¡¨éä½¿ç¨ OID å¨è¡¨ä¹é´å»ºç«èç³»ã + + å¨ç¨æ·çæ°æ®è¡¨ä¸ï¼æå¥½æ¯ä½¿ç¨SERIAlæ¥ä»£æ¿OID + å 为SERIALåªè¦ä¿è¯å¨å个表中 + çæ°å¼æ¯å¯ä¸çå°±å¯ä»¥äºï¼è¿æ ·å®æº¢åºçå¯è½æ§å°±é常å°äºï¼ + SERIAL8å¯ç¨æ¥ä¿å8åèçåºåæ°å¼ã + + CTID ç¨äºæ è¯å¸¦çæ°æ®åï¼å°åï¼åï¼ååï¼åç§»çç¹å®çç©çè¡ã CTID + å¨è®°å½è¢«æ´æ¹æéè½½ååçæ¹åãç´¢å¼æ°æ®ä½¿ç¨å®ä»¬æåç©çè¡ã + + 4.13) 为ä»ä¹ææ¶å°é误信æ¯âERROR: Memory exhausted in AllocSetAlloc()âï¼ + + è¿å¾å¯è½æ¯ç³»ç»çèæååç¨åäºï¼æèåæ ¸å¯¹æäºèµæºæè¾ä½çéå¶å¼ãå¨å¯å¨ + postmaster ä¹åè¯è¯ä¸é¢çå½ä»¤ï¼ + ulimit -d 262144 + limit datasize 256m + + åå³äºä½ ç¨ç + shellï¼ä¸é¢å½ä»¤åªæä¸æ¡è½æåï¼ä½æ¯å®å°æä½ çè¿ç¨æ°æ®æ®µéå¶è®¾å¾æ¯è¾é«ï¼ + å èä¹è®¸è½è®©æ¥è¯¢å®æãè¿æ¡å½ä»¤åºç¨äºå½åè¿ç¨ï¼ä»¥åææå¨è¿æ¡å½ä»¤è¿è¡ååå + »ºçåè¿ç¨ã + å¦æä½ æ¯å¨è¿è¡SQL客æ·ç«¯æ¶å 为åå°è¿åäºå¤ªå¤çæ°æ®èåºç°é®é¢ï¼è¯·å¨è¿è¡ + 客æ·ç«¯ä¹åæ§è¡ä¸è¿°å½ä»¤ã + + 4.14) æå¦ä½æè½ç¥éæè¿è¡çPostgreSQLççæ¬ï¼ + + ä» psql éï¼è¾å¥ SELECT version();æä»¤ã + + 4.15) æå¦ä½å建ä¸ä¸ªç¼ºç弿¯å½åæ¶é´çåæ®µï¼ + + ä½¿ç¨ CURRENT_TIMESTAMPï¼ + CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); + + 4.16) æææ ·è¿è¡ outer join ï¼å¤è¿æ¥ï¼ï¼ + + PostgreSQL éç¨æ åç SQL è¯æ³æ¯æå¤è¿æ¥ãè¿éæ¯ä¸¤ä¸ªä¾åï¼ + SELECT * + FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); + + ææ¯ + SELECT * + FROM t1 LEFT OUTER JOIN t2 USING (col); + + è¿ä¸¤ä¸ªçä»·çæ¥è¯¢å¨ t1.col å t2.col ä¸åè¿æ¥ï¼å¹¶ä¸è¿å t1 中 + æææªè¿æ¥çè¡ï¼é£äºå¨ t2 䏿²¡æå¹éçè¡ï¼ã å³[å¤]è¿æ¥ï¼RIGHT OUTER + JOINï¼å°è¿å t2 䏿ªè¿æ¥çè¡ã å®å¨å¤è¿æ¥ï¼FULL OUTER JOINï¼å°è¿å t1 å t2 + 䏿ªè¿æ¥çè¡ã å³é®å OUTER å¨å·¦[å¤]è¿æ¥ãå³[å¤]è¿æ¥åå®å¨[å¤]è¿æ¥ä¸­ + æ¯å¯éçï¼æ®éè¿æ¥è¢«ç§°ä¸ºåè¿æ¥ï¼INNER JOINï¼ã + + 4.17) å¦ä½ä½¿ç¨æ¶åå¤ä¸ªæ°æ®åºçæ¥è¯¢ï¼ + + 没æåæ³æ¥è¯¢å½åæ°æ®åºä¹å¤çæ°æ®åºã + å 为PostgreSQLè¦å è½½ä¸æ°æ®åºç¸å³çç³»ç»ç®å½ï¼ç³»ç»è¡¨ï¼ï¼å æ­ + ¤è·¨æ°æ®åºçæ¥è¯¢å¦ä½æ§è¡æ¯ä¸å®çã + + éå å¢å¼æ¨¡åcontrib/dblinkå许éç¨å½æ°è°ç¨å®ç°è·¨åºæ¥è¯¢ãå½ç¶ç¨æ·ä¹å¯ä»¥ + åæ¶è¿æ¥å°ä¸åçæ°æ®åºæ§è¡æ¥è¯¢ç¶åå¨å®¢æ·ç«¯åå¹¶ç»æã + + 4.18) å¦ä½è®©å½æ°è¿åå¤è¡æå¤åæ°æ®ï¼ + + å¨å½æ°ä¸è¿åæ°æ®è®°å½éçåè½æ¯å¾å®¹æä½¿ç¨çï¼è¯¦æåè§ï¼ + http://techdocs.postgresql.org/guides/SetReturningFunctions + + 4.19) 为ä»ä¹æå¨ä½¿ç¨PL/PgSQL彿°åå临æ¶è¡¨æ¶ä¼æ¶å°é误信æ¯ârelation with + OID ##### does not existâï¼ + + PL/PgSQLä¼ç¼å彿°çèæ¬å容ï¼ç±æ¤å¸¦æ¥çä¸ä¸ªä¸å¥½çå¯ä½ç¨æ¯è¥ä¸ä¸ª + PL/PgSQL + 彿°è®¿é®äºä¸ä¸ªä¸´æ¶è¡¨ï¼ç¶å该表被å é¤å¹¶é建äºï¼å忬¡è°ç¨è¯¥å½æ°å + °å¤±è´¥ï¼ å 为ç¼åç彿°å容ä»ç¶æåæ§ç临æ¶è¡¨ãè§£å³çæ¹æ³æ¯å¨ PL/PgSQL + ä¸ç¨EXECUTE + 对临æ¶è¡¨è¿è¡è®¿é®ãè¿æ ·ä¼ä¿è¯æ¥è¯¢å¨æ§è¡åæ»ä¼è¢«éæ°è§£æã + + 4.20) ç®åæåªäºæ°æ®å¤å¶æ¹æ¡å¯ç¨ï¼ + + âå¤å¶âåªæ¯ä¸ä¸ªæ¯è¯ï¼æå¥½å ç§å¤å¶ææ¯å¯ç¨ï¼æ¯ç§é½æä¼ç¹å缺ç¹ï¼ + + 主/ä»å¤å¶æ¹å¼æ¯å许ä¸ä¸ªä¸»æå¡å¨æ¥å读/åçç³è¯·ï¼èå¤ä¸ªä»æå¡å¨åªè½æ¥åè + ¯»/SELECTæ¥è¯¢çç³è¯·ï¼ ç®åææµè¡ä¸åè´¹ç主/ä»PostgreSQLå¤å¶æ¹æ¡æ¯ + Slony-I ã + + å¤ä¸ªä¸»æå¡å¨çå¤å¶æ¹å¼å许å°è¯»/åçç³è¯·åéç»å¤å°çè®¡ç®æºï¼è¿ç§æ¹å¼ç±äºé + è¦å¨å¤å°æå¡å¨ä¹é´åæ¥æ°æ®åå¨ + å¯è½ä¼å¸¦æ¥è¾ä¸¥éçæ§è½æå¤±ï¼Pgclusteræ¯ç®åè¿ç§æ¹æ¡ 中 + æå¥½çï¼èä¸è¿å¯ä»¥åè´¹ä¸è½½ã + + 乿ä¸äºåä¸éä»è´¹ååºäºç¡¬ä»¶çæ°æ®å¤å¶æ¹æ¡ï¼æ¯æä¸è¿°åç§å¤å¶æ¨¡åã + + 4.21) ä¸ºä½æ¥è¯¢ç»ææ¾ç¤ºç表åæååä¸æçæ¥è¯¢è¯å¥ä¸çä¸åï¼ä¸ºä½å¤§åç¶æä¸è½ä¿çï¼ + + æå¸¸è§çåå æ¯å¨å建表æ¶å¯¹è¡¨åææ¯åå使ç¨äºåå¼å·ââï¼å½ä½¿ç¨äºåå¼å·åï¼è¡ + ¨åæååï¼ç§°ä¸ºæ è¯ç¬¦ï¼å卿¶æ¯åºå 大å°åçï¼ + è¿æè°çä½ å¨æ¥è¯¢æ¶è¡¨åæååä¹åºä½¿ç¨åå¼å·ï¼ä¸äºå·¥å·è½¯ä»¶ï¼åpgAdminä¼å¨ + ååºå建表çæä»¤æ¶èªå¨å°å¨æ¯ä¸ªæ è¯ç¬¦ä¸å åå¼å·ã å æ­ + ¤ï¼ä¸ºäºæ è¯ç¬¦çç»ä¸ï¼ä½ åºè¯¥ï¼ + * å¨å建表æ¶é¿åå°æ è¯ç¬¦ä½¿ç¨åå¼å·å¼èµ·æ¥ã + * 卿 è¯ç¬¦ä¸åªä½¿ç¨å°å忝ã + * ï¼ä¸ºäºä¸å·²åå¨çæ è¯ç¬¦ç¸åï¼å¨æ¥è¯¢ä¸ä½¿ç¨åå¼å·å°æ è¯ç¬¦å¼èµ·æ¥ã diff --git a/doc/FAQ_chinese_trad b/doc/FAQ_chinese_trad new file mode 100644 index 0000000000..b190853577 --- /dev/null +++ b/doc/FAQ_chinese_trad @@ -0,0 +1,793 @@ + + PostgreSQL 常è¦åé¡ï¼FAQï¼ + + æè¿æ´æ°ï¼2007 å¹´ 2 æ 8 æ¥ ææäº 22:43:13 EST + 䏿çæè¿æ´æ°ï¼2007 å¹´ 2 æ 12 æ¥ ææä¸ 12:00:04 CST + + ç¶åç¶è·äººå¡ï¼Bruce Momjian (pgman@candle.pha.pa.us) + æ£é«ä¸æçç¶è·äººå¡ï¼éæç(ChaoYi, Kuo)ï¼kuo.chaoyi@gmail.comï¼ + + æ¬ææªçææ°çæ¬å¯ä»¥å¨ + http://www.postgresql.org/files/documentation/faqs/FAQ.html æ¥çã + + è使¥ç³»çµ±å¹³å°ç¸éçåé¡å¯å¨ http://www.postgresql.org/docs/faq/ + 裡æ¾å°çæ¡ã + _________________________________________________________________ + +常è¦åé¡ + + 1.1)PostgreSQL æ¯ä»éº¼ï¼è©²æéº¼ç¼é³ï¼ + 1.2)誰æ§å¶å管çPostgreSQL ï¼ + 1.3)PostgreSQLççæ¬æ¯ä»éº¼ï¼ + 1.4)PostgreSQLå¯ä»¥éè¡å¨åªäºä½æ¥ç³»çµ±å¹³å°ä¸ï¼ + 1.5)æå¾åªè£¡è½å¾å°PostgreSQLï¼ + 1.6)ææ°çç PostgreSQL æ¯ä»éº¼ï¼ + 1.7)æå¾åªè£¡è½å¾å°å° PostgreSQL çæ¯æï¼ + 1.8)æå¦ä½æäº¤ä¸å BUG å ±åï¼ + 1.9)æå¦ä½ç解已ç¥ç BUG ææ«ç¼ºçåè½ï¼ + 1.10)è½å¤ ç²åçææ°ææªæåªäºï¼ + 1.11)ææè©²ææ¨£å¸ç¿ SQL ï¼ + 1.12)å¦ä½æäº¤è£ä¸ææ¯å å¥éç¼éä¼ï¼ + 1.13)PostgreSQL åå¶ä»è³æåº«ç³»çµ±æ¯èµ·ä¾å¦ä½ï¼ + 1.14)PostgreSQL å¯ä»¥èçæè¿ååå家夿å¶çè®ååï¼ + +ç¨æ¶å®¢æ¶ç«¯åé¡ + + 2.1)æåå¯ä»¥ç¨ä»éº¼èªè¨å PostgreSQL é²è¡æºéï¼ + 2.2)æä»éº¼å·¥å·å¯ä»¥æ PostgreSQL ç¨æ¼ Web é é¢ï¼ + 2.3)PostgreSQL ææåå½¢ç¨æ¶çé¢(GUI)åï¼ + +系統管çåé¡ + + 3.1)æææ¨£æè½æ PostgreSQL è£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼ + 3.2)æå¦ä½æ§å¶ä¾èªå¶ä»é»è¦ç飿¥ï¼ + 3.3)æææ¨£èª¿æ´è³æåº«ä¼ºæå¨ä»¥ç²å¾æ´å¥½çæ§è½ï¼ + 3.4)PostgreSQL 裡å¯ä»¥ç²å¾ä»éº¼æ¨£çèª¿è©¦ç¹æ§ï¼ + 3.5)çºä»éº¼å¨è©¦å飿¥ç»éææ¶å°ãSorry, too many clientsã è¨æ¯ï¼ + 3.6)PostgreSQL çåç´éç¨æåªäºå§å®¹ï¼ + 3.7)(ä½¿ç¨ PostgreSQL )æéè¦ä½¿ç¨ä»éº¼é»è¦ç¡¬é«ï¼ + +æä½åé¡ + + 4.1) å¦ä½åªé¸æä¸åæ¥è©¢çµæçé å¹¾è¡ï¼ææ¯é¨æ©çä¸è¡ï¼ + 4.2) å¦ä½æ¥ç表ãç´¢å¼ãè³æåº«ä»¥åç¨æ¶çå®ç¾©ï¼å¦ä½æ¥ç psql + 裡ç¨å°çæ¥è©¢æä»¤ä¸¦é¡¯ç¤ºå®åï¼ + 4.3) å¦ä½æ´æ¹ä¸åæ¬ä½çè³æé¡åï¼ + 4.4) å®çè¨éï¼å®ä¸è¡¨ï¼ä¸åè³æåº«çæå¤§éå¶æ¯å¤å°ï¼ + 4.5) åå²ä¸åå¸åçææ¬æä»¶è£¡çè³æéè¦å¤å°ç£ç¢ç©ºéï¼ + 4.6) çºä»éº¼æçæ¥è©¢å¾æ¢ï¼çºä»éº¼éäºæ¥è©¢æ²æå©ç¨ç´¢å¼ï¼ + 4.7) æå¦ä½æè½çå°æ¥è©¢åªå卿¯ææ¨£è©ä¼°èçæçæ¥è©¢çï¼ + 4.8) æææ¨£åæ£å表éå¼æç´¢å大å°å¯«ç¡éçæ­ + £å表é弿¥æ¾ï¼ææ¨£å©ç¨ç´¢å¼é²è¡å¤§å°å¯«ç¡éæ¥æ¾ï¼ + 4.9) å¨ä¸åæ¥è©¢è£¡ï¼æææ¨£æª¢æ¸¬ä¸åæ¬ä½æ¯å¦çº + NULLï¼æå¦ä½æè½æºç¢ºæåºèä¸è«ææ¬ä½æ¯å¦å«NULLå¼ï¼ + 4.10) å種å符é¡åä¹éæä»éº¼ä¸åï¼ + 4.11.1) æææ¨£åµå»ºä¸ååºåèåææ¯èªåéå¢çæ¬ä½ï¼ + 4.11.2) æå¦ä½ç²å¾ä¸åæå¥çåºåèçå¼ï¼ + 4.11.3) åæä½¿ç¨ currval() æå°è´åå¶ä»ç¨æ¶çè¡çªææ³åï¼ + 4.11.4) çºä»éº¼ä¸å¨äºåç°å¸¸ä¸æ¢å¾éç¨åºåèå¢ï¼çºä»éº¼å¨åºåèæ¬ä½çåå¼ä¸­ + åå¨éæ·å¢ï¼ + 4.12) ä»éº¼æ¯ OIDï¼ä»éº¼æ¯ CTID ï¼ + 4.13) çºä»éº¼ææ¶å°é¯èª¤è³è¨ãERROR: Memory exhausted in + AllocSetAlloc()ãï¼ + 4.14) æå¦ä½æè½ç¥éæéè¡ç PostgreSQL ççæ¬ï¼ + 4.15) æå¦ä½åµå»ºä¸åé è¨å¼æ¯ç¶åæéçæ¬ä½ï¼ + 4.16) å¦ä½å·è¡å¤é£æ¥ï¼outer joinï¼æ¥è©¢ï¼ + 4.17) å¦ä½å·è¡æ¶åå¤åè³æåº«çæ¥è©¢ï¼ + 4.18) å¦ä½è®å½æ¸è¿åå¤è¡æå¤åè³æï¼ + 4.19) çºä»éº¼æå¨ä½¿ç¨ PL/PgSQL 彿¸ååè¨æè¡¨æææ¶å°é¯èª¤è³è¨ãrelation + with OID ##### does not existãï¼ + 4.20) ç®åæåªäºè³æè¤å¯«(replication)æ¹æ¡å¯ç¨ï¼ + 4.21) çºä½æ¥è©¢çµæé¡¯ç¤ºçè¡¨åææ¬åèæçæ¥è©¢èªå¥ä¸­ + çä¸åï¼çºä½å¤§å¯«çæä¸è½ä¿çï¼ + _________________________________________________________________ + +常è¦åé¡ + + 1.1) PostgreSQL æ¯ä»éº¼ï¼è©²æéº¼ç¼é³ï¼ + + PostgreSQL è®ä½ Post-Gres-Q-Lï¼ææåä¹ç°¡ç¨±çºPostgres + ãæ³è½ä¸ä¸å¶ç¼é³ç人å¡å¯å¾é裡ä¸è¼è²é³æä»¶ï¼ MP3 æ ¼å¼ ã + + PostgreSQL æ¯é¢åç®æ¨çéä¿è³æåº«ç³»çµ±ï¼å®å·æå³çµ±å業 + è³æåº«ç³»çµ±çææåè½ï¼åæå嫿å°å¨ä¸ä¸ä»£ DBMS + 系統ç使ç¨çå¢å¼·ç¹æ§ãPostgreSQL + æ¯èªç±åè²»çï¼ä¸¦ä¸æææºä»£ç¢¼é½å¯ä»¥ç²å¾ã + + PostgreSQL + çéç¼éä¼ä¸»è¦çºå¿é¡èï¼ä»åéä½ä¸çåå°ä¸¦ééäºè¯ç¶²é²è¡è¯ç¹«ï¼éæ¯ä¸å社åéç¼é + ç®ï¼å®ä¸è¢«ä»»ä½å¬å¸æ§å¶ã + 妿³å å¥éç¼éä¼ï¼è«åè¦éç¼äººå¡å¸¸è¦åé¡ï¼FAQï¼ + http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html + + 1.2) 誰æ§å¶ PostgreSQL ï¼ + + å¦æä½ å¨å°æ¾PostgreSQLçæéäººï¼ææ¯ä»éº¼ä¸­ + 央å§å¡æï¼ææ¯ä»éº¼æå±¬å¬å¸ï¼ä½ åªè½æ¾æ£äº---å çºä¸åä¹ä¸å­ + å¨ï¼ä½æåç確æä¸å æ ¸å¿å§å¡æåCVS管ççµï¼ä½éäºå·¥ä½çµç設 + ç«ä¸»è¦æ¯çºäºé²è¡ç®¡çå·¥ä½è䏿¯å°PostgreSQLé²è¡ç¨ä½å¼æ§å¶ï¼PostgreSQLé + ç®æ¯ç±ä»»ä½äººå + å¯åå çéç¼äººå¡ç¤¾ååææç¨æ¶æ§å¶çï¼ä½ æéè¦åçå°±æ¯è¨é±éµä»¶å表ï¼åèè¨è«å³å + ¯ï¼è¦åèPostgreSQLçéç¼è©³è¦ éç¼äººå¡å¸¸åé¡ (Developer's FAQ) ç²åè³è¨ï¼ã + + 1.3) PostgreSQL ççæ¬æ¯ä»éº¼? + + PostgreSQLçç¼å¸éµå¾ç¶å¸ç BSD çæ¬ãå®åè¨±ç¨æ¶ä¸éç®çå°ä½¿ç¨ + PostgreSQLï¼çè³ä½ å¯ä»¥é·å® PostgreSQL + èä¸å«æºä»£ç¢¼ä¹å¯ä»¥ï¼å¯ä¸çéå¶å°±æ¯ä½ ä¸è½å è»é«èªèº«åé¡èåæå追訴æ³å¾ + 責任ï¼å¦å¤å°±æ¯è¦æ±ææçè»é«æ·è²ä¸é 忬以ä¸çæ¬è²æã + ä¸é¢å°±æ¯æåæä½¿ç¨çBSDçæ¬è²æå§å®¹ï¼ + + PostgreSQL è³æåº«ç®¡ç系統 + + é¨åçæ¬ï¼cï¼1996-2005ï¼PostgreSQL å¨çéç¼å°çµï¼é¨åçæ¬ï¼cï¼1994-1996 + å å·å¤§å¸è£äº + + ï¼Portions copyright (c) 1996-2005,PostgreSQL Global Development Group + Portions Copyright (c) 1994-6 Regents of the University of + Californiaï¼ + + å許çºä»»ä½ç®ç使ç¨ï¼æ·è²ï¼ä¿®æ¹ååç¼éåè»é«åå®çææªè䏿¶åä»»ä½è²»ç¨ï¼ + 並ä¸ç¡é ç°½ç½²å æ¤èç¢ççèæï¼åææ¯ä¸é¢ççæ¬è²æåæ¬æ®µä»¥åä¸é¢å©æ®µæå­ + åºç¾å¨æææ·è²ä¸ã + + ï¼Permission to use, copy, modify, and distribute this software and + its documentation for any purpose, without fee, and without a written + agreement is hereby granted, provided that the above copyright notice + and this paragraph and the following two paragraphs appear in all + copies.ï¼ + + å¨ä»»ä½ææ³ä¸ï¼å å·å¤§å¸é½ä¸æ¿æå ä½¿ç¨æ­ + ¤è»é«åå¶ææªèå°è´çå°ä»»ä½ç¶äºäººçç´æ¥çï¼ + 鿥çï¼ç¹æ®çï¼éå çæèç¸ä¼´èççæå£ï¼åæ¬å©çæå¤±ç責任ï¼å³ä½¿å å·å¤§å­ + ¸å·²ç¶å»ºè°äºéäºæå¤±çå¯è½æ§æä¹æ¯å¦æ¤ã + + ï¼IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY + PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA + HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.ï¼ + + å å·å¤§å¸æç¢ºæ¾æ£ä»»ä½ä¿èï¼åæ¬ä½ä¸å±éæ¼æä¸ç¹å®ç¨éç忥åå©ççé±å«ä¿èã + é裡æä¾çé份è»é«æ¯åºæ¼ãç¶ä½æ¯ãçåºç¤çï¼å èå å·å¤§å¸æ²æè²¬ä»»æä¾ç¶­ + è·ï¼æ¯æï¼æ´æ°ï¼å¢å¼·æèä¿®æ¹çæåã + + ï¼THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF + CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, + UPDATES, ENHANCEMENTS, OR MODIFICATIONS.ï¼ + + 1.4) PostgreSQL å¯ä»¥éè¡å¨åªäºä½æ¥ç³»çµ±å¹³å°ä¸ï¼ + + ä¸è¬èªªä¾ï¼ä»»ä½ç¾å¨å° UNIX ç¸å®¹ç使¥ç³»çµ±ä¹ä¸é½è½éè¡ PostgreSQL + ãå¨å®è£æå裡ååºäºç¼ä½æç¶éæç¢ºæ¸¬è©¦çå¹³å°ã + + PostgreSQL ä¹å¯ä»¥ç´æ¥éè¡å¨åºæ¼å¾®è» Windows-NT ç使¥ç³»çµ±ï¼å¦ + Win2000 SP4ï¼WinXP å Win2003ï¼å·²è£½ä½å®æçå®è£åå¯å¾ + http://pgfoundry.org/projects/pginstallerä¸è¼ï¼åºæ¼MSDOSçWindows使¥­ + 系統 ï¼Win95ï¼Win98ï¼WinMeï¼éè¦ééCygwin模æ¬ç°å¢éè¡PostgreSQLã + + åæä¹æä¸åçº Novell Netware 6 éç¼ççæ¬å¯å¾ http://forge.novell.com + ç²åï¼çºOS/2(eComStation)éç¼ççæ¬å¯å¾ + http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre + SQL&stype=all&sort=type&dir=%2F ä¸è¼ã + + 1.5) æå¾åªè£¡è½å¾å° PostgreSQLï¼ + + ééç覽å¨å¯å¾ http://www.postgresql.org/ftp/ ä¸è¼ï¼ä¹å¯ééFTPï¼å¾ + ftp://ftp.PostgreSQL.org/pub/ ç«é»ä¸è¼ã + + 1.6) ææ°çç PostgreSQL æ¯ä»éº¼ï¼ + + PostgreSQL ææ°ççæ¬æ¯çæ¬ 8.2.3 ã + + æåè¨åæ¯å¹´ç¼ä½ä¸å主è¦åç´çæ¬ï¼æ¯å¹¾åæç¼ä½ä¸åå°çæ¬ã + + 1.7) æå¾åªè£¡è½å¾å°å° PostgreSQL çæ¯æï¼ + + PostgreSQL社åéééµä»¶å表çºå¶å¤§å¤æ¸ç¨æ¶æä¾å¹«å©ï¼è¨é±éµä»¶å表ç主ç«é + »æ¯ + http://www.postgresql.org/community/lists/ï¼ä¸è¬ææ³ä¸ï¼åå å¥General æ + Bugéµä»¶å表æ¯ä¸åè¼å¥½çéå§ã + + 主è¦çIRCé »éæ¯å¨FreeNode(irc.freenode.net)ç#postgresqlï¼çºäºé£ä¸æ­ + ¤é »éï¼å¯ä»¥ä½¿ç¨ UNIX ç¨åº ircï¼å¶æä»¤æ ¼å¼ï¼ irc -c '#postgresql' + "$USER" irc.freenode.net ï¼æè使ç¨å¶ä»IRC客æ¶ç«¯ç¨åºã卿¤ç¶²çµ¡ä¸éå­ + å¨ä¸å PostgreSQL ç西ççé »é(#postgersql-es)åæ³èªé »é + (#postgresql-fr)ã忍£å°ï¼å¨ EFNET ä¸ä¹æä¸å PostgreSQL ç交æµé »éã + + 坿ä¾åæ¥æ¯æçå¬å¸å表å¯å¨ http://techdocs.postgresql.org/companies.php + ç覽ã + + 1.8) æå¦ä½æäº¤ä¸å BUG å ±åï¼ + + å¯è¨ªå http://www.postgresql.org/support/submitbugï¼å¡«å¯« Bug + ä¸å ±è¡¨æ ¼å³å¯ï¼å樣ä¹å¯è¨ªå ftp ç«é» ftp://ftp.PostgreSQL.org/pub/ + æª¢æ¥æç¡æ´æ°çPostgreSQL çæ¬æè£ä¸ã + + ééä½¿ç¨ Bug æäº¤è¡¨æ ¼ææ¯ç¼å¾ PostgreSQL éµä»¶å表ç Bug + é常ææä»¥ä¸ä¹ä¸åè¦ï¼ + * ææäº¤å§å®¹ä¸æ¯ä¸å Bug åå¶ä¸æ¯ Bug çåå ã + * ææäº¤å§å®¹æ¯ä¸åå·²ç¥ç Bug 並ä¸å·²ç¶å å¥ TODO å¾èçä»»åå表ã + * ææäº¤ç Bug å·²å¨ç¶åçæ¬ä¸è¢«ä¿®æ£ã + * ææäº¤ç Bug 已修æ£ä½å°æªå°è£ä¸å å¥ç¾å¨çç¼å¸è»é«åã + * è«æ±æäº¤èæä¾æ´è©³ç´°çè³è¨ï¼ + + 使¥ç³»çµ± + + PostgreSQL çæ¬ + + å¯éç¾ Bug çæ¸¬è©¦æ¡ä¾ + + 調試è³è¨ + + 調試è·è¹¤è¼¸åº + * ææäº¤å§å®¹æ¯ä¸åæ° Bugï¼å°å·è¡ä»¥ä¸å·¥ä½ï¼ + + åµå»ºä¸åæ°è£ä¸ä¸¦å°å¶å å¥ä¸ä¸å主è¦çæ¬ææ¯å°çæ¹é²çæ¬ä¸ã + + æ¤ Bug æ«æä¸è½ä¿®æ£ï¼å°è¢«å è³ TODO å¾èçä»»åå表ã + + 1.9) æå¦ä½ç解已ç¥ç BUG ææ«ç¼ºçåè½ï¼ + + PostgreSQL æ¯æä¸åæ´å±ç SQL:2003 çåéãå鱿åç TODO å表ï¼çè§£å·²ç¥ Bug + åè¡¨ãæ«ç¼ºçåè½åå°ä¾çéç¼è¨åã + + è¦æ±å¢å æ°åè½çç³è«éå¸¸ææ¶å°ä»¥ä¸ä¹ä¸çåè¦ï¼ + * 該åè½å·²å å¥ TODO å¾èçä»»åå表ã + * 該åè½ä¸æ¯å¿é çï¼å çºï¼ + + 宿¯ç¾æçä¸ç¬¦å SQL æ¨æºçæåè½çéè¤ã + + 該åè½æ§æå¤§å¤§å¢å 代碼çè¤éç¨åºï¼è帶ä¾çå¥½èæ¯å¾®ä¸è¶³éçã + + 該åè½æ¯ä¸å®å¨ææ¯ä¸å¯é çã + * 該åè½å°è¢«å å¥ TODO å¾èçä»»åå表ã + + PostgreSQL ä¸ä½¿ç¨ Bug è·è¹¤ç³»çµ±ï¼å çºæåç¼ç¾å¨éµä»¶å表中 + ç´æ¥åè¦ä»¥åä¿è TODO + ä»»åå表總æ¯èæ¼ææ°çæçæ¹å¼å·¥ä½æçææ´é«ä¸äºãäºå¯¦ä¸ï¼Bug䏿卿åçè»é«ä¸­ + åå¨å¾é·æéï¼ å°å½±é¿å¾å¤ç¨æ¶çBugä¹ç¸½æ¯å¾å¿«æè¢«ä¿®æ­ + £ãå¯ä¸è½æ¾å°æææ¹é²ãæé«åä¿®æ£çå°æ¹æ¯ CVS + çæ¥èªè³è¨ï¼å³ä½¿æ¯å¨è»é«æ°çæ¬çç¼å¸è³è¨ä¸ä¹ä¸æååºæ¯ä¸èçè»é«æ´æ°ã + + 1.10) è½å¤ ç²åçææ°ææªæåªäºï¼ + + PostgreSQL åå«å¤§éçææªï¼ä¸»è¦æè©³ç´°çåèæåï¼æåé åä¸äºç測試ä¾åãåè¦ + /doc ç®éï¼è¯è¨»ï¼æçº $PGHOME/docï¼ã ä½ éå¯ä»¥å¨ç·ç覽 PostgreSQL + çæåï¼å¶ç¶²åæ¯ï¼http://www.PostgreSQL.org/docsã + + æå©æ¬éæ¼PostgreSQLçæ¸å¨ç·æä¾ï¼å¨ + http://www.postgresql.org/docs/books/awbook.html å + http://www.commandprompt.com/ppbook/ ã 乿大éç PostgreSQL + æ¸ç±å¯ä¾è³¼è²·ï¼å¶ä¸æçºæµè¡ç䏿¬æ¯ç± Korry Douglas 編寫çãå¨ + http://techdocs.PostgreSQL.org/techdocs/bookreviews.phpä¸ ä¸æå¤§éæé + PostgreSQL æ¸ç±çç°¡ä»ã å¨ http://techdocs.PostgreSQL.org/ 䏿¶éäºæé + PostgreSQL ç大éæè¡æç« ã + + 客æ¶ç«¯çå½ä»¤è¡ç¨åºpsqlæä¸äºä»¥ \d éé ­ + çå½ä»¤ï¼å¯é¡¯ç¤ºéæ¼é¡åï¼æä½ç¬¦ï¼å½æ¸ï¼èåçè³è¨ï¼ä½¿ç¨ \? + å¯ä»¥é¡¯ç¤ºææå¯ç¨çå½ä»¤ã + + æåç web ç«é»å嫿´å¤çææªã + + 1.11) ææè©²ææ¨£å¸ç¿ SQL ï¼ + + é¦åèæ®ä¸è¿°æå°çèPostgreSQLç¸éçæ¸ç±ï¼å¦å¤ä¸æ¬æ¯ Teach Yourself SQL in + 21 Days, Second Editionï¼å¶è©³ç´°ä»ç´¹çç¶²åæ¯ + http://members.tripod.com/er4ebus/sql/index.htmï¼ æåç許å¤ç¨æ¶åæ¡The + Practical SQL Handbookï¼ Bowman, Judith S. + 編寫ï¼Addison-Wesleyå¬å¸åºçï¼å¶ä»çååæ¡ The Complete Reference SQL, + Groff 編寫ï¼McGraw-Hill å¬å¸åºçã + + å¨ä¸åç¶²åä¸ä¹æå¾å¥½çæç¨ï¼ä»åæ¯ + * http://www.intermedia.net/support/sql/sqltut.shtm + * http://sqlcourse.com. + * http://www.w3schools.com/sql/default.asp + * http://mysite.verizon.net/Graeme_Birchall/id1.html + + 1.12)å¦ä½æäº¤è£ä¸ææ¯å å¥éç¼éä¼ï¼ + + è©³è¦ éç¼äººå¡å¸¸è¦åé¡ (Developer's FAQ) ã + + 1.13) PostgreSQL åå¶ä»è³æåº«ç³»çµ±æ¯èµ·ä¾å¦ä½ï¼ + + è©å¹è»é«æå¥½å¹¾ç¨®æ¹æ³ï¼åè½ï¼æ§è½ï¼å¯é æ§ï¼æ¯æå广 ¼ã + + åè½ + PostgreSQL ææå¤§ååç¨è³æåº«æå¤çåè½ï¼ä¾å¦ï¼äºåï¼å­ + æ¥è©¢ï¼è§¸ç¼å¨ï¼è¦åï¼å¤éµåè宿´æ§åè¤éçéå®çã + æåéæä¸äºå®åæ²æçç¹æ§ï¼å¦ç¨æ¶å®ç¾©é¡åï¼ç¹¼æ¿ï¼è¦ååå¤çæ¬ä¸¦è¡æ§å¶ä + »¥æ¸å°éççç¨çã + + æ§è½ + PostgreSQLåå¶ä»åç¨åéæºçè³æåº«å·æé¡ä¼¼çæ§è½ãå°æäºèç宿¯è¼å¿«ï¼å° + å¶ä»ä¸äºèç宿¯è¼æ¢ã èå¶ä»è³æåº«ç¸æ¯ï¼æåçæ§è½åªå£éå¸¸å¨ +/- + 10%ä¹éã + + å¯é æ§ + æåé½ç¥éè³æåº«å¿é æ¯å¯é çï¼å¦åå®å°±ä¸é»ç¨é½æ²æãæååªååå°ç¼ä½ç¶éèª + çæ¸¬è©¦çï¼ç¼ºé·æå°çç©©å®ä»£ç¢¼ãæ¯åçæ¬è³å°æä¸åæç beta + 測試æéï¼ä¸¦ä¸æåçç¼å¸æ­ + ·å²é¡¯ç¤ºæåå¯ä»¥æä¾ç©©å®çï¼ç¢åºçï¼å¯ç¨æ¼çç¢ä½¿ç¨ççæ¬ãæåç¸ä¿¡å¨é + æ¹é¢æåèå¶ä»çè³æåº«è»é«æ¯ç¸ç¶çã + + æ¯æ + æåçéµä»¶å表æä¾ä¸åé常大çéç¼äººå¡åç¨æ¶ççµä»¥å¹«å©è§£æ±ºæç¢°å°ç + ä»»ä½åé¡ãæåä¸è½ä¿è­ + 總æ¯è½è§£æ±ºåé¡ï¼ç¸æ¯ä¹ä¸ï¼åç¨è³æåº«è»é«ä¹ä¸¦ä¸æ¯ç¸½è½å¤ æä¾è§ + £æ±ºæ¹æ³ã + ç´æ¥èéç¼äººå¡ï¼ç¨æ¶ç¾¤ï¼æååæºç¨åºæ¥è§¸ä½¿PostgreSQLçæ¯ææ¯å¶ä»è³ + æåº«éè¦å¥½ãéæä¸äºå業 + æ§çå¨é¢æè¡æ¯æï¼å¯ä»¥çµ¦æä¾çµ¦é£äºéè¦ç人ãï¼åé±1.7 å°ç¯ï¼ + + 广 ¼ + æåå°ä»»ä½ç¨éé½åè²»ï¼åæ¬åç¨åéåç¨ç®çã + ä½ å¯ä»¥ä¸å éå¶å°åä½ çç¢å裡å 奿åç代碼ï¼é¤äºé£äºæåå¨ä¸é¢ççæ¬ + è²æè£¡è²æç BSDçæ¬ä¹å¤çå§å®¹ã + + 1.14) PostgreSQL å¯ä»¥èçæè¿ååå家夿å¶çè®åå? + + PostgreSQL 8.0ä¹åççæ¬æ¯ä½¿ç¨ä½æ¥ç³»çµ±ä¸çæåè³æåº«ä¾èç夿å¶çè³è¨ï¼èª + 8.0 çå以å¾ççæ¬ PostgreSQL æèªèº«å«æææ°çæåè³è¨ã + _________________________________________________________________ + +ç¨æ¶å®¢æ¶ç«¯åé¡ + + 2.1) æåå¯ä»¥ç¨ä»éº¼èªè¨å PostgreSQL é²è¡æºéï¼ + + PostgreSQL (é è¨ææ³)åªå®è£æ C åå§åµå¼ C + çæ¥å£ï¼å¶ä»çæ¥å£é½æ¯ç¨ç«çé ç®ï¼è½å¤ åå¥ä¸è¼ï¼éäºæ¥å£é ç®ç¨ç«ç好è + æ¯ä»åå¯ä»¥æåèªçç¼å¸è¨åååèªç¨ç«çéç¼çµã + + ä¸äºç·¨ç¨èªè¨å¦ PHP é½æè¨ªå PostgreSQL çæ¥å£ï¼PerlãTCLãPython + 以åå¾å¤å¶ä»èªè¨çæ¥å£å¨ http://gborg.postgresql.org ç¶²ç«ä¸ç + Drivers/Interfaces å°ç¯å¯æ¾å°ï¼ 並ä¸éé Internet å¾å®¹ææç´¢å°ã + + 2.2) æä»éº¼å·¥å·å¯ä»¥æ PostgreSQL ç¨æ¼ Web é é¢ï¼ + + ä¸åä»ç´¹ä»¥è³æåº«çºå¾å°çæºä¸é¯çç«é»æ¯ï¼http://www.webreview.comã + + å°æ¼ Web éæï¼PHP æ¯ä¸åæ¥µå¥½çæ¥å£ãå®å¨ http://www.php.net/ã + + å°æ¼è¤éçä»»åï¼å¾å¤äººæ¡ç¨ Perl æ¥å£å ä½¿ç¨ CGI.pm ç DBD::Pg æ mod_perl + ã + + 2.3)PostgreSQL ææåå½¢ç¨æ¶çé¢åï¼ + + åæ¥ç¨æ¶ææ¯éæºéç¼äººå¡è½æ¾å°å¾å¤çæé PostgreSQLçGUI å形工å·è»é«ï¼å¨ + PostgreSQLç¤¾åææª æä¸å詳細çå表ã + _________________________________________________________________ + +系統管çåé¡ + + 3.1)æææ¨£è½æ PostgreSQL è£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼ + + å¨éè¡ configure æå ä¸ --prefix é¸é ã + + 3.2) æå¦ä½æ§å¶ä¾èªå¶ä»é»è¦ç飿¥ï¼ + + é è¨ææ³ä¸ï¼PostgreSQL åªå許ä¾èªæ¬æ©ä¸éé unix å奿¥åæ TCP/IP + æ¹å¼ç飿¥ã ä½ åªæå¨ä¿®æ¹äºéç½®æä»¶ postgresql.conf ä¸ç + listen_addressesï¼ä¸ä¹å¨éç½®æä»¶ $PGDATA/pg_hba.conf 䏿éäº + åºæ¼é ç¨é»è¦ï¼ host-based ï¼ç身份èªèï¼ä¸¦éæ°åå + PostgreSQLï¼å¦åå¶ä»é»è¦æ¯ä¸è½èä½ ç PostgreSQL 伺æå¨é²è¡é£æ¥çã + + 3.3) æææ¨£èª¿æ´è³æåº«å¼æä»¥ç²å¾æ´å¥½çæ§è½ï¼ + + æä¸åä¸»è¦æ¹é¢å¯ä»¥æå PostgreSQL çæ½è½ã + + æ¥è©¢æ¹å¼çè®å + éä¸»è¦æ¶åä¿®æ¹æ¥è©¢æ¹å¼ä»¥ç²åæ´å¥½çæ§è½: + + + åµå»ºç´¢å¼ï¼åæ¬è¡¨éå¼åé¨åç´¢å¼ï¼ + + ä½¿ç¨ COPY èªå¥ä»£æ¿å¤å Insert èªå¥ï¼ + + å°å¤åSQLèªå¥çµæä¸åäºå以æ¸å°æäº¤äºåçéé·ï¼ + + å¾ä¸åç´¢å¼ä¸æå夿¢è¨éæä½¿ç¨ CLUSTERï¼ + + å¾ä¸åæ¥è©¢çµæä¸ååºé¨åè¨éæä½¿ç¨ LIMITï¼ + + 使ç¨é ç·¨è¯å¼æ¥è©¢ï¼Prepared Query)ï¼ + + ä½¿ç¨ ANALYZE ä»¥ä¿æç²¾ç¢ºçåªåçµ±è¨ï¼ + + å®æä½¿ç¨ VACUUM æ pg_autovacuum + + é²è¡å¤§éè³ææ´æ¹æååªé¤ç´¢å¼ï¼ç¶å¾é建索å¼ï¼ + + 伺æå¨çéç½® + éç½®æä»¶ postgres.conf ä¸çå¾å¤è¨­ + ç½®é½æå½±é¿æ§è½ï¼ææåæ¸çå表å¯è¦ï¼ + 管ç塿å/è³æåº«ä¼ºæå¨éè¡ç°å¢/è³æåº«ä¼ºæå¨éè¡éç½®ï¼ + æé忏çè§£éå¯è¦ï¼http://www.varlena.com/varlena/GeneralBits/Tidb + its/annotated_conf_e.html å + http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.htmlã + + 硬é«ç鏿 + é»è¦ç¡¬é«å°æ§è½çå½±é¿å¯ç覽 + http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde + x.html å http://www.powerpostgresql.com/PerfList/ã + + 3.4)PostgreSQL 裡å¯ä»¥ç²å¾ä»éº¼æ¨£çèª¿è©¦ç¹æ§ï¼ + + PostgreSQL æå¾å¤é¡ä¼¼ log_* + ç伺æå¨éç½®è®éå¯ç¨æ¼æ¥è©¢çåå°åé²ç¨çµ±è¨ï¼èéäºå·¥ä½å°èª¿è©¦åæ§è½æ¸¬è©¦å + ¾æå¹«å©ã + + 3.5) çºä»éº¼å¨è©¦å飿¥ææ¶å°ãSorry, too many + clientsï¼å·²æå¤ªå¤ç¨æ¶é£æ¥ï¼ãæ¶æ¯ï¼ + + éè¡¨ç¤ºä½ å·²éå°é è¨ 100 å並ç¼(åä½)å¾å°é²ç¨æ¸çéå¶ï¼ä½ éè¦ééä¿®æ¹ + postgresql.conf æä»¶ä¸ç max_connections å¼ä¾ å¢å postmaster + çå¾å°ä½µç¼èçæ¸ï¼ä¿®æ¹å¾ééæ°åå postmasterã + + 3.6)PostgreSQL çåç´éç¨æåªäºå§å®¹ ï¼ + + PostgreSQL éç¼çµå°æ¯æ¬¡å°çæ¬çåç´ä¸»è¦åªåäºä¸äº Bug ä¿®æ£å·¥ä½ï¼å æ¤å¾ + 7.4.8 åç´å° 7.4.9 ä¸éè¦ dump å restoreï¼åéè¦åæ­ + ¢è³æåº«ä¼ºæå¨ï¼å®è£æ´æ°å¾çè»é«åï¼ç¶å¾éå伺æå¨å³å¯ã + + ææPostgreSQLçç¨æ¶æè©²å¨ææ¥è¿ï¼ä½ æä½¿ç¨çä¸»çæ¬ï¼çå°æ¹é²çæ¬ç¼ä½ç¡å¿«åç´ + ãåç®¡æ¯æ¬¡åç´å¯è½é½æä¸é»é¢¨éªï¼PostgreSQLçå°æ¹ é²çå忝è¨è¨ç¨ä¾ä¿®æ­ + £ä¸äº Bug + çï¼ç¨å¼ç¢¼æ¹åè¼å°ï¼æä»¥é¢¨éªéæ¯å¾å°çãPostgreSQL社åèªçºä¸è¬ææ³ä¸ä¸åç´ç + 風éªéæ¯å¤æ¼åç´çã + + ä¸»çæ¬çåç´ï¼ä¾å¦å¾ 7.3 å° 7.4ï¼é常æä¿®æ¹ç³»çµ±è¡¨åè³æè¡¨çå§é¨æ ¼å¼ã + éäºæ¹è®ä¸è¬æ¯è¼è¤éï¼å æ¤æåä¸ç¶æè³ææä»¶çåå¾å¼å®¹æ§ãå æ¤å¾èçæ¬ä¸­ + é²è¡è³æå°åºï¼dumpï¼/ç¶å¾å¨æ°çæ¬ä¸­ + é²è¡è³æå°å¥ï¼reloadï¼å°ä¸»çæ¬çåç´æ¯å¿é çã + + 3.7)(ä½¿ç¨ PostgreSQL )æéè¦ä½¿ç¨ä»éº¼é»è¦ç¡¬é« ï¼ + + ç±æ¼é»è¦ç¡¬é«å¤§å¤æ¸æ¯ç¸å®¹çï¼äººå總æ¯å¾åæ¼ç¸ä¿¡ææé»è¦ç¡¬é«è³ªé乿¯ç¸ + åçãäºå¯¦ä¸ä¸æ¯ï¼ ECC RAMï¼å¸¶å¥å¶æ ¡é©çè¨æ¶é«ï¼ï¼SCSI + ï¼ç¡¬ç¢ï¼ååªè³ªçä¸»æ©æ¿æ¯ä¸äºä¾¿å®è²¨è¦æ´å å¯é ä¸å·ææ´å¥½çæ§è½ã + PostgreSQL å¹¾ä¹å¯ä»¥éè¡å¨ä»»ä½ç¡¬é«ä¸ï¼ + ä½å¦æå¯é æ§åæ§è½å°ä½ ç系統å¾éè¦ï¼ä½ å°±éè¦å¨é¢çç ç©¶ä¸ä¸ä½ ç硬é«çµæ + äºã卿åçéµä»¶å表ä¸ä¹æéæ¼ ç¡¬é«éç½®åæ§å¹æ¯çè¨è«ã + _________________________________________________________________ + +æä½åé¡ + + 4.1) å¦ä½åªé¸æä¸åæ¥è©¢çµæçé å¹¾è¡ï¼ææ¯é¨æ©çä¸è¡ï¼ + + å¦æä½ åªæ¯è¦æåå¹¾è¡è³æï¼ä¸¦ä¸ä½ å¨å·è¡æ¥è©¢ä¸­ + ç¥é確åçè¡æ¸ï¼ä½ å¯ä»¥ä½¿ç¨ LIMIT åè½ã 妿æä¸åç´¢å¼è ORDER BY 中 + çæ¢ä»¶å¹éï¼PostgreSQL å¯è½å°±åªèçè¦æ±çé å¹¾æ¢è¨éï¼ + ï¼å¦åå°å°æ´åæ¥è©¢é²è¡èçç´å°çæéè¦çè¡ï¼ã妿å¨å·è¡æ¥è©¢åè½æä¸ç¥é確åçè¨éæ + ¸ï¼ å¯ä½¿ç¨æ¸¸æ¨(cursor)åFETCHåè½ã + + å¯ä½¿ç¨ä»¥ä¸æ¹æ³æåä¸è¡é¨æ©è¨éçï¼ + SELECT cols + FROM tab + ORDER BY random() + LIMIT 1 ; + + 4.2) + å¦ä½æ¥ç表ãç´¢å¼ãè³æåº«ä»¥åç¨æ¶çå®ç¾©ï¼å¦ä½æ¥çpsql裡ç¨å°çæ¥è©¢æä»¤ä¸¦é¡¯ç¤ºå + ®åï¼ + + å¨psqlä¸ä½¿ç¨ \dt å½ä»¤ä¾é¡¯ç¤ºè³æè¡¨çå®ç¾©ï¼è¦çè§£ psql 中 + ç宿´å½ä»¤å表å¯ä½¿ç¨ \? ï¼å¦å¤ï¼ä½ ä¹å¯ä»¥é±è® psql çæºä»£ç¢¼ æä»¶ + pgsql/src/bin/psql/describe.cï¼å®åæ¬çºçæ psql åææ§å½ä»¤ç輸åºçææ SQL + å½ä»¤ãä½ éå¯ä»¥å¸¶ -E é¸é åå psqlï¼ éæ¨£å®å°åå°åºä½ å¨ psql 中 + æçµ¦åºçå½ä»¤å·è¡æçå§é¨å¯¦é使ç¨ç SQL + æ¥è©¢èªå¥ãPostgreSQL乿ä¾äºä¸åå¼å®¹ SQLç INFORMATION SCHEMA æ¥å£ï¼ + ä½ å¯ä»¥å¾é裡ç²åéæ¼è³æåº«çè³è¨ã + + å¨ç³»çµ±ä¸ä¹æä¸äºä»¥ pg_ æé çç³»çµ±è¡¨ä¹æè¿°äºè¡¨çå®ç¾©ã + + ä½¿ç¨ psql -l æä»¤å¯ä»¥ååºææçè³æåº«ã + + ä¹å¯ä»¥ç覽ä¸ä¸ pgsql/src/tutorial/syscat.source + æä»¶ï¼å®åèäºå¾å¤å¯å¾è³æåº«ç³»çµ±è¡¨ä¸ç²åè³è¨çSELECTèªæ³ã + + 4.3) å¦ä½æ´æ¹ä¸åæ¬ä½çè³æé¡åï¼ + + å¨8.0çæ¬è£¡æ´æ¹ä¸åæ¬ä½çè³æé¡åå¾å®¹æï¼å¯ä½¿ç¨ ALTER TABLE ALTER COLUMN + TYPE ã + + å¨ä»¥åççæ¬ä¸ï¼å¯ä»¥é樣åï¼ + BEGIN; + ALTER TABLE tab ADD COLUMN new_col new_data_type; + UPDATE tab SET new_col = CAST(old_col AS new_data_type); + ALTER TABLE tab DROP COLUMN old_col; + COMMIT; + + ä½ ç¶å¾å¯ä»¥ä½¿ç¨ VACUUM FULL tab æä»¤ä¾ä½¿ç³»çµ±æ¶åç¡æè³ææä½ç¨ç空éã + + 4.4) 宿¢è¨éï¼å®å表ï¼å®åè³æåº«çæå¤§éå¶æ¯å¤å°ï¼ + + ä¸é¢æ¯ä¸äºéå¶ï¼ + + å®åè³æåº«æå¤§å°ºå¯¸ï¼ ç¡éå¶ï¼å·²å卿 32TB çè³æåº«ï¼ + å®å表çæå¤§å°ºå¯¸ï¼ 32 TB + ä¸è¡è¨éçæå¤§å°ºå¯¸ï¼ 1.6 TB + ä¸åæ¬ä½çæå¤§å°ºå¯¸? 1 GB + ä¸å表裡æå¤§åæ¸ï¼ ç¡éå¶ + ä¸å表裡æå¤§æ¬ä½æ¸ï¼ 250-1600 ï¼èåé¡åæéï¼ + ä¸å表裡çæå¤§ç´¢å¼æ¸éï¼ ç¡éå¶ + + ç¶ç¶ï¼å¯¦é䏿²æçæ£çç¡éå¶ï¼éæ¯è¦åå¯ç¨ç£ç¤ç©ºéãå¯ç¨è¨æ¶é«/交æåçå¶ç´ã + äºå¯¦ä¸ï¼ç¶ä¸è¿°éäºæ¸å¼è®å¾ç°å¸¸å°å¤§æï¼ç³»çµ±æ§è½ä¹æåå¾å¤§å½±é¿ã + + å®è¡¨çæå¤§å¤§å° 32 TB ä¸éè¦ä½æ¥­ + 系統å°å®åæä»¶ä¹éééº¼å¤§çæ¯æã大表ç¨å¤å 1 GB çæä»¶åå²ï¼å æ­ + ¤æä»¶ç³»çµ±å¤§å°çéå¶æ¯ä¸éè¦çã + + 妿é è¨çå¡å¤§å°å¢é·å° 32K ï¼æå¤§çå®è¡¨å¤§å°åæå¤§åæ¸éå¯ä»¥å¢å å°ååã + + æä¸åéå¶å°±æ¯ä¸è½å°å¤§å°å¤æ¼2000å­ + ç¯çååµå»ºç´¢å¼ã幸éå°æ¯é樣çç´¢å¼å¾å°ç¨å°ãééå°å¤å­ + ç¯åçå§å®¹é²è¡MD5åç¨éç®çµæé²è¡å½æ¸ç´¢å¼å¯å°åçå¯ä¸æ§å¾å°ä¿èï¼ + 並ä¸å¨ææª¢ç´¢å許å°åä¸çå®è©é²è¡æç´¢ã + + 4.5) åå²ä¸åå¸åçææ¬æä»¶è£¡çè³æéè¦å¤å°ç£ç¤ç©ºéï¼ + + ä¸å Postgres è³æåº«ï¼å­ + å²ä¸åææ¬æä»¶ï¼æä½ç¨ç空éæå¤å¯è½éè¦ç¸ç¶æ¼éåææ¬æä»¶èªèº«å¤§å°5åçç£ç¤ç©ºé + ã + + ä¾å¦ï¼åè¨æä¸å 100,000 è¡çæä»¶ï¼æ¯è¡æä¸åæ´æ¸åä¸åææ¬æè¿°ã å設 + ææ¬ä¸²çå¹³åé·åº¦çº20ä½åçµ(Byte)ãææ¬æä»¶ä½ç¨ 2.8 MBãå­ + æ¾éäºè³æçPostgreSQLè³æåº«æä»¶å¤§ç´æ¯ 5.2 MB: + 24 ååçµ: æ¯è¡çé ï¼å¤§ç´å¼ï¼ + 24 ååçµç¯: ä¸åæ´æ¸åæ¬ä½åä¸åææ¬åæ¬ä½ + + 4 ååçµç¯: é é¢å§æååçµçæé + ---------------------------------------- + 52 ååçµæ¯è¡ + + PostgreSQL è³æé ç大尿¯ 8192 ä½åçµ (8 KB)ï¼åï¼ + + 8192 ååçµæ¯é + ------------------- = 158 è¡/è³æé ï¼åä¸åæ´ï¼ + 52 ååçµæ¯è¡ + + 100000 è³æè¡ + -------------------- = 633 è³æé ï¼åä¸åæ´ï¼ + 146 è¡/è³æé + + 633 è³æé * 8192 åç¯/é = 5,185,536 åç¯ï¼5.2 MBï¼ + + ç´¢å¼ä¸éè¦é麼å¤çé¡å¤æ¶èï¼ä½ä¹ç¢ºå¯¦åæ¬è¢«ç´¢å¼çè³æï¼å æ­ + ¤å®åä¹å¯è½å¾å¤§ã + + ç©ºå¼ NULL åæ¾å¨ä½åä¸ï¼å æ¤ä½ç¨å¾å°ç空éã + + 4.6) çºä»éº¼æçæ¥è©¢å¾æ¢ï¼çºä»éº¼éäºæ¥è©¢æ²æå©ç¨ç´¢å¼ï¼ + + ä¸¦éæ¯åæ¥è©¢é½æèªå使ç¨ç´¢å¼ãåªæå¨è¡¨ç大å°è¶éä¸åæå°å¼ï¼ä¸¦ä¸æ¥è©¢åªæé + ¸ä¸è¡¨ä¸è¼å°æ¯ä¾çè¨éææææ¡ç¨ç´¢å¼ã 鿝å çºç´¢å¼æçå¼èµ·çé¨å³ç£ç¤å­ + åå¯è½æ¯ç´æ¥å°è®å表ï¼é åºæçï¼æ´æ¢ã + + çºäºå¤æ·æ¯å¦ä½¿ç¨ç´¢å¼ï¼PostgreSQL + å¿é ç²å¾æé表ççµ±è¨å¼ãéäºçµ±è¨å¼å¯ä»¥ä½¿ç¨ VACUUM ANALYZEï¼æ ANALYZE + ç²å¾ã 使ç¨çµ±è¨å¼ï¼åªåå¨ç¥é表中 + æå¤å°è¡ï¼å°±è½å¤ æ´å¥½å°å¤æ·æ¯å¦å©ç¨ç´¢å¼ã + çµ±è¨å¼å°ç¢ºå®åªåç飿¥é åºå飿¥æ¹æ³ä¹å¾æç¨ãå¨è¡¨çå§å®¹ç¼çè®åæï¼æå®æé²è + ¡çµ±è¨å¼çæ´æ°æ¶éã + + ç´¢å¼é常ä¸ç¨æ¼ ORDER BY + æå·è¡é£æ¥ãå°ä¸å大表ç䏿¬¡é åºæçåå䏿¬¡æåºé常æ¯ç´¢å¼æçè¦å¿«ãç¶èï¼å¦æ + å° LIMIT å ORDER BY + çµåå¨ä¸èµ·ä½¿ç¨ç話ï¼éå¸¸å°æä½¿ç¨ç´¢å¼ï¼å çºéæåè¿å表ä¸çä¸å°é¨åè¨éã + + å¦æä½ ç¢ºä¿¡PostgreSQLçåªåå¨ä½¿ç¨é åºæçæ¯ä¸æ£ç¢ºçï¼ä½ å¯ä»¥ä½¿ç¨SET + enable_seqscan TO 'off'æä»¤ä¾ééé åºæçï¼ + ç¶å¾å次éè¡æ¥è©¢ï¼ä½ å°±å¯ä»¥çåºä½¿ç¨ä¸åç´¢å¼æçæ¯å¦ç¢ºå¯¦è¦å¿«ä¸äºã + + ç¶ä½¿ç¨éé符æä½ï¼ä¾å¦ LIKE æ ~ æï¼ç´¢å¼åªè½å¨ç¹å®çææ³ä¸ä½¿ç¨ï¼ + * å符串çéå§é¨åå¿é æ¯æ®éå符串ï¼ä¹å°±æ¯èªªï¼ + + LIKE 模å¼ä¸è½ä»¥ % æé ã + + ~ ï¼æ£å表éå¼ï¼æ¨¡å¼å¿é 以 ^ æé ã + * å符串ä¸è½ä»¥å¹éå¤ååç¬¦çæ¨¡å¼é¡æé ï¼ä¾å¦ [a-e]ã + * 大å°å¯«ç¡éçæ¥æ¾ï¼å¦ ILIKE å ~* çä¸ä½¿ç¨ç´¢å¼ï¼ä½å¯ä»¥ç¨ 4.8 + ç¯æè¿°ç表éå¼ç´¢å¼ã + * å¨å initdb æå¿é æ¡ç¨é è¨çæ¬å°è¨ç½® C + localeï¼å çºç³»çµ±ä¸å¯è½ç¥éå¨é C locale ææ³æä¸ä¸åæå¤§å符æ¯ä»éº¼ã + å¨éç¨®ææ³ä¸ï¼ä½ å¯ä»¥åµå»ºä¸åç¹æ®ç text_pattern_ops ç´¢å¼ä¾ç¨æ¼ + LIKE çç´¢å¼ã + + å¨ 8.0 ä¹åççæ¬ä¸­ + ï¼é¤éè¦æ¥è©¢çè³æé¡ååç´¢å¼çè³æé¡åç¸å¹éï¼å¦åç´¢å¼ç¶å¸¸æ¯æªè¢«ç¨å°ï¼ç¹å¥æ + ¯å° int2, int8 忏å¼åçç´¢å¼ã + + 4.7) æå¦ä½æè½çå°æ¥è©¢åªå卿¯ææ¨£è©ä¼°èçæçæ¥è©¢ï¼ + + åè EXPLAIN æåé ã + + 4.8) æææ¨£åæ£å表éå¼æç´¢å大å°å¯«ç¡éçæ­ + £å表é弿¥æ¾ï¼ææ¨£å©ç¨ç´¢å¼é²è¡å¤§å°å¯«ç¡éæ¥æ¾ï¼ + + æä½ç¬¦ ~ èçæ£å表éå¼å¹éï¼è ~* èç大å°å¯«ç¡éçæ£å表éå¼å¹éã大å°å¯«ç¡éç + LIKE è®ç¨®æçº ILIKEã + + 大å°å¯«ç¡éçç弿¯è¼é常寫åï¼ + SELECT * + FROM tab + WHERE lower(col) = 'abc'; + + 鿍£å°ä¸æä½¿ç¨æ¨æºçç´¢å¼ã使¯å¯ä»¥åµå»ºä¸åå¨éç¨®ææ³ä¸ä½¿ç¨ç表éå¼ç´¢å¼ + : + CREATE INDEX tabindex ON tab (lower(col)); + + 妿ä¸è¿°ç´¢å¼å¨åµå»ºæå å¥ UNIQUE ç´æï¼éç¶ç´¢å¼æ¬ä½èªèº«å§å®¹å¯ä»¥å­ + å²å¤§å°å¯«ä¸éçå§å®¹ï¼ä½å¦ææ UNIQUE + ç´æå¾ï¼éäºå§å®¹ä¸è½å忝大å°å¯«ä¸åï¼å¦åæé æè¡çªï¼ãçºäºä¿è­ + ä¸ç¼çéç¨®ææ³ï¼å¯ä»¥ä½¿ç¨ CHECK ç´ææ¢ä»¶ææ¯è§¸ç¼å¨å¨é奿é²è¡éå¶ã + + 4.9) å¨ä¸åæ¥è©¢è£¡ï¼æææ¨£æª¢æ¸¬ä¸åæ¬ä½æ¯å¦çº NULL + ï¼æå¦ä½æè½æºç¢ºæåºèä¸è«ææ¬ä½æ¯å¦å« NULL å¼ï¼ + + ç¨ IS NULL å IS NOT NULL 測試é忬ä½ï¼å·é«æ¹æ³å¦ä¸ï¼ + SELECT * + FROM tab + WHERE col IS NULL; + + çºäºè½å°å« NULL æ¬ä½æåºï¼å¯å¨ ORDER BY æ¢ä»¶ä¸ä½¿ç¨ IS NULL å IS NOT + NULL ä¿®é£¾ç¬¦ï¼æ¢ä»¶çºç true å°æ¯æ¢ä»¶çºå false æå¨åé¢ï¼ä¸é¢çä¾å­ + å°±æå°å« NULL çè¨éæå¨çµæçä¸é¢é¨åï¼ + SELECT * + FROM tab + ORDER BY (col IS NOT NULL) + + 4.10) å種å符é¡åä¹éæä»éº¼ä¸åï¼ + + é¡å å§é¨å稱 說æ + VARCHAR(n) varchar æå®äºæå¤§é·åº¦ï¼è®é·å­ + 符串ï¼ä¸è¶³å®ç¾©é·åº¦çé¨åä¸è£é½ + CHAR(n) bpchar å®é·å符串ï¼å¯¦éè³æä¸è¶³å®ç¾©é·åº¦æï¼ä»¥ç©ºæ ¼è£é½ + TEXT text æ²æç¹å¥çä¸ééå¶ï¼ååè¡çæå¤§é·åº¦éå¶ï¼ + BYTEA bytea è®é·åç¯åºåï¼ä½¿ç¨NULLåç¬¦ä¹æ¯å許çï¼ + "char" char å®åå符 + + å¨ç³»çµ±è¡¨åå¨ä¸äºé¯èª¤è³è¨è£¡ä½ å°çå°å§é¨å稱ã + + ä¸é¢æåçåå種é¡åæ¯ "varlena"ï¼è®é·ï¼é¡åï¼ä¹å°±æ¯èªªï¼éé çååå­ + ç¯æ¯é·åº¦ï¼å¾é¢ææ¯è³æï¼ã æ¼æ¯å¯¦éä½ç¨çç©ºéæ¯è²æç大å°è¦å¤ä¸äºã + ç¶èéäºé¡åå¦å®ç¾©å¾é·æé½å¯ä»¥è¢«å£ç¸®åå²ï¼å æ­ + ¤ç£ç¤ç©ºéä¹å¯è½æ¯é æ³çè¦å°ã + + VARCHAR(n) å¨åå²éå¶äºæå¤§é·åº¦çè®é·åç¬¦ä¸²æ¯æå¥½çã TEXT é©ç¨æ¼å­ + 岿大å¯é 1G å·¦å³ä½æªå®ç¾©éå¶é·åº¦çå符串ã + + CHAR(n) æé©åæ¼åå²é·åº¦ç¸åçå符串ã + CHAR(n)ææ ¹ææçµ¦å®çæ¬ä½é·åº¦ä»¥ç©ºæ ¼è£è¶³ï¼ä¸è¶³çæ¬ä½å§å®¹ï¼ï¼ è + VARCHAR(n) åªåå²æçµ¦å®çè³æå§å®¹ã BYTEA ç¨æ¼åå²äºé²å¶è³æï¼å°¤å¶æ¯åå« + NULL åç¯çå¼ãéäºé¡åå·æå·®ä¸å¤çæ§è½ã + + 4.11.1) æææ¨£åµå»ºä¸ååºåèææ¯èªåéå¢çæ¬ä½ï¼ + + PostgreSQL æ¯æ SERIAL + è³æé¡åãï¼æ¬ä½å®ç¾©çºSERIALå¾ï¼å°èªååµå»ºä¸ååºåçæå¨ï¼ä¾å¦ï¼ + CREATE TABLE person ( + id SERIAL, + name TEXT + ); + + æèªåè½æçºä»¥ä¸SQLèªå¥ï¼ + CREATE SEQUENCE person_id_seq; + CREATE TABLE person ( + id INT4 NOT NULL DEFAULT nextval('person_id_seq'), + name TEXT + ); + + åè create_sequence æåé ç²åéæ¼åºåçæå¨çæ´å¤è³è¨ã + + 4.11.2) æå¦ä½ç²å¾ä¸åæå¥çåºåèçå¼ï¼ + + ä¸ç¨®æ¹æ³æ¯å¨æå¥ä¹ååç¨å½æ¸ nextval() å¾åºåå°è±¡è£¡æª¢ç´¢åºä¸ä¸å SERIAL + å¼ï¼ç¶å¾åç¨æ¤å¼ç²¾ç¢ºå°æå¥ãä½¿ç¨ 4.11.1 裡çä¾è¡¨ï¼å¯ç¨å½ç¢¼é樣æè¿°ï¼ + new_id = execute("SELECT nextval('person_id_seq')"); + execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); + + 鿍£éè½å¨å¶ä»æ¥è©¢ä¸ä½¿ç¨åæ¾å¨ new_id è£¡çæ°å¼ï¼ä¾å¦ï¼ä½çºåç§ person + 表çå¤éµï¼ã 注æèªååµå»ºç SEQUENCE å°è±¡çåç¨±å°ææ¯ +
__seqï¼ é裡 table å serialcolumn + å奿¯ä½ ç表çå稱åä½ ç SERIAL æ¬ä½çå稱ã + + é¡ä¼¼çï¼å¨ SERIAL å°è±¡é è¨æå¥å¾ä½ å¯ä»¥ç¨å½æ¸ currval() 檢索å賦å¼ç + SERIAL å¼ï¼ä¾å¦ï¼ + execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); + new_id = execute("SELECT currval('person_id_seq')"); + + 4.11.3) åæä½¿ç¨ currval() æå°è´åå¶ä»ç¨æ¶çè¡çªææ³åï¼ + + 䏿ãcurrval() è¿åçæ¯ä½ æ¬æ¬¡æè©±é²ç¨æè³¦çå¼è䏿¯ææç¨æ¶çç¶åå¼ã + + 4.11.4) çºä»éº¼ä¸å¨äºåç°å¸¸ä¸æ¢å¾éç¨åºåèå¢ï¼çºä»éº¼å¨åºåèæ¬ä½çåå¼ä¸åå¨éæ·å¢ï¼ + + çºäºæé«ä½µç¼æ§ï¼åºåèå¨éè¦çæåè³¦äºæ­ + £å¨éè¡çäºåï¼ä¸¦ä¸å¨äºåçµæä¹åä¸é²è¡éå®ï¼ éå°±æå°è´ç°å¸¸ä¸­ + æ¢çäºåå¾ï¼åºåèæåºç¾ééã + + 4.12) ä»éº¼æ¯ OID ï¼ä»éº¼æ¯ CTID ï¼ + + PostgreSQL 裡åµå»ºçæ¯ä¸è¡è¨é齿ç²å¾ä¸åå¯ä¸ç OIDï¼é¤éå¨åµå»ºè¡¨æä½¿ç¨ + WITHOUT OIDS é¸é ã OID åµå»ºææèªåçæä¸å 4ä½åçµçæ´æ¸ï¼ææ OID å¨ç¸æ + PostgreSQL 伺æå¨ä¸åæ¯å¯ä¸çã ç¶èï¼å®å¨è¶é 40åæå°æº¢åºï¼ OID æ­ + ¤å¾æåºç¾éè¤ãPostgreSQL å¨å®çå§é¨ç³»çµ±è¡¨è£¡ä½¿ç¨ OID + å¨è¡¨ä¹é建ç«è¯ç¹«ã + + å¨ç¨æ¶çè³æè¡¨ä¸ï¼æå¥½æ¯ä½¿ç¨ SERIAl ä¾ä»£æ¿ OID å çº SERIAL åªè¦ä¿è­ + å¨å®å表ä¸çæ¸å¼æ¯å¯ä¸çå°±å¯ä»¥äºï¼éæ¨£å®æº¢åºçå¯è½æ§å°±é常å°äºï¼ + SERIAL8 å¯ç¨ä¾ä¿å8ååçµçåºåæ¸å¼ã + + CTID ç¨æ¼æ¨è帶èè³æå¡ï¼å°åï¼åï¼å¡å§ï¼åç§»çç¹å®çç©çè¡ã CTID + å¨è¨éè¢«æ´æ¹æéè¼å¾ç¼çæ¹è®ãç´¢å¼è³æä½¿ç¨å®åæåç©çè¡ã + + 4.13) çºä»éº¼ææ¶å°é¯èª¤è³è¨ãERROR: Memory exhausted in AllocSetAlloc()ãï¼ + + éå¾å¯è½æ¯ç³»çµ±çèæ¬å§åç¨åäºï¼æèå§æ ¸å°æäºè³æºæè¼ä½çéå¶å¼ãå¨åå + postmaster ä¹å試試ä¸é¢çå½ä»¤ï¼ + ulimit -d 262144 + limit datasize 256m + + åæ±ºæ¼ä½ ç¨ç + shellï¼ä¸é¢å½ä»¤åªæä¸æ¢è½æåï¼ä½æ¯å®å°æä½ çé²ç¨è³ææ®µéå¶è¨å¾æ¯è¼é«ï¼ + å èä¹è¨±è½è®æ¥è©¢å®æã鿢å½ä»¤æç¨æ¼ç¶åé²ç¨ï¼ä»¥åææå¨éæ¢å½ä»¤éè¡å¾åµå»ºç + åé²ç¨ã + å¦æä½ æ¯å¨éè¡SQL客æ¶ç«¯æå çºå¾å°è¿åäºå¤ªå¤çè³æèåºç¾åé¡ï¼è«å¨éè¡å®¢æ¶ç + «¯ä¹åå·è¡ä¸è¿°å½ä»¤ã + + 4.14) æå¦ä½æè½ç¥éæéè¡çPostgreSQLççæ¬ï¼ + + å¾ psql 裡ï¼è¼¸å¥ SELECT version();æä»¤ã + + 4.15) æå¦ä½åµå»ºä¸åé è¨å¼æ¯ç¶åæéçæ¬ä½ï¼ + + ä½¿ç¨ CURRENT_TIMESTAMPï¼ + CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); + + 4.16) æææ¨£é²è¡ outer join ï¼å¤é£æ¥ï¼ï¼ + + PostgreSQL æ¡ç¨æ¨æºç SQL èªæ³æ¯æå¤é£æ¥ãé裡æ¯å©åä¾åï¼ + SELECT * + FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); + + ææ¯ + SELECT * + FROM t1 LEFT OUTER JOIN t2 USING (col); + + éå©åçå¹çæ¥è©¢å¨ t1.col å t2.col ä¸å飿¥ï¼ä¸¦ä¸è¿å t1 中 + æææªé£æ¥çè¡ï¼é£äºå¨ t2 䏿²æå¹éçè¡ï¼ã å³[å¤]飿¥ï¼RIGHT OUTER + JOINï¼å°è¿å t2 䏿ªé£æ¥çè¡ã å®å¨å¤é£æ¥ï¼FULL OUTER JOINï¼å°è¿å t1 å t2 + 䏿ªé£æ¥çè¡ã ééµå OUTER å¨å·¦[å¤]飿¥ãå³[å¤]飿¥åå®å¨[å¤]飿¥ä¸­ + æ¯å¯é¸çï¼æ®é飿¥è¢«ç¨±çºå§é£æ¥ï¼INNER JOINï¼ã + + 4.17) å¦ä½ä½¿ç¨æ¶åå¤åè³æåº«çæ¥è©¢ï¼ + + æ²æè¾¦æ³æ¥è©¢ç¶åè³æåº«ä¹å¤çè³æåº«ã + å çºPostgreSQLè¦å è¼èè³æåº«ç¸éç系統ç®éï¼ç³»çµ±è¡¨ï¼ï¼å æ­ + ¤è·¨è³æåº«çæ¥è©¢å¦ä½å·è¡æ¯ä¸å®çã + + éå å¢å¼æ¨¡å¡ contrib/dblink + å許æ¡ç¨å½æ¸èª¿ç¨å¯¦ç¾è·¨åº«æ¥è©¢ãç¶ç¶ç¨æ¶ä¹å¯ä»¥åæé£æ¥å°ä¸åçè³æåº«å·è + ¡æ¥è©¢ç¶å¾å¨å®¢æ¶ç«¯åä½µçµæã + + 4.18) å¦ä½è®å½æ¸è¿åå¤è¡æå¤åè³æï¼ + + å¨å½æ¸ä¸è¿åè³æè¨ééçåè½æ¯å¾å®¹æä½¿ç¨çï¼è©³æåè¦ï¼ + http://techdocs.postgresql.org/guides/SetReturningFunctions + + 4.19) çºä»éº¼æå¨ä½¿ç¨ PL/PgSQL 彿¸ååè¨æè¡¨æææ¶å°é¯èª¤è³è¨ãrelation with OID + ##### does not existãï¼ + + PL/PgSQL æç·©å彿¸çè³æ¬å§å®¹ï¼ç±æ¤å¸¶ä¾çä¸åä¸å¥½çå¯ä½ç¨æ¯è¥ä¸å + PL/PgSQL + 彿¸è¨ªåäºä¸åè¨æè¡¨ï¼ç¶å¾è©²è¡¨è¢«åªé¤ä¸¦é建äºï¼å忬¡èª¿ç¨è©²å½æ¸å°å¤ + ±æï¼ å çºç·©åç彿¸å§å®¹ä»ç¶æåèçè¨æè¡¨ãè§£æ±ºçæ¹æ³æ¯å¨ PL/PgSQL 中 + ç¨EXECUTE å°è¨æè¡¨é²è¡è¨ªåã鿍£æä¿èæ¥è©¢å¨å·è¡å總æè¢«éæ°è§£æã + + 4.20) ç®åæåªäºè³æè¤å¯«(replication)æ¹æ¡å¯ç¨ï¼ + + ãè¤å¯«ãåªæ¯ä¸åè¡èªï¼æå¥½å¹¾ç¨®è¤å¯«æè¡å¯ç¨ï¼æ¯ç¨®é½æåªé»å缺é»ï¼ + + 主/å¾å¼è¤å¯«æ¹å¼æ¯å許ä¸å主伺æå¨æ¥åè®/寫çç³è«ï¼èå¤åå¾ä¼ºæå¨åªè½æ¥å + è®/SELECTæ¥è©¢çç³è«ï¼ ç®åææµè¡ä¸åè²»ç主/å¾PostgreSQLè¤å¯«æ¹æ¡æ¯ + Slony-I ã + + å¤å主伺æå¨çè¤å¯«æ¹å¼å許å°è®/寫çç³è«ç¼é給å¤å°ç主æ©ï¼é種æ¹å¼ç±æ¼é + è¦å¨å¤å°ä¼ºæå¨ä¹éåæ¥è³æè®å å¯è½æå¸¶ä¾è¼å´éçæ§è½æå¤±ï¼Pgcluster + æ¯ç®åéç¨®æ¹æ¡ä¸æå¥½çï¼ä¸¦ä¸éå¯ä»¥åè²»ä¸è¼ã + + 乿ä¸äºåæ¥éä»è²»ååºæ¼ç¡¬é«çè³æè¤å¯«æ¹æ¡ï¼æ¯æä¸è¿°å種è¤å¯«æ¨¡åã + + 4.21) çºä½æ¥è©¢çµæé¡¯ç¤ºçè¡¨åææ¬åèæçæ¥è©¢èªå¥ä¸çä¸åï¼çºä½å¤§å¯«çæä¸è½ä¿çï¼ + + æå¸¸è¦çåå æ¯å¨åµå»ºè¡¨æå°è¡¨åææ¯æ¬å使ç¨äºéå¼è( ' ' + )ï¼ç¶ä½¿ç¨äºéå¼èå¾ï¼è¡¨åææ¬åï¼ç¨±çºæ¨è符ï¼å岿æ¯åå 大å°å¯«çï¼ + éæè¬èä½ å¨æ¥è©¢æè¡¨åææ¬åä¹æä½¿ç¨éå¼èï¼ä¸äºå·¥å·è»é«ï¼å pgAdmin + æå¨ç¼åºåµå»ºè¡¨çæä»¤æèªåå°å¨æ¯åæ¨è符ä¸å éå¼èã å æ¤ï¼çºäºæ¨è­ + 符ççµ±ä¸ï¼ä½ æè©²ï¼ + * å¨åµå»ºè¡¨æé¿åå°æ¨è符使ç¨éå¼èå¼èµ·ä¾ã + * 卿¨è符ä¸åªä½¿ç¨å°å¯«åæ¯ã + * ï¼çºäºèå·²åå¨çæ¨è符ç¸åï¼å¨æ¥è©¢ä¸ä½¿ç¨éå¼èå°æ¨è符å¼èµ·ä¾ã diff --git a/doc/src/FAQ/FAQ_chinese_simp.html b/doc/src/FAQ/FAQ_chinese_simp.html new file mode 100644 index 0000000000..db0a0c306a --- /dev/null +++ b/doc/src/FAQ/FAQ_chinese_simp.html @@ -0,0 +1,1011 @@ + + + + + + PostgreSQL 常见问题(FAQ) + + + + + + +

PostgreSQL 常见问题(FAQ)

+ + +

最近更新:2007 年 1 月 30 日 星期二 17:37:01 EST
+ 中文版最近更新:2007 年 2 月 1 日 星期四 12:55:04 CST +

+

目前维护人员:Bruce Momjian (pgman@candle.pha.pa.us)
+ 中文版维护人员:Daojing.Zhou(doudou586@gmail.com) +

+ +

+ 本文档的最新版本可以在 + http://www.postgresql.org/files/documentation/faqs/FAQ.html查看。 +

+

+ 与操作系统平台相关的问题可在http://www.postgresql.org/docs/faq/里找到答案。
+

+
+ +

常见问题

+ + +

+1.1)PostgreSQL 是什么?该怎么发音?
+1.2)谁控制和管理PostgreSQL ?
+1.3)PostgreSQL的版权是什么?
+1.4)PostgreSQL可以运行在哪些操作系统平台上?
+1.5)我从哪里能得到PostgreSQL?
+ +1.6)最新版的PostgreSQL 是什么?
+1.7)我从哪里能得到对PostgreSQL 的支持?
+1.8)我如何提交一个BUG报告?
+1.9)我如何了解已知的 BUG 或暂缺的功能?
+1.10)能够获取的最新文档有哪些?
+1.11)我应该怎样学习 SQL ?
+ +1.12)如何提交补丁或是加入开发队伍?
+1.13)PostgreSQL 和其他数据库系统比起来如何?
+1.14)PostgreSQL 可以处理最近各个国家夏时制的变化吗?
+

+ +

用户客户端问题

+

+2.1)我们可以用什么语言和PostgreSQL 打交道?
+2.2)有什么工具可以把PostgreSQL 用于 Web 页面?
+ +2.3)PostgreSQL 拥有图形用户界面吗?
+

+ +

系统管理问题

+

+3.1)我怎样才能把PostgreSQL 装在 /usr/local/pgsql 以外的地方?
+3.2)我如何控制来自其他电脑的连接?
+3.3)我怎样调整数据库服务器以获得更好的性能?
+ +3.4)PostgreSQL 里可以获得什么样的调试特性?
+3.5)为什么在试图连接登录时收到“Sorry, too many clients” 消息?
+3.6)PostgreSQL的升级过程有哪些内容?
+3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ?
+

+ +

操作问题

+ +

+4.1) 如何只选择一个查询结果的头几行?或是随机的一行?
+4.2) 如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指令并显示它们?
+4.3) 如何更改一个字段的数据类型?
+4.4) 单条记录,单个表,一个数据库的最大限制是多少?
+4.5) 存储一个典型的文本文件里的数据需要多少磁盘空间?
+ +4.6) 为什么我的查询很慢?为什么这些查询没有利用索引?
+4.7) 我如何才能看到查询优化器是怎样评估处理我的查询的?
+4.8) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找?
+4.9) 在一个查询里,我怎样检测一个字段是否为 NULL?我如何才能准确排序而不论某字段是否含NULL值?
+4.10) 各种字符类型之间有什么不同?
+4.11.1) 我怎样创建一个序列号型或是自动递增的字段?
+ +4.11.2) 我如何获得一个插入的序列号的值?
+4.11.3) 同时使用 currval() 会导致和其他用户的冲突情况吗?
+4.11.4) 为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢?
+4.12) 什么是 OID?什么是 CTID ?
+4.13) 为什么我收到错误信息“ERROR: Memory exhausted in AllocSetAlloc()”?
+ +4.14) 我如何才能知道所运行的 PostgreSQL 的版本?
+4.15) 我如何创建一个缺省值是当前时间的字段?
+4.16) 如何执行外连接(outer join)查询?
+4.17) 如何执行涉及多个数据库的查询?
+4.18) 如何让函数返回多行或多列数据?
+4.19) 为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?
+ +4.20) 目前有哪些数据复制方案可用?
+4.21) 为何查询结果显示的表名或列名与我的查询语句中的不同?为何大写状态不能保留?
+

+ +
+ +

常见问题

+ +

1.1)PostgreSQL 是什么?该怎么发音?

+ + +

PostgreSQL 读作 Post-Gres-Q-L,有时候也简称为Postgres 。想听一下其发音的人员可从这里下载声音文件: + MP3 格式 。 +

+ +

PostgreSQL 是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将在下一代 DBMS 系统的使用的增强特性。PostgreSQL 是自由免费的,并且所有源代码都可以获得。 +

+ +

PostgreSQL 的开发队伍主要为志愿者,他们遍布世界各地并通过互联网进行联系,这是一个社区开发项目,它不被任何公司控制。 + 如想加入开发队伍,请参见开发人员常见问题(FAQ) + http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html + +

+ +

1.2) 谁控制PostgreSQL ?

+

+ 如果你在寻找PostgreSQL的掌门人,或是什么中央委员会,或是什么所属公司,你只能放弃了---因为一个也不存在,但我们的确有一个 + 核心委员会和CVS管理组,但这些工作组的设立主要是为了进行管理工作而不是对PostgreSQL进行独占式控制,PostgreSQL项目是由任何人均 + 可参加的开发人员社区和所有用户控制的,你所需要做的就是订阅邮件列表,参与讨论即可(要参与PostgreSQL的开发详见 + 开发人员常问题 (Developer's FAQ) 获取信息)。 +

+ + +

1.3)PostgreSQL的版权是什么?

+ + +

PostgreSQL的发布遵从经典的BSD版权。它允许用户不限目的地使用PostgreSQL,甚至你可以销售PostgreSQL而不含源代码也可以,唯一的限制就是你不能因软件自身问题而向我们追诉法律责任,另外就是要求所有的软件拷贝中须包括以下版权声明。下面就是我们所使用的BSD版权声明内容:

+ +

PostgreSQL数据库管理系统

+ +

部分版权(c)1996-2005,PostgreSQL 全球开发小组,部分版权(c)1994-1996 加州大学董事

+ +

(Portions copyright (c) 1996-2005,PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California)

+ +

+ 允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用, + 并且无须签署因此而产生的证明,前提是上面的版权声明和本段以及下面两段文字出现在所有拷贝中。 + +

+ +

+ (Permission to use, copy, modify, and distribute this software and its + documentation for any purpose, without fee, and without a written agreement is + hereby granted, provided that the above copyright notice and this paragraph and + the following two paragraphs appear in all copies.) +

+ +

+ 在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的, + 间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。 +

+ +

+ (IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST + PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF + THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE.) +

+ + +

+ 加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。 + 这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。 +

+ +

+ (THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND + THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, + SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.)
+ +

+ +

1.4)PostgreSQL 可以运行在哪些操作系统平台上?

+ +

一般说来,任何现在对 UNIX 兼容的操作系统之上都能运行PostgreSQL 。在安装指南里列出了发布时经过明确测试的平台。

+ + +

PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000 SP4,WinXP 和 Win2003,已制作完成的安装包可从 + http://pgfoundry.org/projects/pginstaller下载,基于MSDOS的Windows操作系统 + (Win95,Win98,WinMe)需要通过Cygwin模拟环境运行PostgreSQL。 +

+ +

+ 同时也有一个为Novell Netware 6开发的版本可从 http://forge.novell.com获取,为OS/2(eComStation)开发的版本可从 + http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F 下载。 + +

+ +

1.5) 我从哪里能得到PostgreSQL?

+ +

+ 通过浏览器可从http://www.postgresql.org/ftp/下载,也可通过FTP,从 + ftp://ftp.PostgreSQL.org/pub/站点下载。 +

+ +

1.6) 最新版的PostgreSQL是什么?

+ + +

PostgreSQL 最新的版本是版本 8.2.1 。

+ +

我们计划每年发布一个主要升级版本,每几个月发布一个小版本。

+ + +

1.7) 我从哪里能得到对PostgreSQL的支持?

+ +

PostgreSQL社区通过邮件列表为其大多数用户提供帮助,订阅邮件列表的主站点是 http://www.postgresql.org/community/lists/,一般情况下,先加入General 或 Bug邮件列表是一个较好的开始。 +

+ +

+ 主要的IRC频道是在FreeNode(irc.freenode.net)的#postgresql,为了连上此频道,可以使用UNIX程序irc,其指令格式: + irc -c '#postgresql' "$USER" irc.freenode.net ,或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频道(#postgersql-es)和法语频道 + (#postgresql-fr)。同样地,在EFNET上也有一个PostgreSQL的交流频道。 +

+ +

+ 可提供商业支持的公司列表可在http://techdocs.postgresql.org/companies.php浏览。 + +

+ + + +

1.8) 我如何提交一个BUG报告?

+ +

+ 可访问 http://www.postgresql.org/support/submitbug,填写Bug上报表格即可,同样也可访问ftp站点ftp://ftp.PostgreSQL.org/pub/ 检查有无更新的PostgreSQL版本或补丁。 +

+ + +

+通过使用Bug提交表格或是发往PostgreSQL邮件列表的Bug通常会有以下之一回复: +

+ + + + +

1.9) 我如何了解已知的 BUG 或暂缺的功能?

+

PostgreSQL 支持一个扩展的 SQL:2003 的子集。参阅我们的TODO 列表,了解已知Bug列表、暂缺的功能和将来的开发计划。 + +

+ +

要求增加新功能的申请通常会收到以下之一的回复:

+ + + +

+PostgreSQL不使用Bug跟踪系统,因为我们发现在邮件列表中直接回复以及保证TODO任务列表总是处于最新状态的方式工作效率会更高一些。事实上,Bug不会在我们的软件中存在很长时间, +对影响很多用户的Bug也总是很快会被修正。唯一能找到所有改进、提高和修正的地方是CVS的日志信息,即使是在软件新版本的发布信息中也不会列出每一处的软件更新。 +

+ + + +

1.10) 能够获取的最新文档有哪些?

+ + +

PostgreSQL包含大量的文档,主要有详细的参考手册,手册页和一些的测试例子。参见 /doc 目录(译注:应为 $PGHOME/doc)。 + 你还可以在线浏览PostgreSQL的手册,其网址是:http://www.PostgreSQL.org/docs。 +

+ +

+ 有两本关于PostgreSQL的书在线提供,在 + http://www.PostgreSQL.org/docs/awbook.html + 和 http://www.commandprompt.com/ppbook/ 。 + 也有大量的PostgreSQL书籍可供购买,其中最为流行的一本是由Korry Douglas编写的。在 + http://techdocs.PostgreSQL.org/techdocs/bookreviews.php上 + 上有大量有关PostgreSQL书籍的简介。 + 在 http://techdocs.PostgreSQL.org/上收集了有关PostgreSQL的大量技术文章。 + +

+ +

+ 客户端的命令行程序psql有一些以 \d 开头的命令,可显示关于类型,操作符,函数,聚合等信息,使用 \? 可以显示所有可用的命令。 +

+ +

+ 我们的 web 站点包含更多的文档。 +

+ + + +

1.11) 我应该怎样学习 SQL ?

+ +

+ 首先考虑上述提到的与PostgreSQL相关的书籍,另外一本是Teach Yourself SQL in 21 Days, Second Edition,其详细介绍的网址是 + http://members.tripod.com/er4ebus/sql/index.htm, + 我们的许多用户喜欢The Practical SQL Handbook, Bowman, Judith S. 编写,Addison-Wesley公司出版,其他的则喜欢 + The Complete Reference SQL, Groff 编写,McGraw-Hill公司出版。 +

+ +

在下列网址上也有很好的教程,他们是

+ + + + +

1.12)如何提交补丁或是加入开发队伍?

+

+ 详见 开发人员常见问题 (Developer's FAQ) 。 + +

+ + +

1.13)PostgreSQL和其他数据库系统比起来如何?

+ +

+评价软件有好几种方法:功能,性能,可靠性,支持和价格。 +

+ +
+
功能
+
PostgreSQL 拥有大型商用数据库最多的功能,例如:事务,子查询,触发器,视图,外键参考完整性和复杂的锁定等。 + 我们还有一些它们没有的特性,如用户定义类型,继承,规则和多版本并行控制以减少锁的争用等。
+ +
+ +
性能
+
PostgreSQL和其他商用和开源的数据库具有类似的性能。对某些处理它比较快,对其他一些处理它比较慢。 + 与其他数据库相比,我们的性能优劣通常在 +/- 10%之间。
+
+ +
可靠性
+
+ + 我们都知道数据库必须是可靠的,否则它就一点用都没有。我们努力做到发布经过认真测试的,缺陷最少的稳定代码。每个版本至少有一个月的 beta + 测试时间,并且我们的发布历史显示我们可以提供稳定的,牢固的,可用于生产使用的版本。我们相信在这方面我们与其他的数据库软件是相当的。
+
+ +
支持
+
+ 我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰到的任何问题。我们不能保证总是能解决问题,相比之下,商用数据库软件也并不是总能够提供解决方法。 + 直接与开发人员,用户群,手册和源程序接触使PostgreSQL的支持比其他数据库还要好。还有一些商业性的全面技术支持,可以给提供给那些需要的人。(参阅1.7 小节)
+
+ + +
ä»·æ ¼
+
+ 我们对任何用途都免费,包括商用和非商用目的。 + 你可以不加限制地向你的产品里加入我们的代码,除了那些我们在上面的版权声明里声明的 BSD版权之外的内容。 +
+ +
+ + +

1.14) PostgreSQL可以处理最近各个国家夏时制的变化吗?

+ +

PostgreSQL 8.0之前的版本是使用操作系统中的时区数据库来处理夏时制的信息,自8.0版及以后的版本PostgreSQL会自身含有最新的时区信息。

+ + +
+ + +

用户客户端问题

+ + +

2.1) 我们可以用什么语言和PostgreSQL打交道?

+ +

PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目,能够分别下载,这些接口项目独立的好处 + 是他们可以有各自的发布计划和各自独立的开发组。 +

+

+ 一些编程语言如PHP都有访问PostgreSQL的接口,Perl、TCL、Python以及很多其他语言的接口在 + http://gborg.postgresql.org网站上的Drivers/Interfaces小节可找到, + 并且通过Internet很容易搜索到。 +

+ + + + +

2.2) 有什么工具可以把PostgreSQL用于 Web 页面?

+

+ 一个介绍以数据库为后台的挺不错的站点是:http://www.webreview.com。 +

+

+ 对于 Web 集成,PHP 是一个极好的接口。它在http://www.php.net/。 + +

+

+ 对于复杂的任务,很多人采用 Perl 接口和 使用CGI.pm的DBD::Pg 或 mod_perl 。 +

+ + +

2.3)PostgreSQL拥有图形用户界面吗?

+

+ 商业用户或是开源开发人员能找到很多的有关PostgreSQL的GUI图形工具软件,在 PostgreSQL社区文档有一个详细的列表。 +

+ + +
+ + + +

系统管理问题

+ +

3.1)我怎样能把PostgreSQL装在 /usr/local/pgsql 以外的地方?

+

+ 在运行 configure 时加上 --prefix 选项。 +

+ + + +

3.2) 我如何控制来自其他电脑的连接?

+

+ 缺省情况下,PostgreSQL只允许来自本机且通过 unix 域套接字或TCP/IP方式的连接。 + 你只有在修改了配置文件postgresql.conf中的listen_addresses,且也在配置文件$PGDATA/pg_hba.conf中打开了 + 基于远程电脑( host-based )的身份认证,并重新启动PostgreSQL,否则其他电脑是不能与你的PostgreSQL服务器进行连接的。 +

+ + +

3.3) 我怎样调整数据库引擎以获得更好的性能?

+ + +

+ 有三个主要方面可以提升PostgreSQL的潜能。 +

+ +
+
查询方式的变化
+
+ 这主要涉及修改查询方式以获取更好的性能: +
    +
  • 创建索引,包括表达式和部分索引;
  • + +
  • 使用COPY语句代替多个Insert语句;
  • +
  • 将多个SQL语句组成一个事务以减少提交事务的开销;
  • +
  • 从一个索引中提取多条记录时使用CLUSTER;
  • +
  • 从一个查询结果中取出部分记录时使用LIMIT;
  • +
  • 使用预编译式查询(Prepared Query);
  • +
  • 使用ANALYZE以保持精确的优化统计;
  • + +
  • 定期使用 VACUUM 或 pg_autovacuum
  • +
  • 进行大量数据更改时先删除索引(然后重建索引)
  • +
+
+ +
服务器的配置
+
+ + 配置文件postgres.conf中的很多设置都会影响性能,所有参数的列表可见: + 管理员指南/数据库服务器运行环境/数据库服务器运行配置, + 有关参数的解释可见:http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html 和 + http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html。 +
+ +
硬件的选择
+ +
+ 计算机硬件对性能的影响可浏览 + http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html 和 + http://www.powerpostgresql.com/PerfList/。 +
+ +
+ + +

3.4)PostgreSQL里可以获得什么样的调试特性?

+ + +

PostgreSQL 有很多类似 log_* 的服务器配置变量可用于查询的打印和进程统计,而这些工作对调试和性能测试很有帮助。 +

+ + + +

3.5) 为什么在试图连接时收到“Sorry, too many clients(已有太多用户连接)”消息?

+

+ 这表示你已达到缺省100个并发后台进程数的限制,你需要通过修改postgresql.conf文件中的max_connections值来 + 增加postmaster的后台并发处理数,修改后需重新启动postmaster。 + +

+ + +

3.6)PostgreSQL的升级过程有哪些内容 ?

+

+ PostgreSQL 开发组对每次小版本的升级主要只做了一些Bug修正工作,因此从 7.4.8 升级到 7.4.9 不需要 dump 和 restore,仅需要停止数据库服务器,安装更新后的软件包,然后重启服务器即可。 +

+

+ 所有PostgreSQL的用户应该在最接近(你所使用的主版本)的小改进版本发布尽快升级。尽管每次升级可能都有一点风险,PostgreSQL的小改进版仅仅是设计用来修正一些Bug的,代码改动较少,所以风险还是很小的。PostgreSQL社区认为一般情况下不升级的风险还是多于升级的。 +

+

+ 主版本的升级(例如从 7.3 到 7.4)通常会修改系统表和数据表的内部格式。 + 这些改变一般比较复杂,因此我们不维持数据文件的向后兼容性。因此从老版本中进行数据导出(dump)/然后在新版本中进行数据导入(reload)对主版本的升级是必须的。 + +

+ +

3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ?

+

+ 由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是, + ECC RAM(带奇偶校验的内存),SCSI (硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上, + 但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于 + 硬件配置和性价比的讨论。 +

+ + +
+ +

操作问题

+ + + +

4.1) 如何只选择一个查询结果的头几行?或是随机的一行?

+

+ 如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。 + 如果有一个索引与 ORDER BY中的条件匹配,PostgreSQL 可能就只处理要求的头几条记录, + (否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道确切的记录数, + 可使用游标(cursor)和FETCH功能。 +

+

+ 可使用以下方法提取一行随机记录的: +

+
+      SELECT  cols
+      FROM tab
+      ORDER BY random()
+      LIMIT 1 ;
+
+
+ + + +

4.2) 如何查看表、索引、数据库以及用户的定义?如何查看psql里用到的查询指令并显示它们?

+

+ 在psql中使用 \dt 命令来显示数据表的定义,要了解psql中的完整命令列表可使用\? ,另外,你也可以阅读 psql 的源代码 + 文件pgsql/src/bin/psql/describe.c,它包括为生成psql反斜杠命令的输出的所有 SQL 命令。你还可以带 -E 选项启动 psql, + 这样它将打印出你在psql中所给出的命令执行时的内部实际使用的SQL查询语句。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口, + 你可以从这里获取关于数据库的信息。 + +

+

+ 在系统中也有一些以pg_ 打头的系统表也描述了表的定义。 +

+

+ 使用 psql -l 指令可以列出所有的数据库。 +

+

+ 也可以浏览一下 pgsql/src/tutorial/syscat.source文件,它列举了很多可从数据库系统表中获取信息的SELECT语法。 + +

+ + +

4.3) 如何更改一个字段的数据类型?

+

+ 在8.0版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。 +

+

+ 在以前的版本中,可以这样做: +

+
+   BEGIN;
+    ALTER TABLE tab ADD COLUMN new_col new_data_type;
+    UPDATE tab SET new_col = CAST(old_col AS new_data_type);
+    ALTER TABLE tab DROP COLUMN old_col;
+    COMMIT;
+
+
+

+ 你然后可以使用VACUUM FULL tab 指令来使系统收回无效数据所占用的空间。 +

+ +

4.4) 单条记录,单个表,单个数据库的最大限制是多少?

+

+ 下面是一些限制: +

+
+
+ + + + + + + + + + + +
单个数据库最大尺寸?无限制(已存在有 32TB 的数据库)
单个表的最大尺寸?32 TB
一行记录的最大尺寸?1.6 TB
一个字段的最大尺寸?1 GB
一个表里最大行数?无限制
一个表里最大列数?250-1600 (与列类型有关)
一个表里的最大索引数量?无限制
+ + + +

+ 当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。 + 事实上,当上述这些数值变得异常地大时,系统性能也会受很大影响。 +

+ +

+ 单表的最大大小 32 TB 不需要操作系统对单个文件也需这么大的支持。大表用多个 1 GB 的文件存储,因此文件系统大小的限制是不重要的。 +

+

+ 如果缺省的块大小增长到 32K ,最大的单表大小和最大列数还可以增加到四倍。 +

+

+ 有一个限制就是不能对大小多于2000字节的列创建索引。幸运地是这样的索引很少用到。通过对多字节列的内容进行MD5哈稀运算结果进行函数索引可对列的唯一性得到保证, + 并且全文检索允许对列中的单词进行搜索。 +

+ + +

4.5) 存储一个典型的文本文件里的数据需要多少磁盘空间?

+

+ 一个 Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。 +

+

+ 例如,假设有一个 100,000 行的文件,每行有一个整数和一个文本描述。 + 假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的PostgreSQL数据库文件大约是 6.4 MB: +

+
+     28 字节: 每行的头(大约值)
+     24 字节: 一个整数型字段和一个文本型字段
+   +  4 字节: 页面内指向元组的指针
+   ----------------------------------------
+     56 字节每行
+
+   PostgreSQL 数据页的大小是 8192 字节 (8 KB),则:
+
+   8192 字节每页
+   -------------------   =  146 行/数据页(向下取整)
+     56 字节每行
+
+   100000 数据行
+   --------------------  =  685 数据页(向上取整)
+      146 行/数据页
+
+   685 数据页 * 8192 字节/页  = 5,611,520 字节(5.6 MB)
+
+ + +

+ 索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。 +

+

+ 空值NULL存放在位图中,因此占用很少的空间。 +

+ +

4.6) 为什么我的查询很慢?为什么这些查询没有利用索引?

+

+ 并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。 + 这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。 + +

+

+ 为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。 + 使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。 + 统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。 +

+

+ 索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描再做一次排序通常比索引扫描要快。然而,如果将 LIMIT 和 ORDER BY + 结合在一起使用的话,通常将会使用索引,因为这时仅返回表中的一小部分记录。 +

+

+ 如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用SET enable_seqscan TO 'off'指令来关闭顺序扫描, + 然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。 +

+ +

+ + 当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用: +

+ +

+ 在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对int2,int8和数值型的索引。 +

+ +

4.7) 我如何才能看到查询优化器是怎样评估处理我的查询?

+ + +

参考 EXPLAIN 手册页。

+ +

4.8) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找?

+

+ 操作符 ~ 处理正则表达式匹配,而 ~* 处理大小写无关的正则表达式匹配。大小写无关的 LIKE 变种成为 ILIKE。 + +

+

+ 大小写无关的等式比较通常写做: +

+
+    SELECT *
+    FROM tab
+    WHERE lower(col) = 'abc';
+
+ +

+ 这样将不会使用标准的索引。但是可以创建一个在这种情况下使用的表达式索引: +

+
+    CREATE INDEX tabindex ON tab (lower(col));
+
+
+

+ 如果上述索引在创建时加入UNIQUE约束,虽然索引字段自身内容可以存储大小写不限的内容,但如果有UNIQUE约束后,这些内容不能仅仅是大小写不同(否则会造成冲突)。为了保证不发生这种情况,可以使用CHECK约束条件或是触发器在录入时进行限制。 +

+ + +

4.9) 在一个查询里,我怎样检测一个字段是否为 NULL ?我如何才能准确排序而不论某字段是否含 NULL 值?

+

+ + 用 IS NULL 和 IS NOT NULL 测试这个字段,具体方法如下: +

+
   SELECT *
+   FROM tab
+   WHERE col IS NULL;
+
+ +

为了能对含 NULL字段排序,可在 ORDER BY 条件中使用 IS NULL和 + IS NOT NULL 修饰符,条件为真 true 将比条件为假false 排在前面,下面的例子就会将含 + NULL 的记录排在结果的上面部分: + +

+
   SELECT *
+   FROM tab
+   ORDER BY (col IS NOT NULL)
+
+ +

4.10) 各种字符类型之间有什么不同?

+
+ + + + + + + + + + + +
类型内部名称说明
VARCHAR(n)varchar指定了最大长度,变长字符串,不足定义长度的部分不补齐
CHAR(n)bpchar定长字符串,实际数据不足定义长度时,以空格补齐
TEXTtext没有特别的上限限制(仅受行的最大长度限制)
BYTEAbytea变长字节序列(使用NULL字符也是允许的)
"char"char单个字符
+
+ +

+ 在系统表和在一些错误信息里你将看到内部名称。 +

+

+ 上面所列的前四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长度,后面才是数据)。 + 于是实际占用的空间比声明的大小要多一些。 + 然而这些类型如定义很长时都可以被压缩存储,因此磁盘空间也可能比预想的要少。 + +

+

+ VARCHAR(n) 在存储限制了最大长度的变长字符串是最好的。 + TEXT 适用于存储最大可达 1G左右但未定义限制长度的字符串。 +

+

+ CHAR(n) 最适合于存储长度相同的字符串。 CHAR(n)会根据所给定的字段长度以空格补足(不足的字段内容), + 而 VARCHAR(n) 只存储所给定的数据内容。 + BYTEA 用于存储二进制数据,尤其是包含 NULL 字节的值。这些类型具有差不多的性能。 + +

+ + + +

4.11.1) 我怎样创建一个序列号或是自动递增的字段?

+

PostgreSQL 支持 SERIAL 数据类型。(字段定义为SERIAL后)将自动创建一个序列生成器,例如: +

+
+   CREATE TABLE person ( 
+      id   SERIAL, 
+      name TEXT 
+   );
+
+

+ 会自动转换为以下SQL语句: +

+ +
+   CREATE SEQUENCE person_id_seq;
+   CREATE TABLE person ( 
+      id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
+      name TEXT
+   );
+
+

+ 参考 create_sequence 手册页获取关于序列生成器的更多信息。 +

+ + +

4.11.2) 我如何获得一个插入的序列号的值?

+

+ 一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再用此值精确地插入。使用 + 4.11.1 里的例表,可用伪码这样描述: + +

+
+   new_id = execute("SELECT nextval('person_id_seq')");
+   execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
+
+

+ 这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为参照 person 表的外键)。 + 注意自动创建的 SEQUENCE 对象的名称将会是 <table>_<serialcolumn>_seq, + 这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。 +

+

+ 类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值,例如: + +

+
+   execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
+   new_id = execute("SELECT currval('person_id_seq')");
+
+ +

4.11.3) 同时使用 currval() 会导致和其他用户的冲突情况吗?

+

+ 不会。currval() 返回的是你本次会话进程所赋的值而不是所有用户的当前值。
+ +

+ +

4.11.4) 为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢?

+

+ 为了提高并发性,序列号在需要的时候赋予正在运行的事务,并且在事务结束之前不进行锁定, + 这就会导致异常中止的事务后,序列号会出现间隔。 +

+ +

4.12) 什么是 OID ?什么是 CTID ?

+ + +

PostgreSQL 里创建的每一行记录都会获得一个唯一的OID,除非在创建表时使用WITHOUT OIDS选项。 + OID创建时会自动生成一个4字节的整数,所有 OID 在相应PostgreSQL服务器中均是唯一的。 然而,它在超过40亿时将溢出, + OID此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID 在表之间建立联系。 +

+

+ 在用户的数据表中,最好是使用SERIAl来代替OID + + 因为SERIAL只要保证在单个表中的数值是唯一的就可以了,这样它溢出的可能性就非常小了, + SERIAL8可用来保存8字节的序列数值。 +

+ +

+ CTID 用于标识带着数据块(地址)和(块内)偏移的特定的物理行。 + CTID 在记录被更改或重载后发生改变。索引数据使用它们指向物理行。 +

+ + + +

4.13) 为什么我收到错误信息“ERROR: Memory exhausted in AllocSetAlloc()”?

+

+ 这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启动 postmaster 之前试试下面的命令: +

+
+   ulimit -d 262144
+   limit datasize 256m
+
+

+ 取决于你用的 shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高, + 因而也许能让查询完成。这条命令应用于当前进程,以及所有在这条命令运行后创建的子进程。 + 如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。 + +

+ +

4.14) 我如何才能知道所运行的PostgreSQL的版本?

+

+ 从 psql 里,输入 SELECT version();指令。 +

+ +

4.15) 我如何创建一个缺省值是当前时间的字段?

+

+ 使用 CURRENT_TIMESTAMP: + +

+
+   CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
+
+ + +

4.16) 我怎样进行 outer join (外连接)?

+

PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子:

+
+   SELECT *
+   FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
+
+

或是

+ +
+   SELECT *
+   FROM t1 LEFT OUTER JOIN t2 USING (col);
+
+

+ 这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返回 t1 中所有未连接的行(那些在 t2 中没有匹配的行)。 + 右[外]连接(RIGHT OUTER JOIN)将返回 t2 中未连接的行。 + 完全外连接(FULL OUTER JOIN)将返回 t1 和 t2 中未连接的行。 + 关键字 OUTER 在左[外]连接、右[外]连接和完全[外]连接中是可选的,普通连接被称为内连接(INNER JOIN)。 +

+ + +

4.17) 如何使用涉及多个数据库的查询?

+

+ 没有办法查询当前数据库之外的数据库。 + 因为PostgreSQL要加载与数据库相关的系统目录(系统表),因此跨数据库的查询如何执行是不定的。 +

+ +

+ 附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端合并结果。 +

+ +

4.18) 如何让函数返回多行或多列数据?

+

+ 在函数中返回数据记录集的功能是很容易使用的,详情参见: + http://techdocs.postgresql.org/guides/SetReturningFunctions +

+ +

4.19) 为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?

+ +

+ PL/PgSQL会缓存函数的脚本内容,由此带来的一个不好的副作用是若一个 PL/PgSQL + 函数访问了一个临时表,然后该表被删除并重建了,则再次调用该函数将失败, + 因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL 中用EXECUTE + 对临时表进行访问。这样会保证查询在执行前总会被重新解析。 +

+ +

4.20) 目前有哪些数据复制方案可用?

+

+ “复制”只是一个术语,有好几种复制技术可用,每种都有优点和缺点: +

+

+ + 主/从复制方式是允许一个主服务器接受读/写的申请,而多个从服务器只能接受读/SELECT查询的申请, + 目前最流行且免费的主/从PostgreSQL复制方案是 + Slony-I 。 +

+

+ 多个主服务器的复制方式允许将读/写的申请发送给多台的计算机,这种方式由于需要在多台服务器之间同步数据变动 + 可能会带来较严重的性能损失,Pgcluster是目前这种方案 + 中最好的,而且还可以免费下载。 +

+

+ 也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。 +

+ + +

4.21) 为何查询结果显示的表名或列名与我的查询语句中的不同?为何大写状态不能保留?

+ +

+ 最常见的原因是在创建表时对表名或是列名使用了双引号“”,当使用了双引号后,表名或列名(称为标识符)存储时是区分 +大小写的, + 这意谓着你在查询时表名或列名也应使用双引号,一些工具软件,像pgAdmin会在发出创建表的指令时自动地在每个标识符上加双引号。 + 因此,为了标识符的统一,你应该: +

+ + + + + \ No newline at end of file diff --git a/doc/src/FAQ/FAQ_chinese_trad.html b/doc/src/FAQ/FAQ_chinese_trad.html new file mode 100644 index 0000000000..9a56180a08 --- /dev/null +++ b/doc/src/FAQ/FAQ_chinese_trad.html @@ -0,0 +1,1003 @@ + + + + + PostgreSQL 常见问题(FAQ) + + + + + + +

PostgreSQL 常見問題(FAQ)

+ + +

最近更新:2007 年 2 月 8 日 星期二 22:43:13 EST
+ 中文版最近更新:2007 年 2 月 12 日 星期一 12:00:04 CST +

+

當前維護人員:Bruce Momjian (pgman@candle.pha.pa.us)
+ 正體中文版維護人員:郭朝益(ChaoYi, Kuo)(kuo.chaoyi@gmail.com)

+ +

+ 本文檔的最新版本可以在 + http://www.postgresql.org/files/documentation/faqs/FAQ.html 查看。 +

+

+ 與作業系統平台相關的問題可在 http://www.postgresql.org/docs/faq/ 裡找到答案。
+

+
+ +

常見問題

+ + +

+1.1)PostgreSQL 是什麼?該怎麼發音?
+1.2)誰控制和管理PostgreSQL ?
+1.3)PostgreSQL的版權是什麼?
+1.4)PostgreSQL可以運行在哪些作業系統平台上?
+1.5)我從哪裡能得到PostgreSQL?
+ +1.6)最新版的 PostgreSQL 是什麼?
+1.7)我從哪裡能得到對 PostgreSQL 的支持?
+1.8)我如何提交一個 BUG 報告?
+1.9)我如何瞭解已知的 BUG 或暫缺的功能?
+1.10)能夠獲取的最新文檔有哪些?
+1.11)我應該怎樣學習 SQL ?
+ +1.12)如何提交補丁或是加入開發隊伍?
+1.13)PostgreSQL 和其他資料庫系統比起來如何?
+1.14)PostgreSQL 可以處理最近各個國家夏時制的變化嗎?
+

+ +

用戶客戶端問題

+

+2.1)我們可以用什麼語言和 PostgreSQL 進行溝通?
+2.2)有什麼工具可以把 PostgreSQL 用於 Web 頁面?
+ +2.3)PostgreSQL 擁有圖形用戶界面(GUI)嗎?
+

+ +

系統管理問題

+

+3.1)我怎樣才能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?
+3.2)我如何控制來自其他電腦的連接?
+3.3)我怎樣調整資料庫伺服器以獲得更好的性能?
+ +3.4)PostgreSQL 裡可以獲得什麼樣的調試特性?
+3.5)為什麼在試圖連接登錄時收到「Sorry, too many clients」 訊息?
+3.6)PostgreSQL 的升級過程有哪些內容?
+3.7)(使用 PostgreSQL )我需要使用什麼電腦硬體?
+

+ +

操作問題

+ +

+4.1) 如何只選擇一個查詢結果的頭幾行?或是隨機的一行?
+4.2) 如何查看表、索引、資料庫以及用戶的定義?如何查看 psql 裡用到的查詢指令並顯示它們?
+4.3) 如何更改一個欄位的資料類型?
+4.4) 單筆記錄,單一表,一個資料庫的最大限制是多少?
+4.5) 存儲一個典型的文本文件裡的資料需要多少磁碟空間?
+ +4.6) 為什麼我的查詢很慢?為什麼這些查詢沒有利用索引?
+4.7) 我如何才能看到查詢優化器是怎樣評估處理我的查詢的?
+4.8) 我怎樣做正則表達式搜索和大小寫無關的正則表達式查找?怎樣利用索引進行大小寫無關查找?
+4.9) 在一個查詢裡,我怎樣檢測一個欄位是否為 NULL?我如何才能準確排序而不論某欄位是否含NULL值?
+4.10) 各種字符類型之間有什麼不同?
+4.11.1) 我怎樣創建一個序列號型或是自動遞增的欄位?
+ +4.11.2) 我如何獲得一個插入的序列號的值?
+4.11.3) 同時使用 currval() 會導致和其他用戶的衝突情況嗎?
+4.11.4) 為什麼不在事務異常中止後重用序列號呢?為什麼在序列號欄位的取值中存在間斷呢?
+4.12) 什麼是 OID?什麼是 CTID ?
+4.13) 為什麼我收到錯誤資訊「ERROR: Memory exhausted in AllocSetAlloc()」?
+ +4.14) 我如何才能知道所運行的 PostgreSQL 的版本?
+4.15) 我如何創建一個預設值是當前時間的欄位?
+4.16) 如何執行外連接(outer join)查詢?
+4.17) 如何執行涉及多個資料庫的查詢?
+4.18) 如何讓函數返回多行或多列資料?
+4.19) 為什麼我在使用 PL/PgSQL 函數存取臨時表時會收到錯誤資訊「relation with OID ##### does not exist」?
+ +4.20) 目前有哪些資料複寫(replication)方案可用?
+4.21) 為何查詢結果顯示的表名或欄名與我的查詢語句中的不同?為何大寫狀態不能保留?
+

+ +
+ +

常見問題

+ +

1.1) PostgreSQL 是什麼?該怎麼發音?

+ + +

PostgreSQL 讀作 Post-Gres-Q-L,有時候也簡稱為Postgres 。想聽一下其發音的人員可從這裡下載聲音文件: + MP3 格式 。 +

+ +

PostgreSQL 是面向目標的關係資料庫系統,它具有傳統商業資料庫系統的所有功能,同時又含有將在下一代 DBMS 系統的使用的增強特性。PostgreSQL 是自由免費的,並且所有源代碼都可以獲得。 +

+ +

PostgreSQL 的開發隊伍主要為志願者,他們遍佈世界各地並通過互聯網進行聯繫,這是一個社區開發項目,它不被任何公司控制。 + 如想加入開發隊伍,請參見開發人員常見問題(FAQ) + http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html + +

+ +

1.2) 誰控制 PostgreSQL ?

+

+ 如果你在尋找PostgreSQL的掌門人,或是什麼中央委員會,或是什麼所屬公司,你只能放棄了---因為一個也不存在,但我們的確有一個 + 核心委員會和CVS管理組,但這些工作組的設立主要是為了進行管理工作而不是對PostgreSQL進行獨佔式控制,PostgreSQL項目是由任何人均 + 可參加的開發人員社區和所有用戶控制的,你所需要做的就是訂閱郵件列表,參與討論即可(要參與PostgreSQL的開發詳見 + 開發人員常問題 (Developer's FAQ) 獲取資訊)。 +

+ + +

1.3) PostgreSQL 的版權是什麼?

+ + +

PostgreSQL的發布遵從經典的 BSD 版權。它允許用戶不限目的地使用 PostgreSQL,甚至你可以銷售 +PostgreSQL 而不含源代碼也可以,唯一的限制就是你不能因軟體自身問題而向我們追訴法律責任,另外就是要求所有的軟體拷貝中須包括以下版權聲明。 +下面就是我們所使用的BSD版權聲明內容:

+ +

PostgreSQL 資料庫管理系統

+ +

部分版權(c)1996-2005,PostgreSQL 全球開發小組,部分版權(c)1994-1996 加州大學董事

+ +

(Portions copyright (c) 1996-2005,PostgreSQL Global +Development Group Portions Copyright (c) 1994-6 Regents of the +University of California)

+ +

+ 允許為任何目的使用,拷貝,修改和分發這個軟體和它的文檔而不收取任何費用, + 並且無須簽署因此而產生的證明,前提是上面的版權聲明和本段以及下面兩段文字出現在所有拷貝中。 + +

+ +

+ (Permission to use, copy, modify, and distribute this software and its + documentation for any purpose, without fee, and without a written agreement is + hereby granted, provided that the above copyright notice and this paragraph and + the following two paragraphs appear in all copies.) +

+ +

+ 在任何情況下,加州大學都不承擔因使用此軟體及其文檔而導致的對任何當事人的直接的, + 間接的,特殊的,附加的或者相伴而生的損壞,包括利益損失的責任,即使加州大學已經建議了這些損失的可能性時也是如此。 +

+ +

+ (IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST + PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF + THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE.) +

+ + +

+ 加州大學明確放棄任何保證,包括但不局限於某一特定用途的商業和利益的隱含保證。 + 這裡提供的這份軟體是基於「當作是」的基礎的,因而加州大學沒有責任提供維護,支持,更新,增強或者修改的服務。 +

+ +

+ (THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND + THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, + SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.)
+ +

+ +

1.4) PostgreSQL 可以運行在哪些作業系統平台上?

+ +

一般說來,任何現在對 UNIX 相容的作業系統之上都能運行 PostgreSQL 。在安裝指南裡列出了發佈時經過明確測試的平台。

+ + +

PostgreSQL 也可以直接運行在基於微軟 Windows-NT 的作業系統,如 Win2000 SP4,WinXP 和 Win2003,已製作完成的安裝包可從 + http://pgfoundry.org/projects/pginstaller下載,基於MSDOS的Windows作業系統 + (Win95,Win98,WinMe)需要通過Cygwin模擬環境運行PostgreSQL。 +

+ +

+ 同時也有一個為 Novell Netware 6 開發的版本可從 http://forge.novell.com 獲取,為OS/2(eComStation)開發的版本可從 + http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F 下載。 + +

+ +

1.5) 我從哪裡能得到 PostgreSQL?

+ +

+ 通過瀏覽器可從 http://www.postgresql.org/ftp/ 下載,也可通過FTP,從 + ftp://ftp.PostgreSQL.org/pub/ 站點下載。 +

+ +

1.6) 最新版的 PostgreSQL 是什麼?

+ + +

PostgreSQL 最新的版本是版本 8.2.3 。

+ +

我們計劃每年發佈一個主要升級版本,每幾個月發佈一個小版本。

+ + +

1.7) 我從哪裡能得到對 PostgreSQL 的支持?

+ +

PostgreSQL社區通過郵件列表為其大多數用戶提供幫助,訂閱郵件列表的主站點是 http://www.postgresql.org/community/lists/,一般情況下,先加入General 或 Bug郵件列表是一個較好的開始。 +

+ +

+ 主要的IRC頻道是在FreeNode(irc.freenode.net)的#postgresql,為了連上此頻道,可以使用 UNIX 程序 irc,其指令格式: + irc -c '#postgresql' "$USER" irc.freenode.net ,或者使用其他IRC客戶端程序。在此網絡中還存在一個 PostgreSQL 的西班牙頻道(#postgersql-es)和法語頻道 + (#postgresql-fr)。同樣地,在 EFNET 上也有一個 PostgreSQL 的交流頻道。 +

+ +

+ 可提供商業支持的公司列表可在 http://techdocs.postgresql.org/companies.php 瀏覽。 + +

+ + + +

1.8) 我如何提交一個 BUG 報告?

+ +

+ 可訪問 http://www.postgresql.org/support/submitbug,填寫 Bug 上報表格即可,同樣也可訪問 ftp 站點 ftp://ftp.PostgreSQL.org/pub/ 檢查有無更新的PostgreSQL 版本或補丁。 +

+ + +

+通過使用 Bug 提交表格或是發往 PostgreSQL 郵件列表的 Bug 通常會有以下之一回覆: +

+ + + + +

1.9) 我如何瞭解已知的 BUG 或暫缺的功能?

+

PostgreSQL 支持一個擴展的 SQL:2003 的子集。參閱我們的 TODO 列表,瞭解已知 Bug 列表、暫缺的功能和將來的開發計劃。 + +

+ +

要求增加新功能的申請通常會收到以下之一的回覆:

+ + + +

+PostgreSQL 不使用 Bug 跟蹤系統,因為我們發現在郵件列表中直接回覆以及保證 TODO 任務列表總是處於最新狀態的方式工作效率會更高一些。事實上,Bug不會在我們的軟體中存在很長時間, +對影響很多用戶的Bug也總是很快會被修正。唯一能找到所有改進、提高和修正的地方是 CVS 的日誌資訊,即使是在軟體新版本的發布資訊中也不會列出每一處的軟體更新。 +

+ + + +

1.10) 能夠獲取的最新文檔有哪些?

+ + +

PostgreSQL 包含大量的文檔,主要有詳細的參考手冊,手冊頁和一些的測試例子。參見 /doc 目錄(譯註:應為 $PGHOME/doc)。 + 你還可以在線瀏覽 PostgreSQL 的手冊,其網址是:http://www.PostgreSQL.org/docs。 +

+ +

+ 有兩本關於PostgreSQL的書在線提供,在 + http://www.postgresql.org/docs/books/awbook.html + 和 http://www.commandprompt.com/ppbook/ 。 + 也有大量的 PostgreSQL 書籍可供購買,其中最為流行的一本是由 Korry Douglas 編寫的。在 + http://techdocs.PostgreSQL.org/techdocs/bookreviews.php上 + 上有大量有關 PostgreSQL 書籍的簡介。 + 在 http://techdocs.PostgreSQL.org/ 上收集了有關 PostgreSQL 的大量技術文章。

+ +

+ 客戶端的命令行程序psql有一些以 \d 開頭的命令,可顯示關於類型,操作符,函數,聚合等資訊,使用 \? 可以顯示所有可用的命令。 +

+ +

+ 我們的 web 站點包含更多的文檔。 +

+ + + +

1.11) 我應該怎樣學習 SQL ?

+ +

+ 首先考慮上述提到的與PostgreSQL相關的書籍,另外一本是 Teach Yourself SQL in 21 Days, Second Edition,其詳細介紹的網址是 + http://members.tripod.com/er4ebus/sql/index.htm, + 我們的許多用戶喜歡The Practical SQL Handbook, Bowman, Judith S. 編寫,Addison-Wesley公司出版,其他的則喜歡 + The Complete Reference SQL, Groff 編寫,McGraw-Hill 公司出版。 +

+ +

在下列網址上也有很好的教程,他們是

+ + + + +

1.12)如何提交補丁或是加入開發隊伍?

+

+ 詳見 開發人員常見問題 (Developer's FAQ) 。

+ + +

1.13) PostgreSQL 和其他資料庫系統比起來如何?

+ +

+評價軟體有好幾種方法:功能,性能,可靠性,支持和價格。 +

+ +
+
功能
+
PostgreSQL 擁有大型商用資料庫最多的功能,例如:事務,子查詢,觸發器,視圖,外鍵參考完整性和複雜的鎖定等。 + 我們還有一些它們沒有的特性,如用戶定義類型,繼承,規則和多版本並行控制以減少鎖的爭用等。
+ +
+ +
性能
+
PostgreSQL和其他商用和開源的資料庫具有類似的性能。對某些處理它比較快,對其他一些處理它比較慢。 + 與其他資料庫相比,我們的性能優劣通常在 +/- 10%之間。
+
+ +
可靠性
+
+ + 我們都知道資料庫必須是可靠的,否則它就一點用都沒有。我們努力做到發佈經過認真測試的,缺陷最少的穩定代碼。每個版本至少有一個月的 beta + 測試時間,並且我們的發布歷史顯示我們可以提供穩定的,牢固的,可用於生產使用的版本。我們相信在這方面我們與其他的資料庫軟體是相當的。
+
+ +
支持
+
+ 我們的郵件列表提供一個非常大的開發人員和用戶的組以幫助解決所碰到的任何問題。我們不能保證總是能解決問題,相比之下,商用資料庫軟體也並不是總能夠提供解決方法。 + 直接與開發人員,用戶群,手冊和源程序接觸使PostgreSQL的支持比其他資料庫還要好。還有一些商業性的全面技術支持,可以給提供給那些需要的人。(參閱1.7 小節)
+
+ + +
價格
+
+ 我們對任何用途都免費,包括商用和非商用目的。 + 你可以不加限制地向你的產品裡加入我們的代碼,除了那些我們在上面的版權聲明裡聲明的 BSD版權之外的內容。 +
+ +
+ + +

1.14) PostgreSQL 可以處理最近各個國家夏時制的變化嗎?

+ + +

PostgreSQL 8.0之前的版本是使用作業系統中的時區資料庫來處理夏時制的資訊,自 8.0 版及以後的版本 PostgreSQL 會自身含有最新的時區資訊。

+ + +
+ + +

用戶客戶端問題

+ + +

2.1) 我們可以用什麼語言和 PostgreSQL 進行溝通?

+ +

PostgreSQL (預設情況)只安裝有 C 和內嵌式 C 的接口,其他的接口都是獨立的項目,能夠分別下載,這些接口項目獨立的好處 + 是他們可以有各自的發布計劃和各自獨立的開發組。 +

+

+ 一些編程語言如 PHP 都有訪問 PostgreSQL 的接口,Perl、TCL、Python 以及很多其他語言的接口在 + http://gborg.postgresql.org 網站上的 Drivers/Interfaces 小節可找到, + 並且通過 Internet 很容易搜索到。 +

+ + + + +

2.2) 有什麼工具可以把 PostgreSQL 用於 Web 頁面?

+

+ 一個介紹以資料庫為後台的挺不錯的站點是:http://www.webreview.com。 +

+

+ 對於 Web 集成,PHP 是一個極好的接口。它在 http://www.php.net/。 + +

+

+ 對於複雜的任務,很多人採用 Perl 接口和 使用 CGI.pm 的 DBD::Pg 或 mod_perl 。 +

+ + +

2.3)PostgreSQL 擁有圖形用戶界面嗎?

+

+ 商業用戶或是開源開發人員能找到很多的有關 PostgreSQL的GUI 圖形工具軟體,在 PostgreSQL社區文檔 有一個詳細的列表。 +

+ + +
+ + + +

系統管理問題

+ +

3.1)我怎樣能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?

+

+ 在運行 configure 時加上 --prefix 選項。 +

+ + + +

3.2) 我如何控制來自其他電腦的連接?

+

+ 預設情況下,PostgreSQL 只允許來自本機且通過 unix 域套接字或 TCP/IP 方式的連接。 + 你只有在修改了配置文件 postgresql.conf 中的 listen_addresses,且也在配置文件 $PGDATA/pg_hba.conf 中打開了 + 基於遠程電腦( host-based )的身份認證,並重新啟動 PostgreSQL,否則其他電腦是不能與你的 PostgreSQL 伺服器進行連接的。 +

+ + +

3.3) 我怎樣調整資料庫引擎以獲得更好的性能?

+ + +

+ 有三個主要方面可以提升 PostgreSQL 的潛能。 +

+ +
+
查詢方式的變化
+
+ 這主要涉及修改查詢方式以獲取更好的性能: +
    +
  • 創建索引,包括表達式和部分索引;
  • + +
  • 使用 COPY 語句代替多個 Insert 語句;
  • +
  • 將多個SQL語句組成一個事務以減少提交事務的開銷;
  • +
  • 從一個索引中提取多條記錄時使用 CLUSTER;
  • +
  • 從一個查詢結果中取出部分記錄時使用 LIMIT;
  • +
  • 使用預編譯式查詢(Prepared Query);
  • +
  • 使用 ANALYZE 以保持精確的優化統計;
  • + +
  • 定期使用 VACUUM 或 pg_autovacuum
  • +
  • 進行大量資料更改時先刪除索引(然後重建索引)
  • +
+
+ +
伺服器的配置
+
+ + 配置文件 postgres.conf 中的很多設置都會影響性能,所有參數的列表可見: +
+
管理員指南/資料庫伺服器運行環境/資料庫伺服器運行配置, + 有關參數的解釋可見:http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html 和 + http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html。 + + +
硬體的選擇
+ +
+ 電腦硬體對性能的影響可瀏覽 + http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html 和 + http://www.powerpostgresql.com/PerfList/。 +
+ +
+ + +

3.4)PostgreSQL 裡可以獲得什麼樣的調試特性?

+ + +

PostgreSQL 有很多類似 log_* 的伺服器配置變量可用於查詢的列印和進程統計,而這些工作對調試和性能測試很有幫助。 +

+ + + +

3.5) 為什麼在試圖連接時收到「Sorry, too many clients(已有太多用戶連接)」消息?

+

+ 這表示你已達到預設 100 個並發(同作)後台進程數的限制,你需要通過修改 postgresql.conf 文件中的 max_connections 值來 + 增加 postmaster 的後台併發處理數,修改後需重新啟動 postmaster。 + +

+ + +

3.6)PostgreSQL 的升級過程有哪些內容 ?

+

+ PostgreSQL 開發組對每次小版本的升級主要只做了一些 Bug 修正工作,因此從 7.4.8 升級到 7.4.9 不需要 dump 和 restore,僅需要停止資料庫伺服器,安裝更新後的軟體包,然後重啟伺服器即可。 +

+

+ +所有PostgreSQL的用戶應該在最接近(你所使用的主版本)的小改進版本發佈盡快升級。儘管每次升級可能都有一點風險,PostgreSQL的小改 +進版僅僅是設計用來修正一些 Bug 的,程式碼改動較少,所以風險還是很小的。PostgreSQL社區認為一般情況下不升級的風險還是多於升級的。 +

+

+ 主版本的升級(例如從 7.3 到 7.4)通常會修改系統表和資料表的內部格式。 + 這些改變一般比較複雜,因此我們不維持資料文件的向後兼容性。因此從老版本中進行資料導出(dump)/然後在新版本中進行資料導入(reload)對主版本的升級是必須的。 + +

+ +

3.7)(使用 PostgreSQL )我需要使用什麼電腦硬體 ?

+

+ 由於電腦硬體大多數是相容的,人們總是傾向於相信所有電腦硬體質量也是相同的。事實上不是, + ECC RAM(帶奇偶校驗的記憶體),SCSI (硬碟)和優質的主機板比一些便宜貨要更加可靠且具有更好的性能。 PostgreSQL 幾乎可以運行在任何硬體上, + 但如果可靠性和性能對你的系統很重要,你就需要全面的研究一下你的硬體組態了。在我們的郵件列表上也有關於 + 硬體配置和性價比的討論。 +

+ + +
+ +

操作問題

+ + + +

4.1) 如何只選擇一個查詢結果的頭幾行?或是隨機的一行?

+

+ 如果你只是要提取幾行資料,並且你在執行查詢中知道確切的行數,你可以使用 LIMIT 功能。 + 如果有一個索引與 ORDER BY 中的條件匹配,PostgreSQL 可能就只處理要求的頭幾條記錄, + (否則將對整個查詢進行處理直到生成需要的行)。如果在執行查詢功能時不知道確切的記錄數, + 可使用游標(cursor)和FETCH功能。 +

+

+ 可使用以下方法提取一行隨機記錄的: +

+
       SELECT  cols
+      FROM tab
+      ORDER BY random()
+      LIMIT 1 ;
+
+
+ + + +

4.2) 如何查看表、索引、資料庫以及用戶的定義?如何查看psql裡用到的查詢指令並顯示它們?

+

+ 在psql中使用 \dt 命令來顯示資料表的定義,要瞭解 psql 中的完整命令列表可使用 \? ,另外,你也可以閱讀 psql 的源代碼 + 文件 pgsql/src/bin/psql/describe.c,它包括為生成 psql 反斜槓命令的輸出的所有 SQL 命令。你還可以帶 -E 選項啟動 psql, + 這樣它將列印出你在 psql 中所給出的命令執行時的內部實際使用的 SQL 查詢語句。PostgreSQL也提供了一個兼容 SQL的 INFORMATION SCHEMA 接口, + 你可以從這裡獲取關於資料庫的資訊。 + +

+

+ 在系統中也有一些以 pg_ 打頭的系統表也描述了表的定義。 +

+

+ 使用 psql -l 指令可以列出所有的資料庫。 +

+

+ 也可以瀏覽一下 pgsql/src/tutorial/syscat.source 文件,它列舉了很多可從資料庫系統表中獲取資訊的SELECT語法。 + +

+ + +

4.3) 如何更改一個欄位的資料類型?

+

+ 在8.0版本裡更改一個欄位的資料類型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。 +

+

+ 在以前的版本中,可以這樣做: +

+
    BEGIN;
+    ALTER TABLE tab ADD COLUMN new_col new_data_type;
+    UPDATE tab SET new_col = CAST(old_col AS new_data_type);
+    ALTER TABLE tab DROP COLUMN old_col;
+    COMMIT;
+
+
+

+ 你然後可以使用 VACUUM FULL tab 指令來使系統收回無效資料所佔用的空間。 +

+ +

4.4) 單條記錄,單個表,單個資料庫的最大限制是多少?

+

+ 下面是一些限制: +

+
+ + + + + + + + + + + + + + + + +
單個資料庫最大尺寸?無限制(已存在有 32TB 的資料庫)
單個表的最大尺寸?32 TB
一行記錄的最大尺寸?1.6 TB
一個欄位的最大尺寸?1 GB
一個表裡最大列數?無限制
一個表裡最大欄位數?250-1600 (與列類型有關)
一個表裡的最大索引數量?無限制
+
+ + +

+ 當然,實際上沒有真正的無限制,還是要受可用磁盤空間、可用記憶體/交換區的制約。 + 事實上,當上述這些數值變得異常地大時,系統性能也會受很大影響。 +

+ +

+ 單表的最大大小 32 TB 不需要作業系統對單個文件也需這麼大的支持。大表用多個 1 GB 的文件存儲,因此文件系統大小的限制是不重要的。 +

+

+ 如果預設的塊大小增長到 32K ,最大的單表大小和最大列數還可以增加到四倍。 +

+

+ 有一個限制就是不能對大小多於2000字節的列創建索引。幸運地是這樣的索引很少用到。通過對多字節列的內容進行MD5哈稀運算結果進行函數索引可對列的唯一性得到保證, + 並且全文檢索允許對列中的單詞進行搜索。 +

+ + +

4.5) 存儲一個典型的文本文件裡的資料需要多少磁盤空間?

+

+ 一個 Postgres 資料庫(存儲一個文本文件)所佔用的空間最多可能需要相當於這個文本文件自身大小5倍的磁盤空間。 +

+

+ 例如,假設有一個 100,000 行的文件,每行有一個整數和一個文本描述。 + 假設文本串的平均長度為20位元組(Byte)。文本文件佔用 2.8 MB。存放這些資料的PostgreSQL資料庫文件大約是 5.2 MB: +

+
     24 字元組: 每行的頭(大約值)
+     24 字元組節: 一個整數型欄位和一個文本型欄位
+   +  4 字元組節: 頁面內指向元組的指針
+   ----------------------------------------
+     52 字元組每行
+
+   PostgreSQL 資料頁的大小是 8192 位元組 (8 KB),則:
+
+   8192 字元組每頁
+   -------------------   =  158 行/資料頁(向下取整)
+     52 字元組每行
+
+   100000 資料行
+   --------------------  =  633 資料頁(向上取整)
+      146 行/資料頁
+
+   633 資料頁 * 8192 字節/頁  = 5,185,536 字節(5.2 MB)
+
+ + +

+ 索引不需要這麼多的額外消耗,但也確實包括被索引的資料,因此它們也可能很大。 +

+

+ 空值 NULL 存放在位圖中,因此佔用很少的空間。 +

+ +

4.6) 為什麼我的查詢很慢?為什麼這些查詢沒有利用索引?

+

+ 並非每個查詢都會自動使用索引。只有在表的大小超過一個最小值,並且查詢只會選中表中較小比例的記錄時才會採用索引。 + 這是因為索引掃瞄引起的隨即磁盤存取可能比直接地讀取表(順序掃瞄)更慢。 + +

+

+ 為了判斷是否使用索引,PostgreSQL 必須獲得有關表的統計值。這些統計值可以使用 VACUUM ANALYZE,或 ANALYZE 獲得。 + 使用統計值,優化器知道表中有多少行,就能夠更好地判斷是否利用索引。 + 統計值對確定優化的連接順序和連接方法也很有用。在表的內容發生變化時,應定期進行統計值的更新收集。 +

+

+ 索引通常不用於 ORDER BY 或執行連接。對一個大表的一次順序掃瞄再做一次排序通常比索引掃瞄要快。然而,如果將 LIMIT 和 ORDER BY + 結合在一起使用的話,通常將會使用索引,因為這時僅返回表中的一小部分記錄。 +

+

+ 如果你確信PostgreSQL的優化器使用順序掃瞄是不正確的,你可以使用SET enable_seqscan TO 'off'指令來關閉順序掃瞄, + 然後再次運行查詢,你就可以看出使用一個索引掃瞄是否確實要快一些。 +

+ +

+ + 當使用通配符操作,例如 LIKE 或 ~ 時,索引只能在特定的情況下使用: +

+ +

+ 在 8.0 之前的版本中,除非要查詢的資料類型和索引的資料類型相匹配,否則索引經常是未被用到,特別是對 int2, int8 和數值型的索引。 +

+ +

4.7) 我如何才能看到查詢優化器是怎樣評估處理我的查詢?

+ + +

參考 EXPLAIN 手冊頁。

+ +

4.8) 我怎樣做正則表達式搜索和大小寫無關的正則表達式查找?怎樣利用索引進行大小寫無關查找?

+

+ 操作符 ~ 處理正則表達式匹配,而 ~* 處理大小寫無關的正則表達式匹配。大小寫無關的 LIKE 變種成為 ILIKE。 + +

+

+ 大小寫無關的等式比較通常寫做: +

+
    SELECT *
+    FROM tab
+    WHERE lower(col) = 'abc';
+
+ +

+ 這樣將不會使用標準的索引。但是可以創建一個在這種情況下使用的表達式索引: +

+
    CREATE INDEX tabindex ON tab (lower(col));
+
+
+

+ 如果上述索引在創建時加入 UNIQUE 約束,雖然索引欄位自身內容可以存儲大小寫不限的內容,但如果有 UNIQUE 約束後,這些內容不能僅僅是大小寫不同(否則會造成衝突)。為了保證不發生這種情況,可以使用 CHECK 約束條件或是觸發器在錄入時進行限制。 +

+ + +

4.9) 在一個查詢裡,我怎樣檢測一個欄位是否為 NULL ?我如何才能準確排序而不論某欄位是否含 NULL 值?

+

+ + 用 IS NULL 和 IS NOT NULL 測試這個欄位,具體方法如下: +

+
   SELECT *
+   FROM tab
+   WHERE col IS NULL;
+
+ +

為了能對含 NULL 欄位排序,可在 ORDER BY 條件中使用 IS NULL 和 + IS NOT NULL 修飾符,條件為真 true 將比條件為假 false 排在前面,下面的例子就會將含 + NULL 的記錄排在結果的上面部分: + +

+
   SELECT *
+   FROM tab
+   ORDER BY (col IS NOT NULL)
+
+ +

4.10) 各種字符類型之間有什麼不同?

+
+ + + + + + + + + + + + + + +
類型內部名稱說明
VARCHAR(n)varchar指定了最大長度,變長字符串,不足定義長度的部分不補齊
CHAR(n)bpchar定長字符串,實際資料不足定義長度時,以空格補齊
TEXTtext沒有特別的上限限制(僅受行的最大長度限制)
BYTEAbytea變長字節序列(使用NULL字符也是允許的)
"char"char單個字符
+
+ +

+ 在系統表和在一些錯誤資訊裡你將看到內部名稱。 +

+

+ 上面所列的前四種類型是 "varlena"(變長)類型(也就是說,開頭的四個字節是長度,後面才是資料)。 + 於是實際佔用的空間比聲明的大小要多一些。 + 然而這些類型如定義很長時都可以被壓縮存儲,因此磁盤空間也可能比預想的要少。 + +

+

+ VARCHAR(n) 在存儲限制了最大長度的變長字符串是最好的。 + TEXT 適用於存儲最大可達 1G 左右但未定義限制長度的字符串。 +

+

+ CHAR(n) 最適合於存儲長度相同的字符串。 CHAR(n)會根據所給定的欄位長度以空格補足(不足的欄位內容), + 而 VARCHAR(n) 只存儲所給定的資料內容。 + BYTEA 用於存儲二進制資料,尤其是包含 NULL 字節的值。這些類型具有差不多的性能。 + +

+ + + +

4.11.1) 我怎樣創建一個序列號或是自動遞增的欄位?

+

PostgreSQL 支持 SERIAL 資料類型。(欄位定義為SERIAL後)將自動創建一個序列生成器,例如: +

+
   CREATE TABLE person ( 
+      id   SERIAL, 
+      name TEXT 
+   );
+
+

+ 會自動轉換為以下SQL語句: +

+ +
   CREATE SEQUENCE person_id_seq;
+   CREATE TABLE person ( 
+      id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
+      name TEXT
+   );
+
+

+ 參考 create_sequence 手冊頁獲取關於序列生成器的更多資訊。 +

+ + +

4.11.2) 我如何獲得一個插入的序列號的值?

+

+ 一種方法是在插入之前先用函數 nextval() 從序列對象裡檢索出下一個 SERIAL 值,然後再用此值精確地插入。使用 + 4.11.1 裡的例表,可用偽碼這樣描述: + +

+
   new_id = execute("SELECT nextval('person_id_seq')");
+   execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
+
+

+ 這樣還能在其他查詢中使用存放在 new_id 裡的新值(例如,作為參照 person 表的外鍵)。 + 注意自動創建的 SEQUENCE 對象的名稱將會是 <table>_<serialcolumn>_seq, + 這裡 table 和 serialcolumn 分別是你的表的名稱和你的 SERIAL 欄位的名稱。 +

+

+ 類似的,在 SERIAL 對象預設插入後你可以用函數 currval() 檢索剛賦值的 SERIAL 值,例如: + +

+
   execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
+   new_id = execute("SELECT currval('person_id_seq')");
+
+ +

4.11.3) 同時使用 currval() 會導致和其他用戶的衝突情況嗎?

+

+ 不會。currval() 返回的是你本次會話進程所賦的值而不是所有用戶的當前值。
+ +

+ +

4.11.4) 為什麼不在事務異常中止後重用序列號呢?為什麼在序列號欄位的取值中存在間斷呢?

+

+ 為了提高併發性,序列號在需要的時候賦予正在運行的事務,並且在事務結束之前不進行鎖定, + 這就會導致異常中止的事務後,序列號會出現間隔。 +

+ +

4.12) 什麼是 OID ?什麼是 CTID ?

+ + +

PostgreSQL 裡創建的每一行記錄都會獲得一個唯一的 OID,除非在創建表時使用 WITHOUT OIDS 選項。 + OID 創建時會自動生成一個 4位元組的整數,所有 OID 在相應 PostgreSQL 伺服器中均是唯一的。 然而,它在超過 40億時將溢出, + OID 此後會出現重複。PostgreSQL 在它的內部系統表裡使用 OID 在表之間建立聯繫。 +

+

+ 在用戶的資料表中,最好是使用 SERIAl 來代替 OID + + 因為 SERIAL 只要保證在單個表中的數值是唯一的就可以了,這樣它溢出的可能性就非常小了, + SERIAL8 可用來保存8字元組的序列數值。 +

+ +

+ CTID 用於標識帶著資料塊(地址)和(塊內)偏移的特定的物理行。 + CTID 在記錄被更改或重載後發生改變。索引資料使用它們指向物理行。 +

+ + + +

4.13) 為什麼我收到錯誤資訊「ERROR: Memory exhausted in AllocSetAlloc()」?

+

+ 這很可能是系統的虛擬內存用光了,或者內核對某些資源有較低的限制值。在啟動 postmaster 之前試試下面的命令: +

+
   ulimit -d 262144
+   limit datasize 256m
+
+

+ 取決於你用的 shell,上面命令只有一條能成功,但是它將把你的進程資料段限制設得比較高, + 因而也許能讓查詢完成。這條命令應用於當前進程,以及所有在這條命令運行後創建的子進程。 + 如果你是在運行SQL客戶端時因為後台返回了太多的資料而出現問題,請在運行客戶端之前執行上述命令。 + +

+ +

4.14) 我如何才能知道所運行的PostgreSQL的版本?

+

+ 從 psql 裡,輸入 SELECT version();指令。 +

+ +

4.15) 我如何創建一個預設值是當前時間的欄位?

+

+ 使用 CURRENT_TIMESTAMP: + +

+
   CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
+
+ + +

4.16) 我怎樣進行 outer join (外連接)?

+

PostgreSQL 採用標準的 SQL 語法支持外連接。這裡是兩個例子:

+
   SELECT *
+   FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
+
+

或是

+ +
   SELECT *
+   FROM t1 LEFT OUTER JOIN t2 USING (col);
+
+

+ 這兩個等價的查詢在 t1.col 和 t2.col 上做連接,並且返回 t1 中所有未連接的行(那些在 t2 中沒有匹配的行)。 + 右[外]連接(RIGHT OUTER JOIN)將返回 t2 中未連接的行。 + 完全外連接(FULL OUTER JOIN)將返回 t1 和 t2 中未連接的行。 + 關鍵字 OUTER 在左[外]連接、右[外]連接和完全[外]連接中是可選的,普通連接被稱為內連接(INNER JOIN)。 +

+ + +

4.17) 如何使用涉及多個資料庫的查詢?

+

+ 沒有辦法查詢當前資料庫之外的資料庫。 + 因為PostgreSQL要加載與資料庫相關的系統目錄(系統表),因此跨資料庫的查詢如何執行是不定的。 +

+ +

+ 附加增值模塊 contrib/dblink 允許採用函數調用實現跨庫查詢。當然用戶也可以同時連接到不同的資料庫執行查詢然後在客戶端合併結果。 +

+ +

4.18) 如何讓函數返回多行或多列資料?

+

+ 在函數中返回資料記錄集的功能是很容易使用的,詳情參見: + http://techdocs.postgresql.org/guides/SetReturningFunctions +

+ +

4.19) 為什麼我在使用 PL/PgSQL 函數存取臨時表時會收到錯誤資訊「relation with OID ##### does not exist」?

+ +

+ PL/PgSQL 會緩存函數的腳本內容,由此帶來的一個不好的副作用是若一個 PL/PgSQL + 函數訪問了一個臨時表,然後該表被刪除並重建了,則再次調用該函數將失敗, + 因為緩存的函數內容仍然指向舊的臨時表。解決的方法是在 PL/PgSQL 中用EXECUTE + 對臨時表進行訪問。這樣會保證查詢在執行前總會被重新解析。 +

+ +

4.20) 目前有哪些資料複寫(replication)方案可用?

+

+ 「複寫」只是一個術語,有好幾種複寫技術可用,每種都有優點和缺點: +

+

+ + 主/從式複寫方式是允許一個主伺服器接受讀/寫的申請,而多個從伺服器只能接受讀/SELECT查詢的申請, + 目前最流行且免費的主/從PostgreSQL複寫方案是 + Slony-I 。 +

+

+ 多個主伺服器的複寫方式允許將讀/寫的申請發送給多台的主機,這種方式由於需要在多台伺服器之間同步資料變動 + 可能會帶來較嚴重的性能損失,Pgcluster 是目前這種方案中最好的,並且還可以免費下載。 +

+

+ 也有一些商業需付費和基於硬體的資料複寫方案,支持上述各種複寫模型。 +

+ + +

4.21) 為何查詢結果顯示的表名或欄名與我的查詢語句中的不同?為何大寫狀態不能保留?

+ +

+ 最常見的原因是在創建表時對表名或是欄名使用了雙引號( ' ' ),當使用了雙引號後,表名或欄名(稱為標識符)存儲時是區分 +大小寫的, + 這意謂著你在查詢時表名或欄名也應使用雙引號,一些工具軟體,像 pgAdmin 會在發出創建表的指令時自動地在每個標識符上加雙引號。 + 因此,為了標識符的統一,你應該:

+ + + + + \ No newline at end of file