Bu sayfa makine çevirisidir. İngilizce orijinalini okuyun. English

IBSurgeon kütüphanesi

Firebird Veritabanını Hızlandırmanın 45 Yolu

Burada Firebird veritabanı için farklı alanlarda performans ipuçlarının listesini bulabilirsiniz - donanım/İşletim Sistemi ve Firebird yapılandırma ayarlarından SQL optimizasyon önerilerine kadar. Bu liste, Firebird’ü optimize etmek için eksiksiz bir referans değildir ve yürütme planları, işlem yönetimi ve sorgu performans istatistikleri gibi Firebird’ün çalışma temellerini anladığınızı varsayar.

Lütfen bu ipuçlarını dikkatle uygulayın ve üretime almadan önce etkilerini doğrulayın.

Şirketimiz (IBSurgeon) kapsamlı veritabanı performans optimizasyonu hizmeti sunmaktadır.

1. Veritabanını SSD’ye koyun

Veritabanınızı SSD’ye koyun. SSD sürücü, geleneksel sürücülerden çok daha iyi rastgele G/Ç sağlar. Rastgele G/Ç, büyük veritabanı dosyasına dağıtılmış verilerin okunması ve yazılması için kritiktir - veritabanı işlemlerinin çoğu yoğun paralel rastgele G/Ç gerektirir.

2. RAID 10 kullanın

RAID1 veya RAID5 kullanıyorsanız, RAID10’u düşünün - %15-25 daha hızlıdır.

3. BBU’yu kontrol edin

RAID denetleyicisi kullanıyorsanız, Yedek Pil Ünitesinin (BBU) kurulu ve çalışır durumda olduğunu kontrol edin - bazı satıcılar varsayılan olarak BBU sağlamaz. BBU olmadan, denetleyici önbelleği devre dışı bırakır ve RAID çok yavaş çalışır, normal SATA sürücülerden bile daha yavaş. Genellikle, BBU durumunu RAID yapılandırma aracında kontrol edebilirsiniz.

4. Yazma önbelleğini write-back olarak ayarlayın

Kurulu BBU’ya sahip RAID denetleyicisi (ve UPS’li sunucu) kullanıyorsanız, önbelleğinin write-back (write-through değil) olarak ayarlandığını kontrol edin. «Write-back», denetleyicinin yazma önbelleğini etkinleştirir.

5. Okuma önbelleğini etkinleştirin

RAID denetleyicisi kullanıyorsanız, okuma önbelleğinin etkinleştirildiğini kontrol edin.

6. Disk alt sistemini kontrol edin

Sürücülerinizde bozuk bloklar ve diğer donanım sorunları (aşırı ısınma dahil) olup olmadığını kontrol edin. Donanım sorunları G/Ç performansını önemli ölçüde düşürebilir ve veritabanı bozulmalarına yol açabilir.

7. Firebird 2.5’te SuperClassic veya Classic kullanın

Birçok bağlantıyla Firebird 2.5 SuperServer kullanıyorsanız, SuperClassic veya Classic kullanmayı deneyin, CPU’nun tüm çekirdeklerini kullanarak daha iyi ölçeklenebilirler.

8. Firebird 3’te SuperServer 3.0 kullanın.

2.5’te Classic veya SuperClassic kullanıyorsanız, Firebird 3.0 SuperServer’a geçişi düşünün, artık birden fazla çekirdek kullanabilir ve bunu paylaşılan önbelleğin avantajlarıyla birleştirebilir.

9. Sayfa arabelleği önbelleğini artırın

Sayfa arabelleği önbelleğinin boyutunu (DefaultDBCachePages parametresi) varsayılan değerlerden artırın. 2.5 SuperServer için 10000 sayfa, 3.0 SuperServer için 50000 sayfa, Classic ve SuperClassic için 256 ila 2048 sayfa öneriyoruz. Ancak, sayfa arabelleği önbellek değerini çok yüksek ayarlamayın - önbellek senkronizasyonunun bir maliyeti vardır ve bu değeri ayarlayarak tüm veritabanını RAM’e koyma fikri çalışmayacaktır. Önceden optimize edilmiş Firebird yapılandırma dosyalarını burada kullanın: /tr/optimized-firebird-configuration/

10. Sıralama işlemleri için bellek boyutunu artırın

firebird.conf dosyasındaki TempCacheLimit parametresinin değerini artırın - bu, sıralama için geçici alan önbelleğinin boyutunu belirtir. Varsayılan değerler çok düşüktür (Classic için 8Mb ve SuperServer için 64Mb), Classic için en az 64Mb ve SuperServer ve SuperClassic için 1Gb kullanın. Yine, #9’dan optimize edilmiş yapılandırma dosyalarını kullanın.

11. Forced Writes’ı Kapatın (dikkatle!)

Yoğun ekleme veya güncelleme aktiviteniz varsa (bunu HQbird MonLogger ile kontrol edebilirsiniz, ayrıntılar için HQbird Kullanıcı Kılavuzu sayfa 60’a bakın) ve donanım arızalarına karşı korumak için UPS ve replikasyon kuruluysa, Forced Writes ayarlarını OFF olarak ayarlamayı düşünün, yazma işlemlerinin hızını 3 kata kadar artırabilir.

12. Classic/SuperClassic için karma yuva sayısını artırın

Classic ve SuperClassic için LockHashSlots parametresinin değerini varsayılan 1009’dan büyük bir asal sayıya (örneğin 30011) artırın, bu dahili kilitleme mekanizmasındaki kuyrukları azaltacaktır.

13. Super Server 2.5 için CPU Affinity kullanın

SuperServer 2.5 kullanıyorsanız, CPUAffinity parametresini kullanımdaki veritabanı sayısına eşit bir değere ayarlayın: 2.5’teki SuperServer, belirli veritabanları için istekleri işlemek üzere farklı CPU çekirdekleri kullanabilir.

14. Geçici alan için hızlı sürücü kullanın

firebird.conf dosyasındaki TempDirectory parametresinin ilk bölümünü hızlı diske - SSD veya RAM sürücüye ayarlayın. Bu, büyük sıralamaların süresini azaltacaktır - örneğin veritabanı geri yüklenirken.

15. Veritabanı yedeklerini başka bir sürücüde saklayın

Veritabanı yedeklerini özel fiziksel sürücüde (RAID) saklayın. Bu, yedekleme sırasında okuma ve yazma G/Ç’sini ayıracak, yedekleme hızını artıracak ve ana sürücüdeki yükü azaltacaktır. Bu, özellikle kullanıcılar veritabanıyla çalışırken yedekler alındığında önemlidir. Firebird için donanım yapılandırması hakkında daha fazla ayrıntı " Firebird Donanım Kılavuzu" içinde bulunabilir.

16. Toplu eklemeler için endeksleri devre dışı bırakın

Birçok kayıt ekliyor veya güncelliyorsanız (tablonun %25’inden fazlası), kayıtların eklendiği tablo için endeksleri devre dışı bırakın ve ekleme veya güncellemeden sonra yeniden etkinleştirin. Endeks yeniden oluşturma işlemi, endeksin birçok güncellemesinden daha hızlı olabilir.

17. Hızlı eklemeler için Global Geçici Tablolar kullanın

Ekleme ve güncellemeleri hızlandırmak için, büyük kayıt kümelerinin toplu eklenmesi için Global Geçici Tablolar kullanın ve ardından kayıtları kalıcı tabloya aktarın. Kayıtları GTT’ye eklemek, ön işlemek ve ardından kalıcı tabloya taşımak çok etkili olabilir.

18. Gereksiz endekslerden kaçının

Yoğun ekleme ve güncelleme yapılan tablolar için daha az endeks kullanın. Her endeks, ekleme, güncelleme, silme ve çöp toplama işlemlerine önemli bir yük ekler - tek bir kayıt eklendiğinde/güncellendiğinde/silindiğinde/temizlendiğinde her endeks için 3-4 ek sayfa okuma ve yazma olabilir.

19. UDF’leri gömülü fonksiyon çağrılarıyla değiştirin

UDF çağrılarını gömülü fonksiyon çağrılarıyla değiştirin. Firebird’ün son sürümlerinde, daha önce yalnızca UDF kitaplıklarında bulunan işlevselliği sunan birçok gömülü fonksiyon eklenmiştir. Mümkün olduğunda bu tür fonksiyonları değiştirin, çünkü gömülü fonksiyonlar UDF’lerden 3 kata kadar daha hızlı çalışır.

20. Okuma işlemleri için salt okunur işlemler kullanın

Kayıtları değiştirmeyen işlemler (yani SELECT’ler) için izolasyon modu = read committed olan salt okunur işlemler kullanın. Bu tür işlemler, çöp toplamadan kayıt sürümlerini tutmaz ve süresiz olarak çalışabilir: veritabanı performansını etkilemezler.

21. Kısa yazma işlemleri kullanın ve TÜM uzun süreli işlemlerden kurtulun

Kısa yazılabilir işlemler kullanın (INSERT/UPDATE/DELETE işlemleri için).

Yazılabilir işlem ne kadar kısa olursa o kadar iyidir. Kısa işlemler, uzun süreli olanlardan orantılı olarak daha az sayıda kayıt sürümünü çöp toplamadan tutar. Ne yazık ki, tek bir uzun süreli işlem bile (örneğin geliştirme aracından açık bırakılan) diğer tüm kısa yazılabilir işlemlerin iyi etkisini bozabilir. Bu yüzden uzun süreli işlemleri izlemeniz ve kaynak koddaki uygun yerleri düzeltmeniz gerekir. Firebird veritabanındaki en eski aktif işlem hakkında uyarılar almak için HQbird DataGuard aracını (hangi uygulamaların başlattığı, hangi IP adresi, başlangıç zaman damgası) ve uzun süreli aktif işlemlerin tam listesini ve G/Ç istatistiklerini görmek için HQbird MonLogger aracını kullanın. Ayrıca, kayıt kümelerini önbelleğe alabilen veritabanı erişim bileşenleri/kitaplıkları kullanıyorsanız, önbelleğe alınmış güncellemeleri kullanın.

22. Uzun kayıt zincirlerinden kaçının

Bir kaydın birçok kayıt sürümüne sahip olduğu durumlardan kaçının - Firebird uzun kayıt zincirleriyle çok daha yavaş çalışır. (hangi tabloların kaç kayıt sürümüne sahip olduğunu ve en uzun kayıt zincirinin ne olduğunu görmek için HQbird IBAnalyst aracını, Tablolar sekmesini kullanabilir, “Max Version” üzerinde sıralayabilirsiniz). Aynı kaydın birden çok güncellenmesi yerine, eklemelerin ve eski kayıtların zamanlanmış silinmesinin bir kombinasyonunu kullanın.

23. PREPARE’ı doğru kullanın

Yalnızca parametrelerin değiştiği SQL sorgularını çalıştırmak için hazırlanmış ifadeler kullanın - örneğin, bu tür sorguların döngüsünden önce prepare yapın. Prepare önemli zaman alabilir (özellikle büyük tablolar için) ve sorguyu yalnızca bir kez hazırlamak genel performansı büyük ölçüde artıracaktır.

24. Toplu ekleme/güncelleme işlemi sırasında çok sık COMMIT yapmayın

Toplu INSERT/UPDATE/DELETE işlemi durumunda, her değişiklikten sonra işlemi commit etmeyin (veritabanı sürücünüzde otomatik commit seçeneğini kullanıyorsanız bu olabilir) - işlemleri en az 1000 işlemden sonra veya daha fazlasında commit edin. Her işlem commit’i veritabanına karşı birkaç okuma/yazma G/Ç işlemi çalıştırır, bu yüzden sık commit’ler veritabanı performansını düşürür.

25. Birçok sabitle IN kullanıyorsanız endeksleri “kapatın”

WHERE fieldX IN (Constant1, Constant2,… ConstantN) yapısını kullanıyorsanız ve fieldX üzerinde bir endeks varsa, Firebird endeksi IN listesinde kaç sabit varsa o kadar kullanacaktır. fieldX’i +0 ifadesine çevirerek endeks aramasını devre dışı bırakın: WHERE fieldX+0 IN (Constant1, Constant2,… ConstantN) veya dizeler için fieldX||’’ kullanın

26. IN’i JOIN ile değiştirin

İç içe WHERE IN(SELECT… WHERE IN (SELECT.. WHERE IN() )) içeren sorgular kullanmaktan kaçının, bu Firebird optimizer’ın kafasını karıştırabilir. İç içe IN’leri join’lere dönüştürün.

27. LEFT JOIN’i doğru şekilde kullanın

LEFT OUTER join’ler kullanıyorsanız, tabloları join’de en küçükten en büyüğe doğru açıkça yerleştirin.

28. SELECT sorgularının getirisini sınırlayın

SELECT sorguları için büyük çıktıyı FIRST… SKIP veya ROWS yan tümceleriyle sınırlamaya her zaman çalışın. Sorgu özellikle bir rapor olarak tasarlanmadıysa (tüm kayıtların yazdırılmasını/dışa aktarılmasını gerektiren), genellikle ilk 10-100 kaydı göstermek yeterlidir. Yalnızca gerekli kayıtları getirin.

29. ORDER BY/GROUP BY içeren SELECT’te daha az sütun belirtin

ORDER BY/GROUP BY içeren sorgularda hem SELECT kısmında (yani gösterilecek alanlar) hem de ORDER BY yan tümcesinde sütun sayısını ve toplam genişliklerini azaltın. Firebird, SELECT ve ORDER BY/GROUP BY yan tümcelerindeki sütunları birleştirir ve bunları bellekte (veya bellek yeterli değilse diskte) sıralar. Bu nedenle, SELECT’te uzun bir VARCHAR varsa, sıralama dosyalarının boyutu gerçekten büyük olabilir (birçok gigabayt). Yalnızca sıralanması gereken alanlar için alan sayısını azaltmak ve gösterilecek büyük alanlarla geç join yapmak, ORDER BY/GROUP BY içeren bir sorgunun hızını büyük ölçüde (x3-x10) artırabilir.

30. ORDER BY/GROUP BY içeren SELECT’i optimize etmek için türetilmiş tablolar kullanın

Sıralama içeren SQL sorgusunu optimize etmenin başka bir yolu, gereksiz sıralama işlemlerinden kaçınmak için türetilmiş tablolar kullanmaktır. Bunun yerine

Code
SELECT FIELD_KEY, FIELD1, FIELD2, ... FIELD_NFROM TORDER BY FIELD2

aşağıdaki değişikliği kullanın:

Code
SELECT T.FIELD_KEY, T.FIELD1, T.FIELD2, ... T.FIELD_NFROM (SELECT FIELD_KEY FROM T ORDER BY FIELD2) T2JOIN T ON T.FIELD_KEY = T2.FIELD_KEY

31. Kısa dizeleri VARCHAR’da, büyükleri BLOB’larda saklayın

Kısa karakter verilerini saklamak için VARCHAR’ları, uzun metinleri saklamak için BLOB’ları kullanın. VARCHAR’lar küçük veri parçaları için daha hızlıdır çünkü kayıtta saklanırlar ve kaydın tamamı aynı G/Ç döngüsünde okunur ve kayıt boyutu veritabanı sayfa boyutunun 2/3’ünden azsa, kaydın tamamı aynı veritabanı sayfasında saklanır. BLOB’lar kaydın dışında saklanır ve okumak için ek bir G/Ç turu gerektirir; uzun dizeleri okuma ve yazmada avantaj gösterirler.

32. Büyük SELECT’lerden BLOB sütunlarını hariç tutun

Büyük SELECT’lerden BLOB sütunlarını hariç tutun. BLOB’lardan bilgileri seçici olarak göstermek için alt seçimlerle bir tür geç bağlama kullanın (örneğin, belgenin içeriğini gösterin).

33. Birincil ve benzersiz anahtarlar için BIGINT kullanın

Otomatik artan birincil ve benzersiz anahtarlar ve her türden tanımlayıcılar için BIGINT türünü kullanın. BIGINT ile işlemler en hızlıdır ve BIGINT neredeyse tüm veri aralıklarını saklamak için yeterli kapasiteye sahiptir.

34. Anahtar olarak VARCHAR kullanmayın

Gerçekten gerekmedikçe tanımlayıcılar için VARCHAR kullanmayın - bunlarla yapılan işlemler, tamsayı sütunlarına göre çok daha az verimlidir. Özellikle GUID’lerden tanımlayıcı olarak kaçının - GUID değerlerinin rastgele dağılımı nedeniyle, Primary/Unique Keys GUID’leri ile yapılan INSERT/UPDATE işlemleri tamsayılara göre 20 kata kadar daha yavaş olabilir.

35. İndeks istatistiklerini yeniden hesaplayın

İndeks istatistiklerini düzenli olarak yeniden hesaplayın. Sık veya büyük ölçekli değişiklikler olan tablolar için indeks istatistiklerini SET STATISTICS komutuyla güncelleyin; bu, Firebird optimizer’ın daha iyi SQL planları seçmesini sağlar. HQbird Firebird DataGuard, bu indeks istatistiklerinin yeniden hesaplanmasını istenen programa göre (genellikle haftada bir) otomatik olarak gerçekleştirebilir.

36. Bağlantı havuzu kullanın

Firebird veritabanına veritabanı bağlantıları kısa süreliyse (web siteleri için tipiktir), bağlantı havuzu kullanın - örneğin, PHP’de ibase_connect yerine ibase_pconnect fonksiyonunu kullanın.

37. Firebird 3.0’da LINGER seçeneğini kullanın

Veritabanı bağlantıları kısa süreliyse ve Firebird 3+ kullanıyorsanız, önbelleği belirtilen süre boyunca aktif tutmak için LINGER seçeneğini kullanın; bu, başka bağlantı olmasa bile sık kullanılan sayfaları önbellekte tutar. Örneğin, ALTER DATABASE SET LINGER TO 60, son bağlantının bitiminden sonra önbelleği 60 saniye tutar.

38. HASH JOIN kullanın

Firebird 3.0’da, büyük ve küçük tabloların birleştirilmesi durumunda, HASH JOIN, indeks kullanan «nested loop» ile normal birleştirmeden çok daha hızlı olabilir. Firebird optimizer’ın HASH join kullanmasını sağlamak için birleştirme koşulunda +0 kullanın: T1 JOIN T2 ON T1.FIELD1+0 = T2.FIELD2+0. Optimizasyonun sonucunu production’a koymadan önce kontrol edin!

39. Uygun PSQL fonksiyonlarını DETERMINISTIC olarak işaretleyin

Parametresi olmayan ve sabit değerler döndüren PSQL fonksiyonlarınızı (Firebird 3+) DETERMINISTIC anahtar kelimesiyle işaretleyin. Deterministik fonksiyonlar, geçerli sorgu kapsamında hesaplanır ve önbelleğe alınır.

40. Firebird 3.0’da analitik (window) fonksiyonları kullanın

Bir sütunu ve onun için toplama fonksiyonunu aynı anda çıktılayan SELECT çalıştırıyorsanız, window (analitik) fonksiyonları kullanın - bu, alt sorgu veya 2 sorgudan daha hızlıdır. Örneğin:

Code
Select id, department, salary, salary / (select sum(salary) from employee) percentagefrom employee

bununla değiştirin:

Code
Select id, department, salary, salary / sum(salary) OVER () percentage from employee

41. gbak için -se anahtarını kullanın

gbak yedekleme ve/veya geri yükleme hızını %20’ye kadar artırmak için -se anahtarını kullanın, örneğin:

Code
gbak -b -g -se service_mgr c:\db\data.fdb e:\backup\data.fbk

42. WHERE CURRENT OF

PSQL’de imleç tarafından getirilen kayıtları işlemenin en hızlı yolu ‘where current of <>’ yan tümcesidir. Bu, ‘where rb$db_key = :v_db_key’ ifadesinden daha hızlı ve birincil veya benzersiz anahtarla aramadan çok daha hızlıdır.

43. İzleme tablolarına sık sorgu yapmaktan kaçının

Firebird izleme tablolarına (MON$) çok sık sorgu çalıştırmayın - bu tür sorgular önemli kaynaklar tüketir ve ana iş mantığının performansını büyük ölçüde düşürebilir. MON$ sorgularını dakikada birden daha sık çalıştırmamanızı öneririz. Firebird sorgularının/işlemlerinin/bağlantılarının sürekli izlenmesi için, Trace API’yi destekleyen HQbird PerfMon aracını kullanın (ayrıntılar için HQbird User Guide sayfa 66’ya bakın).

44. Toplu ekleme/güncelleme işlemleri için NO_AUTO_UNDO seçeneğini kullanın

Aynı işlem çerçevesinde birçok DML (Update/Insert/Delete) komutu çalıştırıyorsanız, Firebird her komutun undo-log’unu işlemin undo-log’u ile birleştirir. Toplu DML işlemlerini hızlandırmak için, her komutun undo-log’unu işlemin undo-log’u ile birleştirmemek için işlemi «NO AUTO UNDO» seçeneğiyle başlatın.

45. Gerekmiyorsa Firebird 3’te SRP kimlik doğrulaması kullanmayın

Gerçekten ihtiyacınız yoksa SRP kullanıcı kimlik doğrulaması (Firebird 3.0+) kullanmayın - SRP kimlik doğrulamasıyla bağlantı, normal bağlantıdan daha yavaş kurulur.

Özet yerine

Performans optimizasyonu birçok faktörün dikkate alınmasını gerektirir ve gerçekten zorlu olabilir. Yukarıdaki her şeyi denediyseniz, profesyonel veritabanı performans optimizasyonu hizmeti almayı düşünün.

Bize ulaşın

Sorularınız mı var? E-posta ile bizimle iletişime geçmekten çekinmeyin!