Revision de085820bf7f9dbff4b6c427a7a3689b7909c690 authored by Tom Lane on 14 November 2007, 03:26:24 UTC, committed by Tom Lane on 14 November 2007, 03:26:24 UTC
the division of material between here and the tsearch2 contrib page, but at least it's not obviously unfinished any more.
1 parent 42e3ab3
FAQ_turkish
PostgreSQL için Sýkça Sorulan Sorular (SSS)
Son güncelleme : 15 Kasým 2004 Pazartesi - 15:03:23
Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
Çevirenler : Devrim Gündüz (devrim@tdmsoft.com)
Nicolai Tufar (ntufar@tdmsoft.com)
Volkan YAZICI (volkany@phreaker.net)
Bu belgenin en güncel hali,
http://www.PostgreSQL.org/docs/faqs/FAQ_turkish.html ve
http://www.gunduz.org/seminer/pg/FAQ_turkish.html adreslerinde
görülebilir.
Platforma özel sorularýnýz, http://www.PostgreSQL.org/docs/index.html
adresinde yanýtlanýr.
_________________________________________________________________
Genel Sorular
1.1) PostgreSQL nedir? Nasýl okunur?
1.2) PostgreSQL'in haklarý nedir?
1.3) PostgreSQL, hangi Unix platformlarýnda çalýþýr?
1.4) Hangi Unix olmayan uyarlamalarý bulunmaktadýr?
1.5) PostgreSQL'i nereden indirebilirim?
1.6) Desteði nereden alabilirim?
1.7) En son sürümü nedir?
1.8) Hangi belgelere ulaþabilirim?
1.9) Bilinen hatalar ya da eksik özelliklere nereden ulasabilirim?
1.10) Nasýl SQL öðrenebilirim?
1.11) PostgreSQL 2000 yýlýna uyumlu mudur?
1.12) Geliþtirme takýmýna nasýl katýlabilirim??
1.13) Bir hata raporunu nasýl gönderebilirim?
1.14) PostgreSQL, diðer VTYS(DBMS) lerle nasýl karþýlaþtýrýlabilir?
1.15) PostgreSQL'e maddi açýdan nasýl destek olabilirim?
Kullanýcý/istemci Sorularý
2.1) PostgreSQL için ODBC sürücüleri var mý?
2.2) PostgreSQL'i web sayfalarýnda kullanabilmek için hangi araçlar
bulunmaktadýr?
2.3) PostgreSQL'in grafik kullanýcý arabirimi var mýdýr?
2.4) PostgreSQL ile iletiþimi kurabilmek için hangi dilleri
kullanabilirim?
Yönetimsel Sorular
3.1) PostgreSQL'i /usr/local/pgsql dizininden baþka dizinlere nasýl
kurabilirim?
3.2) Postmaster'ý baþlattýðýmda Bad System Call ya da core dumped
mesajý alýyorum. Neden?
3.3) Postmaster'ý baþlattýðýmda, IpcMemoryCreate hatasý alýyorum.
Neden?
3.4) Postmaster'ý, baþlattýðýmda, IpcSemaphoreCreate hatasý alýyorum.
Neden?
3.5) Diðer bilgisayarlarýn benim PostgreSQL veritabaný sunucuma
baðlantýlarýný nasýl kontrol edebilirim?
3.6) Veritabaný motorunu daha iyi baþarým icin nasýl ayarlayabilirim?
3.7) Hangi hata ayýklama özellikleri bulunmaktadýr?
3.8) Baðlanmaya çalýþýrken, neden "Sorry, too many clients" hatasýný
alýyorum. Neden?
3.9) pgsql_tmpdizinin içindeki dosyalar nelerdir?
3.10) PostgreSQL sürümlerini yükseltmek için neden bir dump/reload
iþlemi gerçekleþtirmek zorundayým?
3.11) Nasýl bir donaným kullanmalýyým?br>
Ýþletimsel Sorular
4.1) Binary cursor ve normal cursor arasýndaki fark nedýr?
4.2) Sorgunun sadece ilk birkaç satýrýný nasýl SELECT edebilirim?
4.3) psql'in içinde gördügüm tablolarýn ya da diðer þeylerin listesini
nasýl alabilirim?
4.4) Bir tablodan bir kolonu nasýl kaldýrabilirim?
4.5) Bir satýr, tablo ve veritabaný için en fazla büyüklük nedir?
4.6) Tipik bir metin dosyasýndaki veriyi saklamak için ne kadar disk
alaný gereklidir?
4.7) Veritabanýnda hangi tablo ya da index'lerin tanýmlandýðýný nasýl
görebilirim?
4.8) Sorgularým cok yavaþ, ya da index'lerimi kullanmýyorlar. Neden?
4.9) Query-optimizer'ýn sorgularýmý nasýl deðerlendirdiðini, iþleme
soktuðunu nasýl görebilirim?
4.10) R-tree index nedir?
4.11) Genetic Query Optimizer nedir?
4.12) Düzenli ifade (Regular Expression) aramalarýný ve büyük/küçük
harfe duyarsýz aramalarý nasýl yapabilirim? Bu büyük/küçük harfe
duyarlý aramalar için index'i nasýl kullanabilirim?
4.13) Bir sorguda, bir alanýn NULL olduðunu nasýl ortaya
çýkarabilirim?
4.14) Çesitli karakter tipleri arasýndaki farklar nelerdir?
4.15.1) Nasýl serial/otomatik artan (auto-incrementing) bir alan
yaratabilirim?
4.15.2) Serial giriþinin deðerini nasýl alabilirim?
4.15.3) currval() ve nextval() diðer kullanýcýlara sorun yaratmaz mý?
4.15.4) Neden sequence sayýlarýn transaction iþleminin iptalinden
sonra yeniden kullanýlýyor? Neden sequence/SERIAL kolonumdaki
sayýlarda atlamalar oluyor?
4.16) OID nedir? TID nedir?
4.17) PostgreSQL' de kullanýlan bazý terimlerin anlamlarý nelerdir?
4.18) Neden "ERROR: Memory exhausted in AllocSetAlloc()" hatasýný
alýyorum?
4.19) Hangi PostgreSQL sürümünü çalýstýrdýðýmý nasýl görebilirim?
4.20) Neden large-object iþlemlerim, "invalid large obj descriptor"
hatasýný veriyor?
4.21) Þu andaki zamaný öntanýmlý deðer olarak kabul eden kolonu nasýl
yaratýrým?
4.22) Neden IN kullanan subquery'lerim çok yavaþ?
4.23) Outer join iþlemini nasýl yapabilirim?
4.24) Ayný anda birden fazla veritabanýnda nasýl iþlem yapabilirim?
4.25) Bir fonksiyondan nasýl çoklu satýr ya da kolon döndürebilirim?
4.26) Neden Pl/PgSQL fonksiyonlarý içinden güvenli bir þekilde tablo
yaratma/kaldýrma iþlemlerini yapamýyoruz?
4.27) Hangi þifreleme seçenekleri bulunmaktadýr?
PostgreSQL Özelliklerini Geniþletmek
5.1) Kullanýcý-tanýmlý bir fonksiyon yazdým. psql'de çalýþtýrdýðým
zaman neden core dump ediyor?
5.2) PostgreSQL'e nasýl yeni veri tipleri/fonksiyonlar ekleyebilirim?
5.3) Bir tuple döndürmek için bir C fonksiyonunu nasýl yazarým?
5.4) Bir kaynak dosyasýnda deðiþiklik yaptým. Yeniden derlememe raðmen
deðiþiklik geçerli olmuyor. Neden?
_________________________________________________________________
Genel Sorular
1.1) PostgreSQL nedir? Nasýl okunur?
PostgreSQL, Post-Gres-Q-L. olarak okunur
PostgreSQL, yeni-nesil VTYS araþtýrma prototipi olan POSTGRES
veritabaný yönetim sisteminin geliþtirilmesidir. POSTGRES'in zengin
veri tiplerini ve güçlü veri modelini tutarken, SQL'in geliþtirilmiþ
alt kümesi olan PostQuel dilini kullanýr. PostgreSQL ücretsizdir ve
kaynak kodu açýk daðýtýlýr.
PostgreSQL, PostgreSQL geliþtirme listesine üye olan bir Internet
geliþtirici takýmý tarafýndan geliþtirilir. Þu andaki koordinatör,
Marc G. Fournier (scrappy@PostgreSQL.org). (Bu takýma nasýl
katýlacagýnýzý öðrenmek için 1.6 numaralý maddeyi okuyunuz.) Bu takým,
tüm PostgreSQL geliþiminden sorumludur.
PostgreSQL 1.01 sürümünün yazarlarý Andrew Yu ve Jolly Chen idi.
Bunlarýn dýþýnda bir kaç kisi de uyarlama, hata ayýklama ve kodun
geliþtirilmesi için çalýsmýþtý. PostgreSQL'in türediði orijinal
Postgres kodu, lisans, lisansüstü ve akademisyenler tarafýndan,
Professor Michael Stonebraker (University of California, Berkeley)
koordinatörlügünde yazýlmýþtýr.
Berkley'deki yazýlýmýn adý Postgres idi. SQL uyumluluðu 1995'te
eklenince, adý Postgres 95 oldu. 1996 yýlýnýn sonlarýnda adý
PostgreSQL olarak deðiþtirildi.
1.2) PostgreSQL'in haklarý nedir?
PostgreSQL Data Base Management System
Portions Copyright (c) 1996-2007, 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.
Üstteki metin klasik açýk-kod lisansý olan BSD lisansýdýr. Kaynak
kodun nasýl kullanýlabileceðine dair sýnýrlamalarý yoktur. Bu lisansý
seviyoruz. Deðiþtirme niyetimiz bulunmamaktadýr.
1.3) PostgreSQL, hangi Unix platforlarýnda çalýþýr?
Genel olarak, modern bir Unix-uyumlu platform PostgreSQL'i
çalýþtýracaktýr. Ayrýntýlý bilgi için kurulum belgelerine
bakabilirsiniz.
1.4) Hangi Unix olmayan uyarlamalarý bulunmaktadýr?
PostgreSQL 8.0 sürümü ile , PostgreSQL artýk Win2000, WinXP ve Win2003
gibi Microsoft Windows NT tabanlý iþletim sistemlerinde doðal olarak
çalýþmaya baþlamýþtýr. Paketlenmiþ bir kurulum programý,
http://pgfoundry.org/projects/pginstaller. adresinden indirilebilir.
Ayrýca, http://forge.novell.com adresinde Novell Netware 6 portu
bulunmaktadýr.
1.5) PostgreSQL'i nereden indirebilirim?
PostgreSQL için ana anonim ftp sitesi ftp://ftp.PostgreSQL.org/pub
adresidir. Yansýlar için, ana web sayfamýza bakabilirsiniz.
1.6) Nereden destek alabilirim?
Ana e-posta listesi : pgsql-general@PostgreSQL.org. PostgreSQL
konusundaki tartýþmalara açýktýr. Üye olmak için, aþaðýdaki satýrlarý
e-postanýzýn body kýsmýna (konu kýsmýna deðil) yazýp,
pgsql-general-request@PostgreSQL.org adresine gönderin:
subscribe
end
Ayný zamanda, bir digest listesi bulunmaktadýr. Bu listeye üye olmak
için, pgsql-general-digest-request@PostgreSQL.org adresine, body
kýsmýnda
subscribe
end
yazan bir e-posta atmanýz yeterli olacaktýr.
Digest postalar, ana liste 30k civarýnda e-postaya ulaþtýðýnda üyelere
gönderilmektedir.
Bug'lar için bir e-posta listesi bulunmaktadýr. Bu listeye üye olmak
için, pgsql-bugs-request@PostgreSQL.org adresine, body kýsmýnda
subscribe
end
yazan bir e-posta atmanýz yeterli olacaktýr.
Ayný zamanda, geliþtiriciler için tartýþma listesi bulunmaktadýr. Bu
listeye üye olmak için, pgsql-hackers-request@PostgreSQL.org adresine,
body kýsmýnda
subscribe
end
yazan bir e-posta atmanýz yeterli olacaktýr.
Bunun dýþýndaki e-posta listelerine ve PostgreSQL hakkýnda bilgiye,
PostgreSQL WWW ana sayfasýndan ulasabilirsiniz:
http://www.PostgreSQL.org
Ayný zamanda, EFNet üzerinde, #PostgreSQL adlý bir IRC kanalý
bulunmaktadýr. Bunun için, irc -c '#PostgreSQL' "$USER"
irc.phoenix.net Unix komutunu kullanabilirsiniz.
Ticari destek veren firmalarýn listesine
http://www.postgresql.org/users-lounge/commercial-support.html
adresinden ulaþbilirsiniz.
1.7) En son sürüm nedir?
PostgreSQL'in son sürümü 7.4.6'dýr.
Her 6-8 ayda ana sürüm çýkarýlmasý planlanmaktadýr.
1.8) Hangi belgelere ulaþabilirim?
Daðýtýmýn içinde, kitapçýklar, kitapçýk sayfalarý ve bazý küçük
örnekler verilmektedir. /doc dizinine bakýnýz. Ayrýca, bu el
kitapçýklarýný online olarak http://www.PostgreSQL.org/docs/
adresinden inceleyebilirsiniz.
http://www.PostgreSQL.org/docs/awbook.html ve
http://www.commandprompt.com/ppbook adreslerinde PostgreSQL kitaplarý
bulunmaktadýr. PostgreSQL kitablarýnýn listesine,
http://www.ca.PostgreSQL.org/books/ adresinden ulaþaiblirsiniz.
Ayrýca, PostgreSQL konusundaki teknik makalelere de
http://techdocs.PostgreSQL.org/ adresinden ulaþabilirsiniz.
psql'in, \d ile baslayan veri tipler, operatorler, fonksiyonlar,
aggregate'ler, vb. ile ilgili güzel komutlarý vardýr.
Web sitemiz daha fazla belgeyi içermektedir.
1.9) Bilinen hatalar ya da eksik özelliklere nereden ulaþabilirim?
PostgreSQL SQL-92 uyumluluðu içindedir, standartlardan fazla da
özellikleri bulunmaktadýr. Bilinen hatalar, eksik özellikler ve
gelecek ile ilgili planlar için TODO listesine bakýnýz.
1.10) Nasýl SQL öðrenebilirim?
http:/www.PostgreSQL.org/docs/awbook.html adresindeki kitap SQL
ögretecektir. http://www.commandprompt.com/ppbook adresinde de bir
baska PostgreSQL kitabý bulunmaktadýr.
http://www.intermedia.net/support/sql/sqltut.shtm,
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM
http://sqlcourse.com ve http://sqlcourse2.com adreslerinde de güzel
belgeler bulunmaktadýr.
Bir baþkasý da, http://members.tripod.com/er4ebus/sql/index.htm
adresinde bulunan "Teach Yourself SQL in 21 Days, Second Edition"
kitabýdýr.
Bazý kullanýcýlarýmýz da þu kitabý önermektedirler: "The Practical SQL
Handbook, Bowman, Judith S., et al.,Addison-Wesley". Bazýlarý ise "The
Complete Reference SQL, Groff et al., McGraw-Hill" kitabýný
önermektedirler.
1.11) PostgreSQL 2000 yýlýna uyumlu mudur?
Evet.
1.12) Geliþtirme takýmýna nasýl katýlabilirim?
Öncelikle, en son kaynak kodunu indirin ve web sitemizdeki ya da
daðýtýmýn içindeki PostgreSQL Developer belgesini okuyun. Ardýndan,
pgsql-hackers ve pgsql-patches listelerine üye olun. Üçüncü olarak da,
pgsql-pacthes listesine yüksek kalitede yamalar gönderin.
PostgreSQL CVS arþivine eriþim izni olan, 10 kadar geliþtirici
bulunmaktadýr. Hepsi defalarca, diðer kiþilerin yaptýðýndan çok daha
yüksek-kaliteli yamalar göndermiþlerdir. Ayrýca biz de bu
geliþtiricilerin ekledikleri yamalarýn yüksek kalitede olduðuna
güveniyoruz.
1.13) Bir hata raporunu nasýl gönderebilirim?
PostgreSQL BugTool sayfasýna gidiniz. O sayfada bir bug bildirmek için
neleri yapmanýz gerektiði anlatýlmýþtýr.
Ayrýca, ftp://ftp.PostgreSQL.org/pub ftp adresimizde, yeni bir
PostgreSQL sürümü ya da yamasý olup olmadýðýni kontrol ediniz.
1.14) PostgreSQL, diger DBMS'lerle nasýl karþýlastýrýlabilir?
Bir yazýlýmýn gücünü ölçmek için çeþitli yollar vardýr: Yazýlýmýn
özellikleri, baþarýmý, güvenilirliði, desteði ve ücreti.
Özellikler:
PostgreSQL mevcut büyük ticari veritabanlarýnýn, transaction,
subselect, trigger, view, foreign key referential integrity ve
sophisticated locking gibi (user-defined types), rules, inheritance ve
lock cakýþmalarýný düþürmek için multi-version uyumluluk özellikleri
bulunmaktadýr.
Performans (Baþarým):
PostgreSQL, diðer ticari ve açýk kaynak kodlu veritabanlarýyla yakýn
baþarýmý saðlar. Bazý açýlardan daha hýzlýdýr, diðer açýlardan da
yavaþtýr. MySQL ya da daha zayýf veritabanlarý ile
karþýlaþtýrýldýðýnda, INSERT/UPDATE iþlemlerinde, transaction bazlý
çalýstýðýmýz için daha yavaþýz. MySQL, yukarýdaki "özellikler"
kýsmýnda belirtilenlerden hiç birine sahip deðildir. Biz, baþarýmýmýzý
her sürümde arttýrsak da, esneklik ve geliþmiþ özellikler için
yapýlanmýþ durumdayýz. PostgreSQL'i MySQL ile karþýlaþtýran þu web
sitesine bakabilirsiniz: http://openacs.org/why-not-mysql.html
Güvenilirlik:
DBMS'lerin güvenilir olmasý gerketiði, yoksa deðerleri olmayacaðýný
düþünüyoruz. Çok iyi test edilmiþ, dengeli çalýsan minimum sayýda hata
içeren kod sunmaya çalýþýyoruz. Her bir sürüm en az 1 aylýk beta
testlerinden geçirilmektedir. Sürüm geçmiþine bakarsanýz, üretime
hazýr, dengeli ve kararlý kodlar sunduðumuzu görebilirsiniz. Bu
alanda, diðer veritabaný yazýlýmlarýna üstünlüðümüz olduðuna
inanmaktayýz.
Destek:
E-posta listemiz, oluþan herhangi bir sorunu çözebilecek büyük sayýda
kullanýcý ve geliþtirici grubunu içerir. Sorununuz için, en az bir
ticari veritabaný kadar rahat çözüm bulabilirsiniz. Gelistiricilere,
kullanýcý grubuna, belgelere ve kaynak koda direk olarak eriþebilme,
PostgreSQL desteðini, diðer DBMS'lere göre daha önemli kýlar.
Gereksinimi olanlara, ticari destek verilebilir. (Destek için 1.6
bölümüne bakýnýz.)
Fiyat:
Ticari ve ticari olmayan tüm kullanýmlarýnýz için PostgreSQL
ücretsizdir. Kodumuzu, yukarýda belirtilen BSD-stili lisanstaki
sýnýrlamalar hariç, ürününüzün içine ekleyebilirsiniz.
1.15) PostgreSQL'e maddi açýdan nasýl destek olabilirim?
PostgreSQL, 1996 yýlýndan beri 1. sýnýf altyapýya sahiptir. Bunun
için, yýllar boyu çalýþýp bu altyapýyý oluþturup yöneten Marc
Fournier'e teþekkürler.
Bir açýk kaynak kodlu proje için, kaliteli altyapý çok önemlidir. Bu
altyapý, projenin kesilmesini önler ve projenin ilerlemesini
hýzlandýrýr.
Tabii ki bu altyapý ucuz deðildir. Ýþlerin yürümesi için çeþitli yýlýk
ve anlýk harcamalarýmýz olmaktadýr. Eðer siz ya da þirketinizin bu
çabamýza baðýþta bulunabilecek parasý varsa, lütfen
http://store.pgsql.com/ adresine gidiniz ve baðýþta, hibede bulununuz.
Web sayfasýnýn 'PostgreSQL Inc.' den bahsetmesine raðmen, "katkýda
bulunanlar" (contributors) maddesi sadece PostgreSQL projesini
desteklemek içindir ve belirli bir þirketin para kaynaðý deðildir.
isterseniz, baðlantý adresine bir çek gönderebilirsiniz.
_________________________________________________________________
Kullanýcý/Ýstemci Sorularý
2.1) PostgreSQL icin ODBC sürücüleri var mý?
iki tane ODBC sürücüsü bulunmaktadýr: PsqlODBC ve OpenLink ODBC.
PsqlODBC'i
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php
adresinden indirebilirsiniz.
OpenLink ODBC http://www.openlinksw.com adresinden alýnabilir.Bu
sürücü, kendi standart ODBC istemci yazýlýmý ile çalýstýðýndan,
destekledikleri her platformda (Win, Mac, Unix, VMS) PostgreSQL ODBC
bulunmalidir.
Ücretsiz sürümü olmakla beraber, ticari kalitede destek almak
isteyenlere satmak isteyeceklerdir. Sorularýnýzý lütfen
postgres95@openlink.co.uk adresine gönderiniz.
2.2) PostgreSQL'i web sayfalarýnda kullanabilmek için hangi araçlar
bulunmaktadýr?
http://www.webreview.com/ adresinde, arka planda veritabaný çalýstýran
Web sayfalarý için giriþ seviyesinde bilgi bulunmaktadýr.
Web ile bütünleþme için, PHP () mükemmel bir arabirim sunar.
Karmaþýk sorunlar için, çoðu kisi Perl arabirimini ve CGI.pm ya da
mod_perl kullanýr.
2.3) PostgreSQL'in grafik kullanýcý arabirimi var mýdýr?
Çeþitli grafik arabirimlerimiz bulunmaktadýr. Bunlarýn arasýnda,
PgAccess (http://www.pgaccess.org/), PgAdmin II
(http://www.pgadmin.org/, sadece Win32 için), RHDB Admin
(http://sources.redhat.com/rhdb/) ve Rekall
(http://www.thekompany.com/products/rekall/) bulunmaktadýr. Ayrýca,
PostgreSQL için web tabanlý bir arabirim olan PHPPgAdmin
(http://phppgadmin.sourceforge.net/) bulunmaktadýr.
Daha ayrýntýlý liste için
http://techdocs.postgresql.org/guides/GUITools adresine
bakabilirsiniz.
2.4) PostgreSQL ile iletiþimi kurabilmek için hangi dilleri kullanabilirim?
* C (libpq)
* Embedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Diðerleri için, http://gborg.postgresql.org adresindeki
Drivers/Interfaces bölümüne bakabilirsiniz.
_________________________________________________________________
Yönetimsel Sorular
3.1) PostgreSQL'i, /usr/local/pgsql dizininden baþka dizinlere nasýl
kurabilirim?
configure betiðini çalýstýrýrken, --prefix seçeneðini veriniz.
3.2) postmaster'i baslattýgýmda, a Bad System Call ya da core dumped mesajý
alýyorum. Neden?
Bunun birçok nedeni olabilir. Ancak ilk kontrol edilmesi gereken sey,
çekirdeginize System V uzantýlarýnýn kurulu olup olmadýgýný kontrol
etmek olabilir. PostgreSQL shared memory ve semaphores için çekirdek
destegine gereksinim duyar.
3.3) postmaster'i baþlattýðýmda, ýpcMemoryCreate hatasý alýyorum. Neden?
Ya çekirdeðinizde shared memory desteðiniz düzgünce
yapýlandýrýlmamýþtýr, ya da çekirdeðinizdeki mevcut shared memory
miktarýný büyütmeniz gerekecektir. Gereksinim duyacaðýnýz miktar,
mimarinize ve postmaster için ayarladýgýnýz tampon ile backend iþlemi
sayýsýna baðlýdýr. Tüm sistemler için, tamponlar ve iþlemlerde
öntanýmlý sayýlarla, ~ 1MB kadar yere gereksinmeniz olacaktýr.
PostgreSQL 7.3.2 Sistem Yöneticileri Rehberi'ne, shared memory ve
semaphorelar hakkýndaki ayrýntýlý bilgi için bakabilirsiniz.
3.4) postmaster'ý baþlattýðýmda, ýpcSemaphoreCreate hatasý alýyorum. Neden?
Eðer hata, "ýpcSemaphoreCreate: semget failed (No space left on
device)" ise, çekirdeðiniz yeterli semaphore ile yapýlandýrýlmamýþ
demektir. Postgres, her bir potansiyel backend için bir semaphore
gereksinimi duyar. Geçici bir çözüm, postmasterý backend iþlemleri
için daha az miktarda sýnýrla baþlatmak olabilir. -N'i varsayýlan
deðer olan 32'den küçük bir deðerle baþlatýnýz. Daha kalýcý bir çözüm,
çekirdeðinizin SEMMNS ve SEMMNI parametrelerini yükseltmek olacaktýr.
Çalýþmayan semaphore'lar aðýr veritabaný iþlemlerinde çökme
yaratabilirler.
Eðer hata mesajýnýz baþka bir þey ise, çekirdeðinizde semaphore
desteðini yapýlandýrmamýþ olabilirsiniz. Shared memory ve
semaphore'lar hakkýndaki daha ayrýntýlý bilgi için PostgreSQL 7.3.2
Sistem Yöneticileri Rehberi'ne bakabilirsiniz.
3.5) Diger bilgisayarlarýn benim PostgreSQL veritabaný sunucuma
baðlantýlarýný nasýl kontrol edebilirim?
Ön tanýmlý olarak, PostgreSQL sadece yerel makineden Unix domain
sockets kullanarak baðlanýlmasýna izin verir. Diger makineler,
postmaster'a -i etiketini geçirmezseniz ve $PGDATA/pg_hba.conf
dosyasýný düzenleyerek host-based authentication'a olanak vermezseniz,
baðlantý yapamayacaklardýr.
3.6) Veritabani motorunu daha iyi baþarým için nasýl ayarlayabilirim?
Index'ler sorgularý hýzlandýrabilir. EXPLAIN komutu, PostgreSQL'in
sorgunuzu nasýl yorumladýðýný ve hangi index'leri kullandýðýný
görmenize izin verir.
Eðer cok fazla INSERT iþlemi yapýyorsanýz, bunlarý büyük bir toplu
iþlem dosyasýkullanýp COPY komutu ile veritabanýna girmeyi deneyiniz.
Bu, tekil INSERT'lerden daha hýzlýdýr. Ýkinci olarak, BEGIN
WORK/COMMIT transaction bloðu içinde olmayan ifadeler kendi
transaction'larýndaymýþ gibi düþünülür. Çoklu ifadeleri tek bir
transaction bloðu içinde yapabilirsiniz. Bu, transaction overhead'ini
düþürecektir. Tek bir transaction bloðu içinde birden çok ifadeyi
çalýþtýrmayý deneyebilirsiniz. Bu da ayný þekilde, transaction
overhead'ini düþürür.
Çeþitli ayarlama seçenekleri mevcuttur. fsync() iþlemini, postmaster'ý
-o -F seçeneði ile baþlatarak devre dýþý býrakabilirsiniz. Bu iþlem,
fsync()'lerin her transactiondan sonra diski flush etmesini
engelleyecektir.
Ayný zamanda, postmaster'i -B seçeneði ile baþlatýp, backend iþlemleri
tarafýndan kullanýlan shared memory buffers sayýlarýný
arttýrabilirsiniz. Eðer bu parametreyi çok yüksek tutarsanýz,
çekirdeðinizin shared memory bölgesindeki limiti aþma olasýlýðýnýz
yüzünden postmaster baþlayamayabilir. Her bir tampon (buffer) 8K'dýr.
Öntanýmlý sayý ise 64 tampondur.
Ayný þekilde, backend'in -S seçeneðini geçici sýralamalar için backend
süreçleri tarafýndan kullanýlacak hafýzayý arttýrmak amacýyla
kullanabilirsiniz. -S seçeneði kilobayt cinsinden deðer alýr ve ön
tanýmlý deðeri 512'dir (512 K)
Tablolardaki veriyi bir index'e eþlemek amacýyla gruplama için CLUSTER
komutunu kullanabilirsiniz. Ayrýntýlý bilgi için CLUSTER komutunun
yardým sayfasýna bakabilirsiniz.
3.7) Hangi hata ayýklama özellikleri bulunmaktadýr?
PostgreSQL, hata ayýklama amacýyla kullanýlabilecek durum bilgisi
rapor eden çeþitli özeliklere sahiptir.
Öncelikle, configure betiðini --enable-cassert seçeneðiyle
çalýþtýrýrsanýz, bir çok assert() backend calýþmasýný gözlemler ve
beklenmeyen bir durumda programý durdurur.
Postmaster ve postgres çeþitli hata ayýklama seçeneklerine sahiptir.
Öncelikle, postmaster'ý baþlattýðýnýzda, standart çýktýyý ve hatalarý
bir log dosyasýna yönlendirdiðinize emin olun:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
Bu iþlem PostgreSQL ana dizinine server.log dosyasý yerleþtirecektir.
Bu dosya sunucunun yaþadýðý sorunlar ya da hatalar hakkýnda yararlý
bilgiler içerir. -d seçeneði, hata ayýklama seviyesini belirten bir
rakam ile kullanýlýr. Yüksek hata ayýklama seviyelerinin büyük log
dosyalarý oluþturacaðýný unutmayýnýz.
Eðer postmaster çalýþmýyorsa, postgres backend'ini komut satýrýndan
çalýþtýrabilir ve SQL ifadenizi direk olarak yazabilirsiniz. Bu sadece
hata ayýklama amacýyla önerilir. Burada, noktalý virgülün deðil de
yeni bir satýrýn sorguyu sonlandýrdýðýný unutmayýnýz. Eðer hata
ayýklama sembolleri ile derlediyseniz, ne olduðunu görmek için bir
hata ayýklayýcý kullanabilirsiniz. backend postmaster'dan
baþlatýlmadýðýndan, eþdeðer bir ortamda çalýþmamaktadýr ve
locking/backend etkileþim sorunlarý artabilir.
Eðer postmaster çalýþýyorsa, bir pencerede psql'i çalýþtýrýn ve psql
tarafýndan kullanýlan postgres sürecinin süreç numarasýný (PID) bulun.
Postgres süreci ile iliþkilendirmek için bir hata ayýklarýcý kullanýn.
Sorgularý psql aracýlýðý ile çalýþtýrabilirsiniz. Eðer postgres
baþlangýcýnda hata ayýklamak istiyorsanýz, PGOPTIONS="-W n" seçeneðini
ayarlayabilir ve psql'i baþlatabilirsiniz. Bu iþlem, baþlangýcýn n
saniye kadar gecikmesini saðlayacaktýr; böylece hata ayýklayýcýyý
sürece iliþkilendirdikten sonra baþlangýç sürecinin devam etmesini
saðlayabilirsiniz.
postgres programý hata ayýklama ve baþarým ölçümleri için -s, -A ve -t
seçeneklerine sahiptir.
3.8) Baðlanmaya çalýþýrken, neden "Sorry, too many clients" hatasýný
alýyorum?
Postmaster'ýn eþzamanlý olarak baþlatabileceði backend süreçleri
sýnýrlarýný arttýrmanýz gerekmektedir.
Ön tanýmlý deðer 32 süreçtir. Bunu, postmaster'ý uygun -N deðeri ile
ya da postgresql.conf dosyasýný düzenleyerek yeniden baþlatmakla
arttýrabilirsiniz.
Eðer -N deðerini 32'den büyük yapacaksanýz, ayný zamanda -B deðerini
de deðiþtirmeniz gerektiðini unutmayýn. -B, -N'nin en az 2 katý kadar
olmalýdýr; daha iyi baþarým için bu sayýyý daha da arttýrmalýsýnýz.
Yüksek sayýdaki backend süreçleri için, çeþitli çekirdek yapýlandýrma
parametrelerini arttýrmanýz gerekecektir. Yapýlmasý gerekenler,
SHMMAX, SEMMNS, SEMMNI, NPROC, MAXUPRC ve açýlabilecek dosyalarýn
maksimum sayýsý olan NFILE ve NINODE deðerlerini karýþtýrmaktýr. Bunun
nedeni, PostgreSQL'in izin verilen backend süreçlerinin sayýsý
üzerinde bir sýnýrý olmasýdýr. Böylelikle sistem kaynaklarýnýn dýþýna
çýkýlmayacaktýr.
PostgreSQL'in 6.5 sürümüne kadar, en fazla backend sayýsý 64 idi ve
bunu deðiþtirmek için include/storage/sinvaladt.h dosyasý içindeki
MaxBAckendid sabitini deðiþtirdek sonra yazýlýmý yeniden derlemek
gerekiyordu.
3.9) pgsql_tmp dizinin içindeki dosyalar nelerdir?
Sorgu çalýstýrýcý (query executer) tarafýndan yaratýlan geçici
dosyalardýr. Örnegin, bir sýralama ORDER BY ile yapýlacaksa ve
sýralama backend'in -s parametresinin izin verdiðinden daha fazla
alana gereksinim duyuyorsa, ekstra veriyi tutmak için geçici dosyalar
yaratýlýr.
Geçici dosyalar, eðer sýralama sýrasýnda backend göçmezse otomatik
olarak silinecektir. Eðer çalýþan durumda bir backend'iniz yoksa,
pg_tempNNN.NN dosyalarýný silmeniz güvenlidir.
3.10) PostgreSQL sürümlerini yükseltmek için neden bir dump/reload iþlemi
gerçekleþtirmek zorundayým?
PostgreSQL takýmý ara sürümlerde sadece küçük deðiþiklikler
yapmaktadýr; bu yüzden 7.2 sürümünden 7.2.1'e yükseltmek dump/restore
iþlemi gerekmemektedir. Ancak, esas sürümlerde (örnek: 7.2'den 7.3'e)
çoðunlukla sistem tablolarýnýn ve veri dosyalarýnýn iç yapýsý
deðiþtirilir. Bu deðiþiklikler çoðunlukla karmaþýktýr; dolayýsýyla
veri dosyalarýnýn geriye dönük uyumluluðu iþlemlerini yapmýyoruz. Dump
iþlemi, veriyi genel biçimde alacaðýndan yeniden yükleme esnasýnda
veri, yeni iç biçime uygun þekilde yerleþtirilecektir.
Disk biçiminin deðiþmediði sürümlerde, pg_upgrade betiði güncellemenin
bir dump/restore gerektirmeden yapýlmasýný saðlayacaktýr. pg_upgrade
betiðinin o sürüm için bulunup bulunmadýðýný sürüm notlarý içinde
bulabilirsiniz.
3.11) Nasýl bir donaným kullanmalýyým?
PC donanýmý tamamen uyumlu olduðu için, insanlar tüm PC donanýmlarýnýn
ayný kalitede olduðunu düþünürler. Oysa böyle deðildir. ECC RAM, SCSI
ve kaliteli anakartlar daha ucuz donanýmlara göre daha çok
güvenilirlerdir ve baþarýmlarý daha yüksektir. PostgreSQL hemen hemen
tüm donanýmda çalýþabilmektedir, ancak güvenilirlik ve baþarým önemli
ise donaným seçeneklerini çok iyi araþtýrmak gereklidir. E-posta
listelerimi donanýmlarla ilgili sorular ve de ticaret için
kullanýlabilir.
_________________________________________________________________
Ýþletimsel Sorular
4.1) Binary cursor ve normal cursor arasýndaki fark nedir?
DECLARE yardým sayfasýna bakýnýz.
4.2) Sorgunun sadece ilk birkaç satýrýný nasýl SELECT edebilirim?
FETCH yardým sayfasýna bakýnýz, ya da SELECT ... LIMIT ... kullanýnýz.
Ýlk birkaç satýrý almak isteseniz bile, tüm sorgu deðerlendirilmek
durumunda kalýnabilir. ORDER BY içeren bir sorgu düþünün. Eðer ORDER
BY iþe eþleþen bir index varsa, PostgreSQL istenen ilk birkaç satýrý
iþleyebilir, ya da tüm sorgu istenen satýrlar üretilene kadar
iþlenebilir.
4.3) psql'in içinde gördügüm tablolarýn ya da diðer þeylerin listesini
nasýl alabilirim?
pgsql/src/bin/psql/describe.c içindeki psql kaynak kodunu
okuyabilirsiniz. Bu kod, psql'in \ ile baþlayan komutlarýnýn çýktýsýný
olusturan SQL komutlarýný içerir. Ayný zamanda, psql'i -E seçeneði ile
baþlatýp, verdiðiniz komutlarý çalýþtýrmak için yaptýðý sorgularýn
çýktýlarýný görebilirsiniz.
4.4) Bir tablodan bir kolonu nasýl kaldýrabilirim?
Bu özellik (ALTER TABLE DROP COLUMN) 7.3 sürümü ile gelmiþtir. Eski
sürümlerde aþaðýdakileri uygulamalýsýnýz:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- select all columns but the one you want to remove
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
4.5) Bir satýr, tablo ve veritabaný için en fazla büyüklük nedir?
Sýnýrlar:
Veritabaný için en fazla büyüklük nedir?
Sýnýrsýz (32 TB'lýk veritabaný bulunmaktadýr)
Bir tablo için en fazla büyüklük nedir?
32 TB
Bir satýr için en fazla büyüklük nedir?
1.6 TB
Bir alan için en fazla büyüklük nedir?
1 GB
Tabloda en fazla satýr sayýsý kaçtýr?
Sýnýrsýz
Bir tabloda olabilecek en fazla kolon sayýsý kaçtýr?
Kolon tiplerine baðlý olarak 250-1600
Bir tabloda olabilecek en fazla index sayýsý kaçtýr?
Sýnýrsýz
Tabii ki bunlar aslýnda sýnýrsýz degildir. Burada belirtilen sýnýrlar,
fiziksel sýnýrlarýn haricindeki sýnýrlardýr. Boþ disk alaný,
hafýza/takas alaný na baðlý sýnýrlamalar vardýr. Baþarým, sýnýr
deðerlere yaklaþtýkça, ya da deðerler çok büyük olduðunda düþebilir.
Bir tablo için büyüklük sýnýrý olan 32 TB, iþletim sisteminin büyük
dosya desteði olup olmamasýndan baðýmsýzdýr. Büyük tablolar, 1 GB'lik
dosyalarda saklandýðý için, dosya sistemi sýnýrlarýnin bir önemi
yoktur.
Tablo ve kolon sayýsý büyüklükleri, ön tanýmlý blok büyüklüðü 32k ya
çýkarýlarak arttýrýlabilir.
4.6) Tipik bir metin dosyasýndaki veriyi saklamak için ne kadar disk alaný
gereklidir?
Bir PostgreSQL veritabaný, veriyi "flat" metin dosyasýnda saklamak
için gereken alanýn 5 kat fazla disk alanýna gereksinim duyabilir.
Her satýrýnda bir tamsayý ve metin (text) içeren, 100.000 satýrlýk bir
dosya düþünün. Her satýrýn ortalama 20 byte olduðunu farzedelim. Metin
dosyasý 2.8 MB olacaktýr. Bu veriyi tutan PostgreSQL veritabaný
yaklaþýk 6.4 MB yer kaplayacaktýr.
36 byte: Her bir satýr baþlýðý (yaklaþýk)
+ 24 byte: Bir tamsayý (int) alaný ve bir metin (text) alaný
+ 4 byte: Sayfada tuple a pointer
----------------------------------------
64 byte -> kayýt baþýna
PostgreSQL'de veri sayfasý (data page) büyüklüðü 8192 byte (8k)dýr,
dolayýsýyla:
8192 byte -> page baþýna
------------------------- = Her bir veritabaný page'ý baþýna 128 satýr (yaklaþýk)
Satýr baþýna 64 byte
100000 veri satýrý
-------------------- = 782 veritabaný sayfasý
128 satýr
782 veritabaný sayfasý * sayfa baþýna 8192 byte = 6,406,144 bytes (6.4
MB)
Index'ler çok fazla yere gereksinim duymazlar, ama index'lenmiþ veriyi
tutacaklarýndan büyük olabilirler.
NULL deðerler bitmapler içinde tutulur; dolayýsýyla çok az yer
kaplarlar.
4.7) Veritabanýnda hangi tablo ya da index'lerin tanýmlandýðýný nasýl
görebilirim?
psql, bu tür bilgileri göstermek için, \ ile baþlayan bir çok komut
sunmaktadýr. \? komutu ile bu komutlarý görebilirsiniz. Ayrýca,
bunlarý açýklayan ve pg_ ile baþlayan çok sayýda sistem tablosu
bulunmaktadýr. Ayný zamanda, psql -l ile tüm veritabanlarýný
listeyelebirsiniz.
Ayrýca, pgsql/src/tutorial/syscat.source kodunu inceleyebilirsiniz. Bu
dosya, veritabaný sistem dosyalarýndan bilgiyi almak için gereksinim
duyulan bir çok SELECT'leri gösterir.
4.8) Sorgularým cok yavaþ, ya da index'lerimi kullanmýyorlar. Neden?
Indexler her sorgu tarafýndan otomatik olarak kullanýlmazlar. Indexler
eðer bir tablonun büyüklüðü minimum bir büyüklükten fazla ise ve sorgu
tablodaki satýrlarýn sadece küçük bir yüzdesini seçiyorsa kullanýlýr.
Bunun nedeni, index eriþiminin neden olduðu raslansal disk eriþimi nin
diskin ya da tablonun sýralý okunmasýndan daha yavas olabilmesidir.
Bir index'in kullanýlýp kullanýlmayacaðýný belirlemek için, PostgreSQL
tablo hakkýndaki istatistiklere gereksinmesi vardýr. Bu istatistikler,
VACUUM ANALYZE kullanýlarak toplanýrlar. Optimizer, istatistikleri
kullanarak, tabloda kaç satýr olduðunu ve bilir ve indexin kullanýlýp
kullanýlmayacaðýna daha iyi karar verir. Istatistikler, ayný zamanda
en uygun join sýrasýný ve yöntemini belirlemekte çok önemlidir.
Ýstatistik toplanmasý, tablo içerikleri deðiþtikçe periyodik olarak
yapýlmalýdýr.
Indexler normalde ORDER BY sorgularý ya da join iþlemlerini
gerçekleþtirmek için kullanýlmazlar. Açýk bir sýralamayý takip eden
sýralý bir arama (sequential scan), büyük bir tabloda index aramasý
yapmaktan genelde daha hýzlýdýr.
Ancak, ORDER BY ile birleþmiþ LIMIT genellikle bir index
kullanacaktýr; çünkü tablonun sadece belirli bir miktarý
döndürülecektir. Aslýnda, MAX() ve MIN() fonksiyonlarýnýn index
kullanmamalarýndan dolayý, bu gibi deðerleri ORDER BY ve LIMIT
kullanarak da almak olasýdýr:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Eðer optimizer'ýn sýralý arama yapmasýnýn yanlýþ olduðuna
inanýyorsanýz, SET enable_seqscan TO 'off' kullanýn ve index kullanan
aramalarýn hala daha hýzlý olup olmadýðýný görün.
LIKE ya da ~ gibi operatörler kullanýyorsanýz, index'ler sadece
aþaðýdaki koþullarda kullanýlabilir:
* Arama dizininin baþý, dizinin baþý ile baðlanmalýdýr. Yani,
+ LIKE sorgularý % ile baþlamamalýdýr.
+ Düzenli ifade sorgularý ^ iþe baþlamamalýdýr.
* Arama metni bir karakter sýnýfý ile baþlayamaz. Örnek: [a-e]
* ILIKE ve ~* gibi büyük/küçük harfe duyarsýz aramalar index'lerden
yararlanmazlar. Onun yerine, bölüm 4.12'de anlatýlan fonksiyonel
index'leri kullanabilirsiniz.
* initdb sýrasýnda öntanýmlý C locale'i kullanýlmalýdýr.
4.9) query-optimizer'ýn sorgularýmý nasýl deðerlendirdiðini, iþleme
soktuðunu nasýl görebilirim?
EXPLAIN yardým sayfasýna bakýnýz.
4.10) R-tree index nedir?
R-tree index, uzaysal (spatial) verileri indexlemek için kullanýlýr.
Bir hash index, dizi aramalarýnda (range search) kullanýlamaz. B-tree
index dizi aramalarýnda sadece tek boyutlu çalýþmaktadýr. R-tree, çok
boyutlu veriyi destekler. Örneðin, eðer bir R-tree index point veri
tipi üzerinde inþa edililebilirse, sistem "select all points within a
bounding rectangle" gibi sorgulara daha verimli yanýtlar verecektir.
Orijinal R-tree tasarýmýný açýklayan belge:
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of
Data, 45-57.
Bu belgeyi, Stonebraker'ýn "Readings in Database Systems" kitabýnda
bulabilirsiniz.
Gömülü R-tree indexleri poligon ve boxlarý kullanabilir. Teorik
olarak, R-tree indexlerin özelliklerini geniþletmek bir miktar çaba
gerektirir ve bunun nasýl yapýlacaðýna dair bir belgemiz henüz
bulunmamaktadýr.
4.11) Genetic Query Optimizer nedir?
GEQO modülü, Genetic Algorithm(GA) kullanýlarak tablolar
birleþtirildiðinde sorgu optimizasyonunu hýzlandýrýr.
4.12) Düzenli ifade (Regular Expression) aramalarýný ve büyük/küçük harfe
duyarsýz aramalarý nasýl yapabilirim? Bu büyük(küçük harfe duyarlý aramalar
için index'i nasýl kullanabilirim?
~ operatörü düzenli ifade eþleþmesi ve ~* büyük/küçük harfe duyarsýz
düzenli ifade eþleþmesi yapar. Büyük/küçük harfe duyarlý olan LIKE'ýn
büyük/küçük harfe duyarsýz olan biçimi ILIKE'týr ve PostgreSQL 7.1
sürümü ile birlikte gelmiþtir.
Büyük-küçük harfe duyarsýz eþitlik karþýlaþtýrmalarý aþaðýdaki gibi
ifade edilir:
SELECT *
FROM tab
WHERE lower(col) = 'abc'
Bu standart bir index yaratmayacaktýr. Ancak eðer fonksiyonel bir
index yaratýrsanýz; o kullanýlacaktýr:
CREATE INDEX tabindex on tab (lower(col));
4.13) Bir sorguda, bir alanin "NULL" olduðunu nasýl ortaya çýkarabilirim?
Kolonu, IS NULL ve IS NOT NULL ile test edebilirsiniz.
4.14) Çesitli karakter tipleri arasýndaki farklar nelerdir?
Veri Tipi Ýç Adý Not
--------------------------------------------------
VARCHAR(n) varchar boyut en büyük uzunluðu verir; sadece verilen kadar veri tutulur.
CHAR(n) bpchar belirtilen uzunluða kadar sonuna boþluk eklenir.
TEXT text uzunlukta herhangi bir üst sýnýr yoktur.
BYTEA bytea variable-length byte array (null-byte safe)
"char" char bir karakter
Ýç adlarý (internal name) sistem kataloglarýný ve bazý hata
mesajlarýný incelerken göreceksiniz.
Ýlk dört veri tipi "varlena" tipidir (yani, diskteki ilk 4 bayt
uzunluktur; devamý da veridir.) Dolayýsýyla, kullanýlan gerçek alan,
belirtilen alandan biraz daha büyüktür. Ancak, bu veri tipleri,
sýkýþtýrýlmaya tabi tutulabilir; dolayýsýyla disk alaný beklenilenden
küçük olabilir. VARCHAR(n) büyüklüðü artabilen ama en büyük uzunluðu
sýnýrlý olan verileri saklamak için en uygun yöntemdir. TEXT, 1 GB
büyüklüðe kadar olan verileri tutmak için kullanýlýr.
CHAR(n), ayný uzunluktaki dizilerin saklanmasý için kullanýmýr.
CHAR(n) belirtilen uzunluða kadar boþluk ile doldurur; ancak
VARCHAR(n) sadece verilen karakterleri saklar. BYTEA binary veri
saklamak içindir; ayrýca "NULL" bayt içeren deðerleri de saklar.
Burada anlatýlan üç veri tipi de benzer baþarým karakteristiklere
sahiptir.
4.15.1) Nasýl serial/otomatik artan (auto-incrementing) bir alan
yaratabilirim?
PostgreSQL'de SERIAL veri tipi vardýr. Bu veri tipi bir sequence ve
kolon üzerinde bir index yaratýr.
Örnek, aþaðýdaki sorgu:
CREATE TABLE person (
id SERIAL,
name TEXT
);
buna çevrilir:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
Sequenceler hakkýnda daha fazla bilgi için create_sequence yardým
sayfasýna bakabilirsiniz. Her satýrýn OID alanýný tekil bir sayý
olarak alabilirsiniz. Ancak, veritabanýnýzýn dump'ýný alýp yeniden
yüklerseniz, OID deðerlerini koruyabilmek için pg_dump'ýn -o
parametresini ya da "COPY WITH OIDS" seçeneðini kullanmanýz
gerekecektir.
4.15.2) SERIAL giriþinin degerini nasýl alabilirim?
Bir yaklaþým, sequence nesnesindeki SERIAL deðerini, veriyi girmeden
önce nextval() ile alýp, aldýðýnýz deðeri kendinizin girmesidir.
4.15.1'deki örnek tabloyu kullanarak bir örnek verelim:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
Diðer sorgular için new_id'de yeni deðerin saklanmasý gerekir.
Otomatik olarak yaratýlan SEQUENE nesnesinin adý, <tablo adý>_<serial
kolonu adý>_seq þeklinde olacaktýr (< > iþaretleri olmadan).
Alternatif olarak, atanmýþ SERIAL deðerini, deðer girildikten sonra
currval() fonksiyonu ile alabilirsiniz:
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
Son olarak, ön tanýmlý deðeri bulmak için INSERT ifadesinden dönen OID
deðerini kullanabilirsiniz; ancak bu en az taþýnabilir çözüm
olacaktýr. Perl'de, Edmund Mergl'in DBD:Pg mödülü ile birlikte DBI
kullanarak, OID deðeri $sth->execute() çalýþtýrýldýktan sonra
$sth->(pg_oid_status) ile alýnabilir.
4.15.3) currval() ve nextval() diðer kullanýcýlara sorun yaratmaz mý?
Hayýr. curval(), tüm kullanýcýlar deðil, backend tarafýndan atanan
geçerli deðeri döndürür.
4.15.4) Neden sequence sayýlarý transaction iþleminin iptalinden sonra
yeniden kullanýlýyor? Neden sequence/SERIAL kolonumdaki sayýlarda atlamalar
oluyor?
Uyumluluðu arttýrmak için, sequence deðerleri çalýþan transaction'lara
gerektiði þekilde aktarýlýr ve transaction bitene kadar o deðer
kilitlenmez. Bu, iptal edilen transaction iþlemleri nedeniyle
boþluklara neden olur.
4.16) OID nedir? TID nedir?
OIDler, tekil satýr numaralarýna PostgreSQL'in yanýtýdýr.
PostgreSQL'de yaratýlan her sayý, tekil bir OID alýr. initdb iþlemi
sýrasýnda yaratýlan tüm OID'ler 16384'ten küçüktür
(backend/access/transam.h). Kullanýcýlar tarafýndan yaratýlan tüm
OID'ler bu sayýya eþit ya da bu sayýdan büyüktür. Varsayýlan durumda,
tüm bu OIDler sadece bir tablo ya da veritabanýnda deðil, tüm
PostgreSQL kurulumunda tekildir.
PostgreSQL OIDleri, tablolar arasýnda satýrlarý iliþkilendirmek için
kendi iç tablolarýnda kullanýr. Bu OIDler belirli kullanýcý
satýrlarýný belirtmek için kullanabilir ve join iþlemlerinde
kullanýlýr. OID deðerlerini saklamak için OID kolon tipini kullanmanýz
önerinir. Daha hýzlý bir eriþim için, OID alanýnda bir index
yaratabilirsiniz.
OID'ler yeni satýrlara, tüm veritabanlarý tarafýnda kullanýlan ortak
bir alandan atanýrlar. Eðer OID'i baþka bir deðere eþitlemek
isterseniz ya da tablonun bir kopyasýný orijinal OIDler ile çýkarmak
isterseniz, bu mümkündür:
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
OIDler 4-bit tamsayý olarak saklanýrlar ve 4 milyarda overflow
olacaktýr. Kimse bu sayýya ulaþtýðýna dair bir bilgi iletmedi ve bu
sýnýrý kimse bu sýnýra ulaþmadan kaldýracaðýz.
TIDler, belirli fiziksel satýrlar block ve offset deðerleri ile
belirtmekte kullanýlýr. TIDler, satýrlar deðiþtiðinde ya da yeniden
yüklendiðinde deðiþirler. Index girdileri tarafýndan fiziksel
satýrlarý göstermek için kullanýlýrlar.
4.17) PostgreSQL'de kullanýlan bazý terimlerin anlamlarý nelerdir?
Kaynak kodun bir kýsmý ve eski belgeler, daha geniþ kullaným alaný
olan terimleri kullanýrlar. Bunlarýn bazýlarý:
* table, relation, class
* row, record, tuple
* column, field, attribute
* retrieve, select
* replace, update
* append, insert
* OID, serial value
* portal, cursor
* range variable, table name, table alias
Genel veritabaný terimleri,
http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
/glossary.html adresinde bulunabilir.
4.18) Neden "ERROR: Memory exhausted in AllocSetAlloc()" hatasýný alýyorum?
Sisteminizde sanal belleðinizi tüketmiþ olabilirsiniz, ya da
çekirdeðiniz belli kaynaklar icin düþük bir sýnýra sahip olabilir.
postmaster'ý baþlatmadan önce aþaðýdakileri deneyebilirsiniz:
ulimit -d 262144
limit datasize 256m
Kabuðunuza baðlý olarak, bunlardan sadece biri olumlu sonuç
verecektir, ama bu iþlem veri segment sýnýrýnýzý arttýracak, ve belki
de sorgunuzun tamamlanmasýný saðlayacaktýr. Bu komut, varolan iþleme
(current process) ve komut çalýþtýrýldýktan sonraki tüm alt iþlemlere
uygulanýr. Eðer SQL istemcinizle, backend'in çok fazla veri döndürmesi
nedeniyle bir sorun yaþýyorsanýz, bunu istemciyi baþlatmadan önce
deneyiniz.
4.19) Hangi PostgreSQL sürümünü çalýþtýrdýðýmý nasýl görebilirim?
psql arabiriminde, select version(); yazýnýz.
4.20) Neden large-object iþlemlerim, "invalid large obj descriptor"
hatasýný veriyor?
Large object iþlemlerinizin uçlarýna, yani lo_open ... lo_close
komutlarýnýn çevresine, BEGIN WORK ve COMMIT koymanýz gerekmektedir;
Þu anda, PostgreSQL kurallarý large objectleri transaction commit
edildiðinde kapatarak uygulamaktadýr. Dolayýsýyla handle ile yapýlacak
ilk þey invalid large obj descriptor hatasý ile
sonuçlanacaktýr.Dolayýsýyla çalýþan kodunuz eðer transaction
kullanmazsanýz hata mesajlarý üretecektir.
Eðer ODBC gibi bir istemci arabirimi kullanýyorsanýz, auto-commit'i
kapatmanýz gerekebilir.
4.21) Þu andaki zamaný öntanýmlý deðer olarak kabul eden How do I create a
column that will default to the current time?
Alttakini kullanabilirsiniz:
CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Neden IN kullanan subquery'lerim çok yavas?
7.4 sürümünden önce, subqueryler. Eðer subquery sadece birkaç satýr ve
outer query bol sayýda satýr döndürüyorsa, IN en hýzlýsýdýr. Sorgularý
hýzlandýrmak için IN yerine EXISTS kullanýn:
SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)
sorgusunu, aþaðýdaki ile deðiþtirin:
SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
Bu iþlemin hýzlý olmasý için, subcol'un indexlenmiþ bir kolon olmasý
gerekmektedir.
7.4 sürümü ve sonrasýnda, IN aslýnda normal sorgularla ayný karmaþýk
join tekniklerini kullanýr ve EXISTS'e tercih edilir.
4.23) Outer join iþlemini nasýl yapabilirim?
PostgreSQL outer joins islemlerini SQL standartlarýný kullanarak
gerçekleþtirmektedir. Aþaðýda 2 örnek bulunmaktadýr:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
ya da
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
Bu özdeþ sorgular t1.col' i t2.col'ye join ederler ve ayný zamanda
t1'deki unjoined satýrlarý (t2'de eþlenmemiþ olanlarla) döndürürler.
RIGHT JOIN t2'nin unjoined satýrlarýný ekleyecektir. Bir FULL join,
eþleþmiþ bütün satýrlarý ve t1 ile t2'den tüm baðlanmamýþ (unjoined)
satýrlarý alýr. OUTER sözcüðü seçimseldir ve LEFT, RIGHT ve FULL join
iþlemlerinde olduðu kabul edilir. Sýradan join iþlemleri INNER JOIN
olarak adlandýrýlýr.
Önceki sürümlerde, OUTER JOINler UNION ve NOT IN kullanýlarak simüle
edilebiliyordu. Örneðin, tab1 ve tab2'yi birleþtirirken, aþaðýdaki
sorgu iki tablonun dýþtan baðlanmasýný saðlar:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) Ayný andan birden fazla veritabanýnda nasýl iþlem yapabilirim?
Mevcut veritabanýnýz dýþýndaki baþka bir veritabanýnýzý sorgulamanýzýn
bir yolu bulunmamaktadýr. Bunun nedeni, PostgreSQL'in veritabanýna
özel sistem kataloglarý yüklemesidir. Bu nedenle, cross-database bir
sorgunun nasýl davranacaðýný kestirmek zordur.
contrib/dblink fonksiyon çaðrýlarýný kullanarak cross-database
sorgulara izin verir. Tabii ki, bir istemci deðiþik veritabanlarýna
ayný anda eriþim saðlayabilir ve bilgiyi bu þekilde birleþtirebilir.
4.25) Bir fonksiyondan nasýl çoklu satýr ya da kolon döndürebilirim?
7.3 sürümünde, bir fonksiyondan kolaylýkla çoklu satýr ya da sütun
döndürebilirsiniz.
(http://techdocs.postgresql.org/guides/SetReturningFunctions)
4.26) Neden Pl/PgSQL fonksiyonlarý içinden güvenli bir þekilde tablo
yaratma/kaldýrma iþlemlerini yapamýyoruz?
PL/PgSQL fonksiyon içerikleri cache'ler. Bunun istenmeyen bir tarafý,
eðer bir PL/PgSQL fonksiyonu geçici bir tabloya eriþiyorsa ve bu tablo
ileride kaldýrýlýp yeniden oluþturulduktan sonra fonksiyon yeniden
çaðrýlýrsa, fonksiyon çalýþmayacaktýr; çünkü cache'lenmiþ fonksiyon
hala eski geçici tabloyu gösteriyor olacaktýr. Çözüm, geçici tablo
eriþimleri için PL/PgSQL'de EXECUTE kullanmaktýr. Bu, sorgunun her
seferinde yeniden iþlenmesini saðlayacaktýr.
4.27) 4.28) Hangi þifreleme seçenekleri bulunmaktadýr?
* contrib/pgcrypto SQL sorgularýnda kullanýlabilmesi için þifreleme
fonksiyonlarý içermektedir.
* Ýstemciden sunucuya iletiþimi þifrelemek için, sunucuda ssl
seçeneði postgresql.conf içinde açýk olmalýdýr. Ayrýca,pg_hba.conf
dosyasý içinde host ya da hostssl kaydý mutlaka olmalýdýr ve
istemci sslmode kapatýlmamalýdýr. (Ayný zamanda,PostgreSQL'in
doðal SSL baðlantýlarý dýþýnda ssh ya da ssl gibi 3.parti
þifrelenmiþ veri iletimi de mümkündür.)
* Veritabaný kullanýcý adý ve þifreleri 7.3 sürümü ile birlikte
otomatik olarak þifrelenirler. Önceki sürümlerde, postgresql.conf
içindeki PASSWORD_ENCRYPTION seçeneðini aktif hale getirmeniz
gerekmektedir.
* Sunucunun kendisini þifreli dosya sistemi üzerinde
çalýþtýrabilirsiniz.
_________________________________________________________________
PostgreSQL Özelliklerini Geniþletmek
5.1) Kullanýcý-tanýmlý bir fonksiyon yazdým. psql'de çalýþtýrdýðým zaman
neden core dump ediyor?
Sorunun nedeni birden fazla þey olabilir. Kullanýcý-tanýmlý
fonksiyonunuzu stand-alone bir programda çalýþtýrmayý deneyiniz.
5.2) PostgreSQL'e nasýl yeni tipler/fonksiyonlar ekleyebilirim?
Çalýþmalarýnýzý pgsql-hackers e-posta listesine gönderiniz. Kodunuz
incelendikten sonra /contrib dizinine konacaktýr.
5.3) Bir tuple dondürmek icin bir C fonksiyonunu nasil yazarým?
PostgreSQL 7.3 sürümü ile birlikte, C, PL/PgSQL ve SQL kullanýlarak
tablo-döndüren fonksiyonlar tamamen desteklenmektedir. Ayrýntýlý bilgi
için PostgreSQL 7.3.2 Kullanýcý Rehberi'ne bakabilrisiniz. Bir örneði
contrib/tablefunc içinde bulabilirsiniz.
5.4) Bir kaynak dosyasýnda deðiþiklik yaptým. Yeniden derlememe raðmen
deðiþiklik geçerli olmuyor. Neden?
Makefile'lar include dosyalarý için tam bir baðýmlýlýk içermezler.
Öncelikle make clean, ardýndan da baska bir make iþlemi yapmanýz
gerekir. GCC kullanýyorsanýz, configure betiðinin --enable-depend
seçeneðini, derleyicinin baðýmlýlýklarý otomatik olarak hesaplamasý
için kullanabilirsiniz.
Computing file changes ...