mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
b9de4a26cf
change content (at least not supposed to). Magnus Hagander
1193 lines
51 KiB
Plaintext
1193 lines
51 KiB
Plaintext
|
||
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-2005, PostgreSQL Global Development Group
|
||
Portions Copyright (c) 1994-6 Regents of the University of California
|
||
|
||
Permission to use, copy, modify, and distribute this software and its
|
||
documentation for any purpose, without fee, and without a written
|
||
agreement is hereby granted, provided that the above copyright notice
|
||
and this paragraph and the following two paragraphs appear in all
|
||
copies.
|
||
|
||
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
|
||
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||
INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
|
||
ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
|
||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
||
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
|
||
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
|
||
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
|
||
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||
|
||
Ü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.
|