
               Otvety na chasto zadavaemye voprosy po PostgreSQL
                                       
   Data poslednego obnovleniya: Sreda 2 fevralya 12:44:03 EST 2005
   
   Anglijskij variant soprovozhdaet: Bryus Mom'yan (Bruce Momjian)
   (pgman@candle.pha.pa.us)
   
   Perevel na russkij: Viktor Vislobokov (corochoone@perm.ru)
   
   Samuyu svezhuyu anglijskuyu versiyu dokumenta mozhno najti na
   http://www.PostgreSQL.org/files/documentation/faqs/FAQ.html.
   
   Otvety na voprosy specifichnye dlya konkretnyh platform mozhno najti
   na http://www.PostgreSQL.org/docs/faq/.
     _________________________________________________________________
   
                              Obschie voprosy
                                      
   1.1) CHto takoe PostgreSQL? Kak proiznositsya `eto nazvanie?
   1.2) Kakovy avtorskie prava na PostgreSQL?
   1.3) Na kakih platformah rabotaet PostgreSQL?
   1.4) Gde mozhno vzyat' PostgreSQL?
   1.5) Gde poluchit' podderzhku?
   1.6) Kak mne soobschit' ob oshibke?
   1.7) Kakaya versiya poslednyaya?
   1.8) Kakaya dokumentaciya imeetsya v nalichii?
   1.9) Kak najti informaciyu ob izvestnyh oshibkah ili otsutstvuyuschih
   vozmozhnostyah?
   1.10) Kak nauchit'sya SQL?
   1.11) Kak prisoedinitsya k komande razrabotchikov?
   1.12) Kak sravnivat' PostgreSQL s drugimi SUBD?
   
                 Voprosy pol'zovatelej po klientskoj chasti
                                      
   2.1) Kakie interfejsy est' dlya PostgreSQL?
   2.2) Kakie instrumenty suschestvuyut dlya ispol'zovaniya PostgreSQL
   cherez Web?
   2.3) Est' li u PostgreSQL graficheskij interfejs pol'zovatelya?
   
                         Voprosy administrirovaniya
                                      
   3.1) Kak mne ustanovit' PostgreSQL v mesto otlichnoe ot
   /usr/local/pgsql?
   3.2) Kak mne upravlyat' soedineniyami s drugih komp'yuterov?
   3.3) Kakie nastrojki mne nuzhno sdelat' dlya uluchsheniya
   proizvoditel'nosti?
   3.4) Kakie vozmozhnosti dlya otladki est' v nalichii?
   3.5) Pochemu ya poluchayu soobschenie "Sorry, too many clients" kogda
   pytayus' podklyuchit'sya k baze?
   3.6) Pochemu neobhodimo delat' dump i restore pri obnovlenii vypuskov
   PostgreSQL?
   3.7) Kakoe komp'yuternoe "zhelezo" ya dolzhen ispol'zovat'?
   
                           Voprosy `ekspluatacii
                                      
   4.1) Kak vypolnit' SELECT tol'ko dlya neskol'kih pervyh strochek
   zaprosa? Dlya proizvol'noj stroki?
   4.2) Kak mne najti kakie tablicy, indeksy, bazy dannyh i pol'zovateli
   suschestvuyut? Kak mne uvidet' zaprosy, kotorye ispol'zuet psql dlya
   polucheniya `etoj informacii?
   4.3) Kak izmenit' tip dannyh kolonki?
   4.4) Kakovy maksimal'nye razmery dlya strok v tablice, tablic i bazy
   dannyh?
   4.5) Kak mnogo diskovogo prostranstva v baze dannyh nuzhno dlya
   sohraneniya dannyh iz obychnogo tekstovogo fajla?
   4.6) Pochemu moi zaprosy rabotayut medleno? Pochemu oni ne ispol'zuyut
   moi indeksy?
   4.7) Kak posmotret' na to, kak optimizator vypolnyaet moj zapros?
   4.8) Kak mne vypolnit' poisk regulyarnogo vyrazheniya i poisk
   nezavisimyj ot registra bukv poisk regulyarnogo vyrazheniya? Kak mne
   ispol'zovat' indeks dlya poiska nezavisimogo ot registra bukv?
   4.9) Kak ya mogu opredelit', chto znachenie polya ravno NULL v
   kakom-libo zaprose?
   4.10) Kakovy otlichiya mezhdu raznymi simvol'nymi tipami?
   4.11.1) Kak mne sozdat' pole serial/s-avto-uvelicheniem?
   4.11.2) Kak mne poluchit' znachenie pri vstavke SERIAL?
   4.11.3) Ne mozhet li poluchit'sya tak, chto ispol'zovanie currval() i
   nextval() privedet k zaciklirovaniyu s drugimi pol'zovatelyami?
   4.11.4) Pochemu chisla iz moej posledovatel'nosti ne ispol'zuyutsya
   snova pri otmene tranzakcii? Pochemu sozdayutsya razryvy pri numeracii
   v kolonke, gde ya ispol'zuyu posledovatel'nost'/SERIAL?
   4.12) CHto takoe OID? CHto takoe TID?
   4.13) Pochemu ya poluchayu oshibku "ERROR: Memory exhausted in
   AllocSetAlloc()"?
   4.14) Kak mne uznat', kakaya versiya PostgreSQL zapuschena?
   4.15) Pochemu pri rabote s moim bol'shim ob"ektom ya poluchayu oshibku
   "invalid large obj descriptor"?
   4.16) Kak mne sozdat' kolonku kotoraya po umolchaniyu budet soderzhat'
   tekuschee vremya?
   4.17) Kak vypolnit' vneshnee svyazyvanie?
   4.18) Kak vypolnyat' zaprosy, ispol'zuyuschie neskol'ko baz dannyh?
   4.19) Kak mne vernut' iz funkcii neskol'ko strok tablicy?
   4.20) Pochemu ya ne mogu nadezhno sozdavat'/udalyat' vremennye tablicy
   v funkciyah PL/PgSQL?
   4.21) Kakie opcii shifrovaniya suschestvuyut?
   
                          Rasshireniya PostgreSQL
                                      
   5.1) YA napisal funkciyu opredelyaemuyu pol'zovatelem. Kogda ya
   zapuskayu ee v psql, pochemu ya poluchayu core dump?
   5.2) Kak ya mogu vnesti nekotorye klassnye novye tipy i funkcii v
   PostgreSQL?
   5.3) Kak mne napisat' C funkciyu, vozvraschayuschuyu stroku tablicy?
   5.4) YA izmenil ishodnyj fajl. Pochemu posle perekompilyacii ya ne
   vizhu izmenenij?
     _________________________________________________________________
   
                              Obschie voprosy
                                      
    1.1) CHto takoe PostgreSQL? Kak proiznositsya `eto nazvanie?
    
   PostgreSQL proiznositsya Post-Gres-Q-L (Post-Gres-K'yu-`El), takzhe
   chasto govoryat prosto Postgres.
   
   PostgreSQL - `eto ob"ektno-relyacionnaya sistema upravleniya bazami
   dannyh (SUBD), kotoraya imeet tradicionnye vozmozhnosti kommercheskih
   SUBD s rasshireniyami, kotorye est' v SUBD novogo pokoleniya.
   PostgreSQL - `eto svobodnoe i polnost'yu otkrytoe programmnoe
   obespechenie.
   
   Razrabotku PostgreSQL vypolnyaet komanda razrabotchikov, razbrosannaya
   po vsemu miru i svyazannaya cherez Internet. Razrabotka yavlyaetsya
   obschestvennym proektom i ne upravlyaetsya kakoj-libo kompaniej.
   Podrobnosti smotrite v FAQ dlya razrabotchikov,
   http://www.PostgreSQL.org/files/documentation/faqs/FAQ_DEV.html
   
    1.2) Kakovy avtorskie prava na PostgreSQL?
    
   PostgreSQL rasprostranyaetsya po klassicheskoj licenzii BSD. `Eta
   licenziya ne soderzhit ogranichenij na to, kak budet ispol'zovat'sya
   ishodnyj kod. Nam nravitsya `eta licenziya i u nas net namerenij eio
   menyat'.
   
   Vot `eta licenziya BSD, kotoruyu my ispol'zuem:
   
   Sistema Upravleniya Bazami Dannyh PostgreSQL
   
   Portions copyright (c) 1996-2005, PostgreSQL Global Development Group
   Portions Copyright (c) 1994-6 Regents of the University of California
   
   Predostavlyayutsya prava na ispol'zovanie, kopirovanie, izmenenie i
   rasprostranenie dannogo programmnogo obespecheniya i ego dokumentacii
   dlya lyubyh celej, besplatno i bez podpisaniya kakogo-libo
   soglasheniya, pri uslovii chto dlya kazhdoj kopii budut predostavleny
   dannoe vyshe zamechanie ob avtorskih pravah, tekuschij paragraf i dva
   sleduyuschih paragrafa.
   
   KALIFORNIJSKIJ UNIVERSITET NE NESET NIKAKOJ OTVETSTVENNOSTI ZA LYUBYE
   POVREZHDENIYA, VKLYUCHAYA POTERYU DOHODA, NANESENNYE PRYAMYM ILI
   NEPRYAMYM, SPECIAL'NYM ILI SLUCHAJNYM ISPOL'ZOVANIEM DANNOGO
   PROGRAMMNOGO OBESPECHENIYA ILI EGO DOKUMENTACII, DAZHE ESLI
   KALIFORNIJSKIJ UNIVERSITET BYL IZVESCHEN O VOZMOZHNOSTI TAKIH
   POVREZHDENIJ.
   
   KALIFORNIJSKIJ UNIVERSITET SPECIAL'NO OTKAZYVAZYVAETSYA PREDOSTAVLYAT'
   LYUBYE GARANTII, VKLYUCHAYA, NO NE OGRANICHIVAYAS' TOL'KO `ETIMI
   GARANTIYAMI: NEYAVNYE GARANTII PRIGODNOSTI TOVARA ILI PRIGODNOSTI DLYA
   OTDEL'NOJ CELI. DANNOE PROGRAMMNOE OBESPECHENIE PREDOSTAVLYAETSYA NA
   OSNOVE PRICIPA "KAK EST'" I KALIFORNIJSKIJ UNIVERSITET NE OBYAZAN
   PREDOSTAVLYAT' SOPROVOZHDENIE, PODDERZHKU, OBNOVLENIYA, RASSHIRENIYA
   ILI IZMENENIYA.
   
    1.3) Na kakih platformah rabotaet PostgreSQL?
    
   Obychno, PostgreSQL mozhet rabotat' na lyuboj sovremennoj platforme
   sovmestimoj s Unix. V instrukcii po ustanovke, vy najdete spisok teh
   platform, na kotoryh byli provedeny testovye zapuski PostgreSQL k
   momentu vyhoda dannoj versii.
   
   Nachinaya s versii 8.0, PostgreSQL bez vsyakih uhischrenij rabotaet na
   operacionnyh sistemah Microsoft Windows, osnovannyh na NT, takih kak
   Win2000, WinXP i Win2003. Paket installyatora dostupen po adresu
   http://pgfoundry.org/projects/pginstaller. Versii Windows, osnovannye
   na MS-DOS (Win95, Win98, WinMe) mogut zapuskat' PostgreSQL s
   pomosch'yu Cygwin.
   
   Takzhe suschestvuet versiya sportirovannaya pod Novell Netware 6 na
   http://forge.novell.com, i versiya dlya OS/2 (eComStation) na
   http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
   SQL&stype=all&sort=type&dir=%2F.
   
    1.4) Gde mozhno vzyat' PostgreSQL?
    
   Naprimer, vospol'zovavshis' anonimnym dostupom na ftp sajt PostgreSQL
   ftp://ftp.PostgreSQL.org/pub. Spisok zerkal vy najdete na nashem
   osnovnom sajte.
   
    1.5) Gde poluchit' podderzhku?
    
   Soobschestvo PostgreSQL predostavlyaet pomosch' mnozhestvu
   pol'zovatelej cherez E-mail. Osnovnoj web-sajt dlya podpiski na spiski
   rassylki po E-mail `eto: http://www.postgresql.org/community/lists/.
   Horoshim mestom dlya togo, chtoby nachat' zadavat' voprosy
   yavlyayutsya spiski general (obschie voprosy) ili bugs (oshibki).
   
   Glavnym IRC kanalom yavlyaetsya #postgreql, raspolozhennyj na servere
   Freenode (irc.freenode.net). CHtoby podklyuchit'sya, vy mozhete
   ispol'zovat' v Unix vyzov programmy irc -c '#postgresql' "$USER"
   irc.freenode.net ili lyuboj drugoj IRC klient. Na `etom zhe servere
   suschestvuyut kanaly na ispanskom (#postgresql-es) i francuzskom
   (#postgresqlfr) yazykah. Takzhe suschestvuet kanal po PostgreSQL na
   servere EFNet.
   
   Spisok kommercheskoj podderzhki kompanij dostupen na
   http://techdocs.postgresql.org/companies.php.
   
    1.6) Kak mne soobschit' ob oshibke?
    
   Posetite stranichku so special'noj formoj otchiota ob oshibke v
   PostgreSQL po adresu: http://www.postgresql.org/support/submitbug.
   
   Takzhe prover'te nalichie bolee svezhej versii PostgreSQL na nashem
   FTP sajte ftp://ftp.PostgreSQL.org/pub.
   
    1.7) Kakaya poslednyaya versiya?
    
   Poslednij vypusk PostgreSQL - `eto versiya 8.0.1
   
   My planiruem vypuskat' novye versii kazhdye 10-12 mesyacev.
   
    1.8) Kakaya dokumentaciya imeetsya v nalichii?
    
   PostgreSQL soderzhit mnogo dokumentacii, vklyuchaya bol'shoe
   rukovodstvo, stranicy `elektronnogo rukovodstva man i nekotorye
   malen'kie testovye primery. Smotrite v katalog /doc. Vy takzhe mozhete
   prosmatrivat' dokumentaciyu v Internet po adresu
   http://www.PostgreSQL.org/docs.
   
   Suschestvuet dve knigi po PostgreSQL dostupnye po adresam
   http://www.PostgreSQL.org/docs/awbook.html i
   http://www.commandprompt.com/ppbook/. Spisok knig po PostgreSQL,
   kotorye mozhno kupit' dostupen po adresu
   http://techdocs.postgresql.org/techdocs/bookreviews.php. Krome togo,
   po adresu http://techdocs.PostgreSQL.org/ vy mozhete najti kollekciyu
   tehnicheskih statej posvyaschennyh PostgreSQL.
   
   Klient komandnoj stroki psql imeet neskol'ko komand \d dlya
   otobrazheniya informacii po tipam, operatoram, funkciyam, agregatam i
   t.d. - ispol'zujte \? dlya polucheniya spiska dostupnyh komand.
   
   Nash sajt soderzhit esche bol'she informacii.
   
    1.9) Kak najti informaciyu ob izvestnyh oshibkah ili otsutstvuyuschih
    vozmozhnostyah?
    
   PostgreSQL podderzhivaet rasshirennyj podklass SQL-92. Smotrite nash
   spisok TODO na predmet izvestnyh oshibok, otsutstvuyuschih
   vozmozhnostej i buduschih planov.
   
    1.10) Kak mne nauchit'sya SQL?
    
   Kniga po PostgreSQL na http://www.PostgreSQL.org/docs/awbook.html
   nauchit SQL. Suschestvuet drugaya kniga po PostgreSQL na
   http://www.commandprompt.com/ppbook. Est' prekrasnyj uchebnik na
   http://www.intermedia.net/support/sql/sqltut.shtm, na
   http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
   i na http://sqlcourse.com.
   
   Esche odin uchebnik - `eto kniga "Teach Yourself SQL in 21 Days,
   Second Edition" (Osvoj samostoyatel'no SQL za 21 den', Vtoraya
   redakciya) na http://members.tripod.com/er4ebus/sql/index.htm
   
   Mnogim iz nashih pol'zovatelej nravitsya kniga The Practical SQL
   Handbook, Bowman, Judith S., et al., Addison-Wesley. Drugim nravitsya
   The Complete Reference SQL, Groff et al., McGraw-Hill.
   
    1.11) Kak prisoedinitsya k komande razrabotchikov?
    
   Dlya nachala, skachajte poslednyuyu versiyu ishodnyh tekstov i
   prochtite FAQ i dokumentaciyu dlya razrabotchikov PostgreSQL na nashem
   sajte ili v distributive. Zatem, podpishites' na spiski rassylki
   pgsql-hackers i pgsql-patches. Dalee, otpravlyajte ispravleniya
   (patches) vysokogo kachestva v spisok pgsql-patches.
   
   Suschestvuet ogranichennyj spisok lyudej, kotoryj imeyut privelegiyu
   vnosit' izmeneniya v CVS arhiv PostgreSQL. Kazhdyj iz `etih lyudej v
   svoe vremya otpravil tak mnogo vysokokachestvennyh ispravlenij, chto
   ih bylo nevozmozhno ostavit' bez vnimaniya i oni byli udostoeny
   previlegii vnosit' izmeneniya, i my uvereny, chto te ispravleniya,
   kotorye oni vnesut budut vysokogo kachestva.
   
    1.12) Kak sravnivat' PostgreSQL s drugimi SUBD?
    
   Suschestvuet neskol'ko metodov sravneniya programmnogo obespecheniya:
   vozmozhnosti, proizvoditel'nost', nadezhnost', podderzhka i cena.
   
   Vozmozhnosti
          PostgreSQL imeet bol'shinstvo vozmozhnostej predstavlennyh v
          bol'shih kommercheskih SUBD, takie kak: tranzakcii, podzaprosy,
          triggery, predstavleniya, ssylochnoj celostnosti vtorichnogo
          klyucha i raznye blokirovki. U nas est' nekotorye vozmozhnosti,
          kotoryh net u nih: tipy, opredelyaemye pol'zovatelem, mehanizm
          nasledovaniya, pravila i konkuretnoe mnogoversionnoe upravlenie
          dlya raboty s soderzhimym blokirovok.
          
   Proizvoditel'nost'
          Proizvoditel'nost' PostgreSQL shodna s drugimi kommercheskimi
          SUBD i s SUBD s otkrytym ishodnym kodom. V kakih-to veschah my
          bystree, v kakih-to medlennee. V sravnenii s MySQL ili linejnoj
          SUBD, my bystree, kogda pol'zovatelej mnogo, a takzhe na
          slozhnyh zaprosah i pri chtenii/zapisi zagruzki zaprosa. MySQL
          bystree dlya prostyh SELECT zaprosov, vypolnyaemyh nebol'shim
          kolichestvom pol'zovatelej. I razumeetsya, MySQL ne imeet
          kakih-libo vozmozhnostej iz perechislenyh vyshe, v sekcii
          Vozmozhnosti. My delaem upor na nadezhnost' i rasshirennye
          vozmozhnosti, no my takzhe prodolzhaem uvelichivat'
          proizvoditel'nost' s kazhdym vypuskom.
          
   Nadezhnost'
          My ponimali, chto nasha SUBD dolzhna byt' nadezhnoj ili ona
          nichego ne budet stoit'. My staraemsya vypuskat' horosho
          proverennyj, stabil'nyj kod, kotoryj soderzhit minimum oshibok.
          Kazhdyj vypusk prohodit stadiyu beta-testirovaniya po krajnej
          mere v techenii odnogo mesyaca i nasha istoriya vypuskov
          pokazyvaet chto my mozhem predostavlyat' stabil'nye, monolitnye
          vypuski, kotorye gotovy k produktivnomu ispol'zovaniyu. My
          verim, chto my proizvodim proverku ne huzhe, chem u drugih
          SUBD.
          
   Podderzhka
          Nash spisok rassylki predostavlyaet vozmozhmozhnost' obscheniya
          s bol'shoj gruppoj razrabotchikov i pol'zovatelej, kotorye
          mogut pomoch' reshit' lyubye voznikshie problemy. V to zhe
          vremya, my ne garantiruem kakie-libo ispravleniya, no i
          razrabotchiki kommercheskih SUBD ne vsegda delayut
          ispravleniya. Pryamoj dostup k razrabotchikam, soobschestvu
          pol'zovatelej, rukovodstvam i ishodnym tekstam chasto delayut
          podderzhku PostgreSQL prevoshodyaschej drugie SUBD.
          Suschestvuet kommercheskaya podderzhka po rezul'tam voznikshih
          incidentov, kotoraya dostupna dlya teh komu ona nuzhna.
          (Smotrite Sekciyu 1.5.)
          
   Cena
          Nash produkt besplaten kak dlya kommercheskogo tak, i ne dlya
          kommercheskogo ispol'zovaniya. Vy mozhete dobavlyat' svoj kod v
          nash produkt bez ogranichenij, za isklyucheniem teh, chto
          opisyvayutsya v nashej licenzii stilya BSD, kotoraya privedena
          vyshe.
          
                 Voprosy pol'zovatelej po klientskoj chasti
                                      
    2.1) Kakie interfejsy est' dlya PostgreSQL?
    
   Ustanovka PostgreSQL vklyuchaet tol'ko C i vstroennyj (embedded) C
   interfejsy. Vse drugie interfejsy yavlyayutsya nezavisimymi proektami
   i zagruzhayutsya otdel'no; samostoyatel'nost' proektov pozvolyaet im
   organizovat' sobstvennoe raspisanie vypuskov novyh versij i imet'
   sobstvennuyu komandu razrabotchikov.
   
   Nekotorye yazyki programmirovaniya, takie kak PHP vklyuchayut v sebya
   interfejs k PostgreSQL. Interfejsy dlya takih yazykov kak Perl, TCL,
   Python i mnogih drugih, dostupny na http://gborg.postgresql.org v
   sekcii Drivers/Interfaces, a takzhe cherez poisk v Internet.
   
    2.2) Kakie instrumenty suschestvuyut dlya ispol'zovaniya PostgreSQL cherez
    Web?
    
   Prekrasnoe vvedenie vo vzaimodejstvie baz dannyh i Web mozhno najti
   na: http://www.webreview.com
   
   Dlya integracii s Web, PHP http://www.php.net yavlyaetsya neplohim
   interfejsom.
   
   V slozhnyh sluchayah, mnogie pol'zuyutsya Perl i CGI.pm ili mod_perl.
   
    2.3) Est' li u PostgreSQL graficheskij interfejs pol'zovatelya?
    
   Da, suschestvuet neskol'ko graficheskih interfejsov dlya PostgreSQL.
   Oni vklyuchayut PgAdmin III (http://www.pgadmin.org), PgAccess
   (http://www.pgaccess.org), RHDB Admin
   (http://sources.redhat.com/rhdb/), TORA (http://www.globecom.net/tora/
   chastichno kommercheskoe PO) i Rekall (
   http://www.rekallrevealed.org/). Takzhe est' PhpPgAdmin (
   http://phppgadmin.sourceforge.net/) - interfejs k PostgreSQL,
   osnovannyj na Web.
     _________________________________________________________________
   
                         Voprosy administrirovaniya
                                      
    3.1) Kak mne ustanovit' PostgreSQL v mesto otlichnoe ot /usr/local/pgsql?
    
   Zadajte opciyu --prefix kogda zapuskaete configure.
   
    3.2) Kak mne upravlyat' soedineniyami s drugih komp'yuterov?
    
   Po umolchaniyu, PostgreSQL razreshaet tol'ko soedineniya na lokal'noj
   mashine cherez sokety domena Unix ili TCP/IP soedineniya. Dlya togo,
   chtoby drugie mashiny smogli podklyuchit'sya k baze vy dolzhny
   izmenit' listen_addresses v postgresql.conf, razreshit'
   host-avtorizaciya v fajle $PGDATA/pg_hba.conf i perestartovat' server.
   
    3.3) Kakie nastrojki mne nuzhno sdelat' dlya uluchsheniya
    proizvoditel'nosti?
    
   Suschestvuet tri glavnyh oblasti, kotorye potencial'no mogut
   uvelichit' proizvoditel'nost':
   
   Izmenenie zaprosa
          `Eto oznachaet modifikaciyu zaprosov dlya polucheniya luchshej
          proizvoditel'nosti:
          
          + Sozdanie indeksov, vklyuchaya indeksy vyrazhenij i
            chastichnye indeksy
          + Ispol'zovanie COPY vmesto mnozhestva INSERT
          + Gruppirovka neskol'kih operatorov v edinuyu tranzakciyu dlya
            umen'sheniya nagruzki pri vypolnenii zaversheniya tranzakcii
          + Ispol'zovanie CLUSTER, kogda iz indeksa beriotsya mnozhestvo
            strok
          + Ispol'zovanie LIMIT dlya togo, chtoby vozvraschalas' tol'ko
            chast' vyvoda ot zaprosa
          + Ispol'zovanie Podgotovlennyh (Prepared) zaprosov
          + Ispol'zovanie ANALYZE dlya obsluzhivaniya statistiki
            optimizatora
          + Regulyarnoe ispol'zovanie VACUUM ili pg_autovacuum
          + Udalenie indeksov vo vremya bol'shih izmenenij dannyh
            
   Nastrojka servera
          Nekotorye ustanovki v postgresql.conf vliyayut na
          proizvoditel'nost'. Podrobnyj polnyj spisok ustanovok sm. v
          Administration Guide/Server Run-time Environment/Run-time
          Configuration, a kommentarii sm. v
          http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
          nf_e.html i
          http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
          
   Vybor "zheleza" - apparatnogo obespecheniya
          Vliyanie "zheleza" na proizvoditel'nost' podrobno opisano v
          http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde
          x.html i http://www.powerpostgresql.com/PerfList/.
          
    3.4) Kakie vozmozhnosti dlya otladki est' v nalichii?
    
   Est' mnozhestvo ustanovok v nastrojkah servera, nachinayuschihsya na
   log_*, pozvolyayuschih protokolirovat' zaprosy i statistiku raboty
   processa, kotoraya ochen' polezna dlya otladki i izmereniya
   proizvoditel'nosti.
   
   Dlya predostavleniya bolee detal'noj informacii razrabotchikam servera
   pri otladke kakoj-libo problemy dolzhny pol'zovat'sya sleduyuschie
   instrukcii.
   
   Takim zhe obrazom mozhno proizvodit' i otladku severa, esli on
   rabotaet nepravil'no. Vo-pervyh, pri zapuske configure s opciej
   --enable-cassert, mnogie vyzovy assert() pozvolyayut otslezhivat'
   rabotu backend processa i ostanovku programmy pri vozniknovenii
   kakih-libo neozhidannostej.
   
   Esli postmaster ne zapuschen, vy mozhete zapustit' postgres backend iz
   komandnoj stroki i vvesti vash operator SQL napryamuyu. `Eto
   rekomenduetsya tol'ko dlya celej otladki. Zametim, chto v `etom
   rezhime, zapros zavershaetsya simvolom novoj stroki, a ne tochkoj s
   zapyatoj. Esli vy proizvodili kompilyaciyu s otladochnymi simvolami,
   vy mozhete ispol'zovat' lyuboj otladchik, chtoby posmotret', chto
   sluchilos'. Poskol'ku backend zapuskaetsya ne iz postmaster, on ne
   zapuskaetsya v identichnom okruzhenii i znachit problemy iteracij
   blokirovok/backend ne mogut byt' vosproizvedeny.
   
   Esli postmaster zapuschen, zapustite psql v odnom okne, zatem najdite
   PID processa postgres, ispol'zuemyj psql, ispol'zuya SELECT
   pg_backend_pid(). Ispol'zujte otladchik dlya podklyucheniya k postgres
   PID. Vy mozhete ustanovit' tochki preryvaniya v otladchike i zapustit'
   zapros iz psql. Esli vy proizvodite otladku zapuska postgres, vy
   mozhete ustanovit' PGOPTIONS="-W n", i zatem zapustit' psql. `Eta
   opciya privodit k zaderzhke processa zapuska na n sekund, v techenie
   kotoryh vy mozhete podklyuchit' k processu otladchik, ustanovit'
   lyubye tochki preryvaniya i prodolzhit' zapusk.
   
   Vy takzhe mozhete skompilirovat' PostgreSQL s profilirovaniem dlya
   togo, chtoby uvidet' kakie funkcii skol'ko vremeni vypolnyayutsya.
   Fajly profilirovaniya backend'a nahodyatsya v kataloge
   pgsql/data/base/dbname. Fajl profilirovaniya klienta budet pomeschen v
   tekuschij katalog klienta. V Linux dlya vypolneniya profilirovaniya
   trebuetsya kompilyacii s -DLINUX_PROFILE.
   
    3.5) Pochemu ya poluchayu soobschenie "Sorry, too many clients" kogda
    pytayus' podklyuchit'sya k baze?
    
   Vy dostigli ustanovlennogo po umolchaniyu ogranicheniya na 100 sessij
   podklyucheniya k baze dannyh. Vam neobhodimo uvelichit' dlya
   postmaster limit na kolichestvo konkurentnyh backend processov,
   izmeniv znachenie max_connections v fajle postgresql.conf i
   perestartovat' postmaster.
   
    3.6) Pochemu neobhodimo delat' dump i restore pri obnovlenii vypuskov
    PostgreSQL?
    
   Razrabotchiki PostgreSQL delayut tol'ko nebol'shie izmeneniya mezhdu
   podvypuskami. Takim obrazom obnovlenie s versii 7.4 do 7.4.1 ne
   trebuet vypolneniya dump i restore. Odnako pri vyhode ocherednogo
   vypuska (t.e. pri obnovlenii naprimer, s 7.3 na 7.4) chasto menyaetsya
   vnutrennij format sistemnyh tablic i fajlov dannyh. `Eti izmeneniya
   chasto nosyat kompleksnyj harakter, tak chto net vozmozhnosti
   obespechit' obratnuyu sovmestimost' fajlov dannyh. Vypolenie dump
   pozvolyaet poluchit' dannye v obschem formate, kotoryj zatem mozhet
   byt' zagruzhen pri ispol'zovanii novogo vnutrennego formata.
   
   V teh vypuskah, gde format dannyh na diske ne menyaetsya, dlya
   provedeniya obnovleniya mozhet byt' ispol'zovan scenarij pg_upgrade
   bez ispol'zovaniya dump/restore. Kommentarii k vypusku govorit kogda
   mozhno ispol'zovat' pg_upgrade dlya `etogo vypuska.
   
    3.7) Kakoe komp'yuternoe "zhelezo" ya dolzhen ispol'zovat'?
    
   Poskol'ku "zhelezo" personal'nyh komp'yuterov yavlyaetsya naibolee
   sovmestimym, lyudi sklonny verit', chto takoe "zhelezo" imeet
   odinakovoe kachestvo. `Eto ne tak. Pamyat' ECC, SCSI i kachestvennye
   materinskie platy yavlyayutsya bolee nadiozhnymi i imeyut bolee
   luchshuyu proizvoditel'nost', chem menee dorogoe "zhelezo". PostgreSQL
   budet rabotat' na lyubom "zheleze", no esli dlya vas vazhny
   nadiozhnost' i proizvoditel'nost', to s vashej storony budet mudro
   postavit' sootvetstvuyuschee "zhelezo". Obsudit' raznoe "zhelezo"
   mozhno v nashih spiskah rassylki.
     _________________________________________________________________
   
                           Voprosy `ekspluatacii
                                      
    4.1) Kak vypolnit' SELECT tol'ko dlya neskol'kih pervyh strochek zaprosa?
    Proizvol'noj stroki?
    
   Dlya polucheniya tol'ko neskol'kih strok, esli vy znaete ih
   kolichestvo na moment vypolneniya SELECT ispol'zujte LIMIT.
   Esli est' kakoj-libo indeks, kotoryj sovpadaet s ORDER BY, to
   vozmozhno, chto ves' zapros vypolnen i ne budet. Esli vy ne znaete
   kolichestva neobhodimyh strok na moment vypolneniya SELECT,
   ispol'zujte kursor i FETCH.
   
   To SELECT a random row, use:
    SELECT col
    FROM tab
    ORDER BY random()
    LIMIT 1;

    4.2) Kak mne najti kakie tablicy, indeksy, bazy dannyh i pol'zovateli
    suschestvuyut? Kak mne uvidet' zaprosy, kotorye ispol'zuet psql dlya
    polucheniya `etoj informacii?
    
   CHtoby prosmatrivat' tablicy v psql, ispol'zujte komandu \dt. Polnyj
   spisok komand v psql vy mozhete poluchit', ispol'zuya \?. Krome togo,
   vy mozhete posmotret' ishodnyj kod psql v fajle
   pgsql/src/bin/psql/describe.c. On soderzhit komandy SQL kotorye
   generiruyutsya pri vvode v psql komand, nachinayuschihsya s obratnoj
   kosoj cherty. Vy takzhe mozhete zapustit' psql s opciej -E tak, chtoby
   `eta programma vydavala zaprosy, kotorye ona ispol'zuet dlya
   vypolneniya zadannyh vami komand. PostgreSQL takzhe predostavlyaet SQL
   sovmestimyj s INFORMATION SCHEMA interfejs, s pomosch'yu kotorogo, vy
   mozhete sformirovat' zapros na poluchenie informacii o baze dannyh.
   
   Takzhe suschestvuyut sistemnye tablicy, nachinayuschiesya s pg_.
   
   Ispol'zujte psql -l dlya polucheniya spiska vseh baz dannyh.
   
   Takzhe posmotrite fajl pgsql/src/tutorial/syscat.source. On pokazyvaet
   mnogie iz operatorov SELECT neobhodimyh dlya polucheniya informacii iz
   sistemnyh tablic bazy dannyh.
   
    4.3) Kak izmenit' tip dannyh kolonki?
    
   V 8.0 i bolee pozdnih versiyah, izmenenie tipa kolonki vypolnyaetsya
   ochen' legko cherez ALTER TABLE ALTER COLUMN TYPE.
   
   V bolee rannih versiyah sdelajte tak:
    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;

    4.4) Kakovy maksimal'nye razmery dlya strok v tablice, tablic i bazy
    dannyh?
    
   Suschestvuyut sleduyuschie ogranicheniya:
   
   Maksimal'nyj razmer bazy? neogranichen (suschestvuyut bazy na 32 TB)
   Maksimal'nyj razmer tablicy? 32 TB
   Maksimal'nyj razmer stroki? 1.6 TB
   Maksimal'nyj razmer polya? 1 GB
   Maksimal'noe kolichestvo strok v tablice? neogranicheno
   Maksimal'noe kolichestvo kolonok v tablice? 250-1600 v zavisimosti ot
   tipa
   Maksimal'noe kolichestvo indeksov v tablice? neogranicheno
   
   Razumeetsya, ponyatie "neogranicheno" na samom dele ogranichivaetsya
   dostupnym diskovym prostranistvom i razmerami pamyati/svoppinga. Kogda
   znacheniya perechislennye vyshe neopravdano bol'shie, mozhet
   postradat' proizvoditel'nost'.
   
   Maksimal'nyj razmer tablicy v 32 TB ne trebuet chtoby operacionnaya
   sistema podderzhivala fajly bol'shih razmerov. Bol'shie tablicy
   hranyatsya kak mnozhestvo fajlov razmerom v 1 GB, tak chto
   ogranicheniya, kotorye nakladyvaet fajlovaya sistema ne vazhny.
   
   Maksimal'nyj razmer tablicy i maksimal'noe kolichestvo kolonok mogut
   byt' uvelicheny v chetyre raza, esli razmer bloka po umolchaniyu budet
   uvelichen do 32k.
   
    4.5) Kak mnogo diskovogo prostranstva v baze dannyh nuzhno dlya sohraneniya
    dannyh iz obychnogo tekstovogo fajla?
    
   SUBD PostgreSQL mozhet potrebovat'sya diskovogo prostranstva do 5 raz
   bol'she dlya sohraneniya dannyh iz prostogo tekstovogo fajla.
   
   V kachestve primera, rassmotrim fajl v 100,000 strok v kazhdoj, iz
   kotoryh celoe chislo i tekstovoe opisanie. Pri `etom dlina teksta, v
   srednem, sostavlyaet 20 bajt. Razmer prostogo fajla sostavit 2.8 MB.
   Razmer bazy PostgreSQL, soderzhaschej `eti zhe dannye sostavit
   priblizitel'no 6.4 MB iz kotoryh:
    32 bajt: na kazhdyj zagolovok stroki v tablice (priblizitel'no)
  + 24 bajta: odno pole s celochislennym tipom i odno tekstovoe pole
  +  4 bajta: ukazatel' na stranice dlya vsej tablichnoj stroki
   ----------------------------------------
    60 bajt na stroku v tablice

   Razmer stranicy dannyh v PostgreSQL sostavlyaet 8192 bajt (8 KB), tak chto:

   8192 bajt na stranicu
   ---------------------   =  136 strok v tablice na stranicu BD (okruglionno)
     60 bajt na stroku v tablice

     100000 strok dannyh
   ----------------------- =  735 stranic v BD (okruglionno)
   128 strok v tablice na stranicu

   735 stranic BD * 8192 bajt na stranicu = 6,021,120 bajt (6 MB)

   Indeksy ne trebuyut tak mnogo, no poskol'ku oni sozdayutsya dlya
   bol'shogo kolichestva dannyh, oni takzhe mogut byt' veliki.
   
   Znacheniya NULL hranyatsya kak bitovye karty i po`etomu oni zanimayut
   ochen' malo mesta.
   
    4.6) Pochemu moi zaprosy rabotayut medleno? Pochemu oni ne ispol'zuyut moi
    indeksy?
    
   Indeksy ne ispol'zuyutsya dlya kazhdogo zaprosa avtomaticheski. Oni
   ispol'zuyutsya tol'ko esli tablica bol'she minimal'nogo razmera i
   zapros vybiraet tol'ko malen'kij procent strok v tablice. Tak
   ustroeno, potomu chto dostup k disku s primeneniem randomizacii pri
   skanirovanii indeksov mozhet byt' medlennee, chem prostoe chtenie
   tablicy ili ee posledovatel'noe skanirovanie.
   
   CHtoby opredelit' neobhodimost' ispol'zovaniya indeksa dlya kakoj-libo
   tablicy, PostgreSQL dolzhen imet' statistiku po `etoj tablice. `Eta
   statistika sobiraetsya pri ispol'zovanii VACUUM ANALYZE ili prosto
   ANALYZE. Ispol'zuya statistiku, optimizator uznaet o tom kak mnogo
   strok v tablice i esli on dolzhen ispol'zovat' indeksy, to on mozhet
   prinimat' luchshie resheniya. Statistika takzhe vliyaet na opredelenie
   optimal'nogo poryadka svyazyvaniya i metoda svyazyvaniya. Pri
   izmenenii soderzhimogo tablicy dolzhen periodicheski vypolnyatsya sbor
   statistiki.
   
   Obychno indeksy ne ispol'zuyutsya dlya ORDER BY ili dlya vypolneniya
   svyazyvanij. Posledovatel'nyj perebor sleduyuschij za yavnoj
   sortirovkoj obychno bystree, chem poisk po indeksam v bol'shoj
   tablice. Odnako, ORDER BY chasto kombiniruetsya s LIMIT i v `etom
   sluchae indeks budet ispol'zovat'sya, poskol'ku pri vypolnenii budet
   vozvraschat'sya nebol'shaya chast' tablicy. Fakticheski MAX() i MIN()
   ne ispol'zuyut indeksy, no indeks ispol'zuetsya pri postroenii
   zaprosov s ORDER BY i LIMIT:
    SELECT col
    FROM tab
    ORDER BY col [ DESC ]
    LIMIT 1;

   Esli vam kazhetsya, chto optimizator nekorrektno vybiraet
   posledovatel'nyj perebor, ispol'zujte SET enable_seqscan TO 'off' i
   zapustite testy, chtoby uvidet', ne stalo-li skanirovanie indeksov
   bystree.
   
   Kogda ispol'zuyutsya operacii s shablonami, naprimer LIKE ili ~,
   indeksy mogut byt' ispol'zovany v sleduyuschih sluchayah:
     * Nachalo stroki poiska dolzhno sovpadat' s nachalom iskomoj stroki,
       t.e.:
          + LIKE shablony ne dolzhny nachinat'sya s %..
          + ~ shablony regulyarnyh vyrazhenij dolzhna nachinat'sya na ^.
     * Stroka poiska ne dolzhna nachinat'sya s simvola klassa, t.e.
       [a-e].
     * Poisk nezavisimyj ot registra, takoj kak ILIKE i ~* ne ispol'zuet
       indeksy. Vmesto nego, ispol'zujte indeksy vyrazhenij, kotorye
       opisyvayutsya v sekcii 4.8.
     * Vo vremya initdb dolzhna ispol'zovat'sya lokal' po umolchaniyu C,
       potomu chto ne suschestvuet vozmozhnosti uznat' sleduyuschij
       naibol'shij simvol dlya ne-C lokali. Vy mozhete dlya takih
       sluchaev sozdat' special'nyj indeks text_pattern_ops kotoryj
       rabotaet tol'ko dlya LIKE indeksirovaniya.
       
   V vypuskah do versii 8.0, indeksy chasto nel'zya bylo ispol'zovat',
   esli tipy dannyh tochno ne sovpadali s indeksnymi tipami kolonok. `Eto
   osobenno kasalos' int2, int8 i numeric indeksov kolonok.
   
    4.7) Kak posmotret' na to, kak optimizator vypolnyaet moj zapros?
    
   Smotrite stranicu rukovodstva posvyaschennuyu EXPLAIN.
   
    4.8) Kak mne vypolnit' poisk regulyarnogo vyrazheniya i poisk nezavisimyj
    ot registra bukv poisk regulyarnogo vyrazheniya? Kak mne ispol'zovat'
    indeks dlya poiska nezavisimogo ot registra bukv?
    
   Operator ~ proizvodit poisk regulyarnogo vyrazheniya, a operator ~*
   proizvodit nezavisimyj ot registra bukv poisk regulyarnogo
   vyrazheniya. Nezavisimyj ot registra variant LIKE nazyvaetsya ILIKE.
   
   Nezavisimoe ot registra sravnenie obychno vyrazhaetsya tak:
    SELECT *
    FROM tab
    WHERE lower(col) = 'abc';

   `Eta konstrukciya ne budet ispol'zovat' standartnyj indeks. Odnako,
   esli vy sozdadite indeks vyrazheniya, on budet ispol'zovan:
    CREATE INDEX tabindex ON tab (lower(col));

    4.9) Kak ya mogu opredelit', chto znachenie polya ravno NULL v kakom-libo
    zaprose?
    
   Vy prosto sravnivaete znachenie s IS NULL i IS NOT NULL.
   
    4.10) Kakovy otlichiya mezhdu raznymi simvol'nymi tipami?
    
   Tip Vnutrennee imya Zamechaniya
   VARCHAR(n) varchar razmer zadaet maksimal'nuyu dlinu, net zapolneniya
   CHAR(n) bpchar zapolnyaetsya pustotoj do fiksirovannoj dliny
   TEXT text net zadavaemogo verhnego ogranicheniya ili dliny
   BYTEA bytea massiv bajt peremennoj dliny (mozhno ispol'zovat'
   null-bajt bez opaski)
   "char" char odin simvol
   
   Vnutrennee imya vy mozhete uvidet', kogda smotrite sistemnye katalogi
   i v nekotoryh soobscheniyah ob oshibkah.
   
   Pervye chetyre tipa yavlyayutsya "varlena" tipami (t.e., pervye
   chetyre bajta na diske yavlyayutsya dlinnoj, za kotoroj sleduyut
   dannye). Takim obrazom, fakticheski ispol'zuemoe prostranstvo bol'she,
   chem oboznachennyj razmer. Odnako, `eti tipy dannyh takzhe poddayutsya
   szhatiyu ili mogut byt' sohraneny ne v strokom vide cherez TOAST, tak
   chto zanimaemoe diskovoe prostranstvo mozhet takzhe byt' i men'she,
   chem ozhidalos'.
   VARCHAR(n) - `eto luchshee reshenie, kogda nuzhno hranit' stroki
   peremennoj dliny, ne prevyshayuschie opredelennogo razmera. TEXT -
   `eto luchshee reshenie dlya strok neogranichennoj dliny, s maksimal'no
   dopustimoj dlinoj v 1 gigabajt.
   
   CHAR(n) - `eto luchshee reshenie dlya hraneniya strok, kotorye obychno
   imeyut odinakovuyu dlinu. CHAR(n) zapolnyaetsya pustotoj do zadannoj
   dliny, v to vremya kak VARCHAR(n) hranit tol'ko simvoly, iz kotoryh
   sostoit stroka. BYTEA ispol'zuetsya dlya hraneniya binarnyh dannyh,
   znacheniya kotoryh mogut vklyuchat' NULL bajty. Vse tipy opisannye
   zdes', imeyut shodnye harakteristiki proizvoditel'nosti.
   
    4.11.1) Kak mne sozdat' pole serial/s-avto-uvelicheniem?
    
   PostgreSQL podderzhivaet tip dannyh SERIAL. On avtomaticheski sozdaet
   posledovatel'nost'. Naprimer:
    CREATE TABLE person (
        id   SERIAL,
        name TEXT
    );

   avtomaticheski transliruetsya v:
    CREATE SEQUENCE person_id_seq;
    CREATE TABLE person (
        id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
        name TEXT
    );

   Smotrite podrobnosti o posledovatel'nostyah na stranice rukovodstva
   posvyaschennoj create_sequence.
   
    4.11.2) Kak mne poluchit' znachenie pri vstavke SERIAL?
    
   Odin iz sposobov sostoit v poluchenii sleduyuschego znacheniya SERIAL
   iz ob"ekta sequence s pomosch'yu funkcii nextval() pered vstavkoj i
   zatem vstavlyat' `eto znachenie yavno. Ispol'zujte tablicu-primer v
   4.11.1, primer v psevdoyazyke pokazhet kak `eto delaetsya:
    new_id = execute("SELECT nextval('person_id_seq')");
    execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");

   Zatem vy dolzhny takzhe sohranit' novoe znachenie v peremennoj new_id
   dlya ego ispol'zovaniya v drugih zaprosah (naprimer takih kak vneshnij
   klyuch dlya tablicy person). Zametim, chto imya avtomaticheski
   sozdannogo ob"ekta SEQUENCE budet <table>_<serialcolumn>_seq, gde
   table i serialcolumn yavlyayutsya sootvetstvenno imenami vashej
   tablicy i vashej kolonki SERIAL.
   
   V kachestve al'ternativy, vy mozhete poluchit' naznachennoe znachenie
   SERIAL s pomosch'yu funkcii currval() posle provedeniya obychnoj
   operacii vstavki, naprimer
    execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
    new_id = execute("SELECT currval('person_id_seq')");

    4.11.3) Ne mozhet li poluchit'sya tak, chto ispol'zovanie currval() i
    nextval() privedet k zaciklirovaniyu s drugimi pol'zovatelyami?
    
   Net. currval() vozvraschaet tekuschee znachenie, naznachennoe vashej
   sessiej, a ne drugimi sessiyami.
   
    4.11.4) Pochemu chisla iz moej posledovatel'nosti ne ispol'zuyutsya snova
    pri otmene tranzakcii? Pochemu sozdayutsya razryvy pri numeracii v kolonke,
    gde ya ispol'zuyu posledovatel'nost'/SERIAL?
    
   Dlya realizacii konkuretnosti, znacheniya posledovatel'nostej, pri
   neobhodimosti vydayutsya vo vremya zapuska tranzakcij i ne
   blokiruyutsya do polnogo vypolneniya tranzakcij. `Eto mozhet vyzyvat'
   razryvy v numeracii pri otmene tranzakcij.
   
    4.12) CHto takoe OID? CHto takoe TID?
    
   Kazhdaya, sozdavaemaya v PostgreSQL tablichnaya stroka, poluchaet
   unikal'nyj indentifikator OID za isklyucheniem sluchaya kogda
   ispol'zovalos' WITHOUT OIDS. OID - `eto avtomaticheski naznachaemoe
   unikal'noe 4-h bajtovoe celoe chislo. Odnako, posle togo kak ego
   znachenie prevysit 4 milliarda, znacheniya OID nachinayut
   dublirovat'sya. PostgreSQL ispol'zuet OID dlya svyazyvaniya svoih
   vnutrennih tablic.
   
   Dlya unikal'nyh znachenij v kolonkah tablicy pol'zovatelya, luchshim
   sposobom yavlyaetsya ispol'zovanie SERIAL vmesto OID, potomu chto
   posledovatel'nosti SERIAL unikal'ny tol'ko vnutri tablicy i takim
   obrazom men'she podverzheny perepolneniyu. Dlya hraneniya znachenij
   8-mi bajtnoj posledovatel'nosti dostupen tip SERIAL8.
   
   TID ispol'zuetsya dlya identifikacii special'nyh fizicheskih zapisej s
   blochnymi i offset znacheniyami. TID izmenyaetsya posle togo kak
   stroki v tablice byli izmeneny ili peregruzheny.
   
   TID ispol'zuetsya indeksnymi zapisyami v kachestve ukazatelya na
   fizicheskie zapisi.
   
    4.13) Pochemu ya poluchayu oshibku "ERROR: Memory exhausted in
    AllocSetAlloc()"?
    
   Predpolozhitel'no u vas zakonchilas' virtual'naya pamyat' ili chto
   vashe yadro imeet malen'kij limit na opredelennye resursy. Popytajtes'
   pered zapuskom postmaster vypolnit' sleduyuschie komandy:
    ulimit -d 262144
    limit datasize 256m

   V zavisimosti ot komandnogo interpretatora shell, tol'ko odna iz
   dannyh komand vypolnitsya uspeshno, no ona pozvolit vam ustanovit'
   bol'shij segment dannyh processa i vozmozhno reshit problemu. `Eta
   komanda izmenyaet parametry tekuschego processa i vseh ego potomkov,
   sozdannyh posle eio zapuska. Esli u vas voznikla problema s SQL
   klientom, potomu chto backend vozvraschaet slishkom bol'shoj ob"em
   dannyh, popytajtes' vypolnit' `etu komandu pered zapuskom klienta.
   
    4.14) Kak mne uznat', kakaya versiya PostgreSQL zapuschena?
    
   Iz psql, naberite SELECT version();
   
    4.15) Pochemu pri rabote s moim bol'shim ob"ektom ya poluchayu oshibku
    "invalid large obj descriptor"?
    
   Vam nuzhno pri ispol'zovanii bol'shogo ob"ekta pomestit' v nachale
   BEGIN WORK i v konce COMMIT, a vnutri poluchivshegosya bloka lo_open
   ... lo_close.
   
   V nastoyaschij moment PostgreSQL trebuet, chtoby pri zakrytii
   bol'shogo ob"ekta proishodilo vypolnenie tranzakcii. Takim obrazom,
   pervaya zhe popytka sdelat' chto-libo s bol'shim ob"ektom, ne
   soblyudaya dannogo pravila privedet k soobscheniyu invalid large obj
   descriptor, tak kak kod vypolnyayuschij rabotu nad bol'shim ob"ektom
   (po krajnej mere v nastoyaschij moment) budet generirovat' soobschenie
   ob oshibke esli vy ne ispol'zuete tranzakciyu.
   
   Esli vy ispol'zuete takoj interfejs klienta kak ODBC, vam vozmozhno
   ponadobitsya ustanovit' auto-commit off.
   
    4.16) Kak mne sozdat' kolonku kotoraya po umolchaniyu budet soderzhat'
    tekuschee vremya?
    
   Ispol'zujte CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

    4.17) Kak mne vypolnit' vneshnee svyazyvanie?
    
   PostgreSQL podderzhivaet vneshnee svyazyvanie, ispol'zuya standartnyj
   sintaksis SQL. Vot dva primera:
    SELECT *
    FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

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

   `Eto identichnye zaprosy svyazyvaniya t1.col i t2.col, takzhe
   vozvraschayut lyubye nesvyazannye stroki v t1 (kotorye ne sovpadayut s
   t2). RIGHT svyazyvanie dolzhno dobavit' nesvyazannye stroki t2. FULL
   svyazyvanie dolzhno vozvratit' sovpavshie stroki plyus vse
   nesvyazannye stroki iz t1 i t2. Slovo OUTER yavlyaetsya
   neobyazatel'nym i naznachaetsya v LEFT, RIGHT i FULL svyazyvaniyah.
   Obychnye svyazyvaniya nazyvayutsya INNER svyazyvaniya.
   
    4.18) Kak vypolnyat' zaprosy, ispol'zuyuschie neskol'ko baz dannyh?
    
   Ne suschestvuet sposoba sozdat' zapros k bazam dannyh otlichnym ot
   tekuschej. Poskol'ku PostgreSQL zagruzhaet sistemnye katalogi
   specifichnye dlya bazy dannyh, neponyatno dazhe, kak dolzhen sebya
   vesti takoj mezhbazovyj zapros.
   
   contrib/dblink pozvolyaet zaprosy mezhdu bazami, ispol'zuya vyzovy
   funkcij. Razumeetsya, klient mozhet odnovremenno takzhe ustanavlivat'
   soedieneniya s razlichnymi bazami dannyh i takih obrazom ob"edinyat'
   informaciyu iz nih.
   
    4.19) Kak mne vernut' iz funkcii neskol'ko strok tablicy?
    
   Vy mozhete legko ispol'zovat' funkcii, vozvraschayuschie spisok,
   http://techdocs.postgresql.org/guides/SetReturningFunctions.
   
    4.20) Pochemu ya ne mogu nadezhno sozdavat'/udalyat' vremennye tablicy v
    funkciyah PL/PgSQL?
    
   PL/PgSQL k`eshiruet scenarii funkcii i odin iz negativnyh `effektov
   `etogo sostoit v tom, chto esli funkciya PL/PgSQL obraschaetsya k
   vremennoj tablice i `eta tablica pozdnee udalyaetsya i peresozdaetsya,
   a funkciya zatem vyzyvaetsya snova, to ee vyzov privedet k oshibke,
   potomu chto sk`eshirovannoe soderzhimoe funkcii soderzhit ukazatel' na
   staruyu vremennuyu tablicu. CHtoby reshit' `etu problemu, ispol'zujte
   EXECUTE dlya dostupa k vremennym tablicam v PL/PgSQL. Ispol'zovanie
   `etogo operatora zastavit zapros peregenerirovat'sya kazhdyj raz.
   
    4.21) Kakie opcii shifrovaniya suschestvuyut?
    
     * contrib/pgcrypto soderzhit mnogo funkcij shifrovaniya dlya
       ispol'zovaniya v SQL zaprosah.
     * Dlya shifrovaniya peredavaemyh dannyh ot klienta k serveru, na
       servere v fajle postgresql.conf, opciya ssl dolzhna byt'
       ustanovlena v true, v fajle pg_hba.conf dolzhna byt'
       sootvetstvuyuschaya zapis' host ili hostssl i na storone klienta
       sslmode ne dolzhen byt' zapreschion cherez disable. (Zametim, chto
       takzhe vozmozhno ispol'zovanie nezavisimyh vneshnih shifruyuschih
       transportov, takih kak stunnel ili ssh, vmesto sobstvennyh SSL
       soedinenij PostgreSQL).
     * Paroli pol'zovatelej k baze dannyh avtomaticheski shifruyutsya,
       pri sohranenii v sistemnyh tablicah.
     * Server mozhno zapustit', ispol'zuya shifrovannuyu fajlovuyu
       sistemu.
     _________________________________________________________________
   
                          Rasshireniya PostgreSQL
                                      
    5.1) YA napisal funkciyu opredelyaemuyu pol'zovatelem. Kogda ya zapuskayu
    ee v psql, pochemu ya poluchayu core dump?
    
   Problema mozhet zaklyuchat'sya v neskol'kih veschah. Popytajtes'
   sperva protestirovat' vashu funkciyu v otdel'noj samostoyatel'noj
   programme.
   
    5.2) Kak ya mogu vnesti nekotorye klassnye novye tipy i funkcii v
    PostgreSQL?
    
   Otprav'te vashi rasshireniya v spisok rassylki pgsql-hackers i oni po
   vozmozhnosti budut pomescheny v podkatalog contrib/.
   
    5.3) Kak mne napisat' C funkciyu, vozvraschayuschuyu stroku tablicy?
    
   V versiyah PostgreSQL, nachinaya s 7.3, funkcii, vozvraschayuschie
   tablicy polnost'yu podderzhivayutsya v C, PL/PgSQL i SQL. Podrobnosti
   smotrite v Rukovodstve Programmista. Primer vozvraschayuschej tablicu
   funkcii, napisannoj na C, mozhno najti v contrib/tablefunc.
   
    5.4) YA izmenil ishodnyj fajl. Pochemu posle perekompilyacii ya ne vizhu
    izmenenij?
    
   Fajly Makefile ne imeyut pravil'nyh zavisimostej dlya include fajlov.
   Vy dolzhny vypolnit' make clean i zatem make. Esli vy ispol'zuete GCC
   vy mozhete ispol'zovat' opciyu --enable-depend v configure chtoby
   poruchit' kompilyatoru avtomaticheski otslezhivat' zavisimosti.
