mirror of https://github.com/postgres/postgres
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1192 lines
51 KiB
1192 lines
51 KiB
|
|
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-2009, 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.
|
|
|