Otvety na chasto zadavaemye voprosy po PostgreSQL Data poslednego obnovleniya: Ponedel'nik 30 maya 09:11:03 EDT 2005 Anglijskij variant soprovozhdaet: Bryus Mom'yan (Bruce Momjian) (pgman@candle.pha.pa.us) Pereviol 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? 1.13) Kto upravlyaet PostgreSQL? 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 mne opredelit', chto znachenie polya ravno NULL v kakom-libo zaprose? Mogu ya otsortirovat' polya NULL ili net? 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 CTID? 4.13) Pochemu ya poluchayu oshibku "ERROR: Memory exhausted in AllocSetAlloc()"? 4.14) Kak mne uznat', kakaya versiya PostgreSQL zapuschena? 4.15) Kak mne sozdat' kolonku kotoraya po umolchaniyu budet soderzhat' tekuschee vremya? 4.16) Kak vypolnit' vneshnee svyazyvanie? 4.17) Kak vypolnyat' zaprosy, ispol'zuyuschie neskol'ko baz dannyh? 4.18) Kak mne vernut' iz funkcii neskol'ko strok tablicy? 4.19) Pochemu ya poluchayu oshibku "relation with OID #### ne suschestvuet", kogda obraschayuts' k vremennym tablicam v funkciyah PL/PgSQL? 4.20) Kakie est' resheniya dlya replikacii? _________________________________________________________________ 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-1996 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. PostgreSQL takzhe 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? CHerez brauzer, ispol'zuya http://www.postgresql.org/ftp/ i cherez ftp, ispol'zuya ftp://ftp.PostgreSQL.org/pub/. 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.2 My planiruem vypuskat' novye starshie versii kazhdyj god, a mladshie versii kazhdye neskol'ko 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/books/awbook.html i http://www.commandprompt.com/ppbook/. Est' neskol'ko knig po PostgreSQL, kotorye mozhno kupit'. Odnu iz naibolee populyarnyh napisal Korri Duglas (Korry Douglas). Spisok obzorov po `etim knigam 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? Vo-pervyh, voz'mite odnu iz knig po PostgreSQL, o kotoryh govorilos' vyshe. 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. 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. 1.11) Kak prisoedinitsya k komande razrabotchikov? Smotrite FAQ dlya razrabotchikov. 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. Nasha proizvoditel'nosti obychno +/-10% po sravneniyu s drugimi SUBD. 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. 1.13) Kto upravlyaet PostgreSQL? Esli vy ischite kakogo-to osobennogo cheloveka, central'nyj komitet ili upravlyayuschuyu kompaniyu, to naprasno --- ih net. U nas est' yadro komiteta i razrabotchikov, rabotayuschih s CVS, no `eti gruppy sluzhat bol'she dlya administrativnyh celej, chem dlya upravleniya. Proekt napryamuyu funkcioniruet s pomosch'yu soobschestva razrabotchikov i pol'zovatelej, k kotoromu mozhet prisoedinitsya kazhdyj. Vsio chto nuzhno -- `eto podpisat'sya na spiski rassylki i uchastvovat' v diskussiyah. (Podrobnosti o tom kak vklyuchit'sya v razrabotku PostgreSQL smotrite v FAQ dlya razrabotchikov.) _________________________________________________________________ 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 DBD::Pg s CGI.pm ili mod_perl. 2.3) Est' li u PostgreSQL graficheskij interfejs pol'zovatelya? Da, podrobnosti smotrite v http://techdocs.postgresql.org/guides/GUITools. _________________________________________________________________ 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. 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.0 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. 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 zapros snova, chtoby uvidet', dejstvitel'no 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 mne opredelit', chto znachenie polya ravno NULL v kakom-libo zaprose? Mogu ya otsortirovat' polya NULL ili net? Vy prosto sravnivaete znachenie s IS NULL i IS NOT NULL, kak zdes': SELECT * FROM tab WHERE col IS NULL; CHtoby otsortirovat' dannye po znacheniyu ispol'zujte modifikatory IS NULL i IS NOT NULL v vyrazhenii ORDER BY. Kogda oni budut generirovat' znacheniya istina, to pri sortirovke oni budut vyshe, chem znacheniya lozh', tak chto zapisi s NULL budut v otsortirovannom spiske sverhu: SELECT * FROM tab ORDER BY (col 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, dlinnye znacheniya takzhe szhimayutsya, 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 __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 CTID? 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. CTID ispol'zuetsya dlya identifikacii special'nyh fizicheskih zapisej s blochnymi i offset znacheniyami. CTID 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) 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.16) 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.17) 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.18) Kak mne vernut' iz funkcii neskol'ko strok tablicy? Vy mozhete legko ispol'zovat' funkcii, vozvraschayuschie spisok, http://techdocs.postgresql.org/guides/SetReturningFunctions. 4.19) Pochemu ya poluchayu oshibku "relation with OID #### ne suschestvuet", kogda obraschayuts' k vremennym tablicam 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.20) Kakie est' resheniya dlya replikacii? Hotya "replikaciya" -- `eto edinyj termin, est' neskol'ko raznyh tehnologij dlya vypolneniya replikacij s raznymi osobennostyami dlya kazhdoj. Replikaciya Master/slave pozvolyaet imet' odin glavnyj (master) server dlya vypolneniya zaprosov chteniya/zapisi, v to vremya kak podchinionnye (slave) servera mogut proizvodit' tol'ko zaprosy chteniya/SELECT. Naibolee populyarnym resheniem dlya replikacii master-slave v PostgreSQL yavlyaetsya Slony-I. Replikaciya Multi-master pozvolyaet vypolnyat' zaprosy chteniya/zapisi na neskol'kih, repliciruemyh drug s drugom komp'yuetrah. `Eta osobennost' takzhe privodit k potere proizvoditel'nosti, potomu chto neobhodima sinhronizaciya izmenenij mezhdu neskol'kimi serverami. Naibolee populyarnym resheniem dlya takoj replikacii v PostgreSQL yavlyaetsya Pgcluster.