SQL sorgu hızlandırma

Başlatan esensoy, 03 Haziran 2018, 12:49:19

esensoy

Selam arkadaşlar, 1 milyon küsür satır arasından aşağıdaki sorguyu çalıştırdığımda 30 saniye kadar sürebiliyor, bunu hızlandırmanın bir yolu olabilir mi?

select batch,cinsi,count(batch) as kalan from bilgi where atanan_musteri = 'xx company' and alt_musteriye_satildimi = 0 group by batch,cinsi
En tehlikeli an "zafer" anıdır.

tunayk

1M satır az bir satır değil. SQL li koşturan PC nin yeteri kadar hızlı ve RAM'inin yüksek olması önemli.

Benim gördüğüm asıl performans kaybı, bu hacimdeki bir tabloda string veri türünden arama yapmak.  Bu da sanırım tablo tasarım hatasından kaynaklı. Doğru olan bu  tabloda müşteri bilgisi int ID olarak tutulması ve bu tabloada müşteri no ile arama yapılması. Hatta bu iş sıkça yapılıyorsa, bu sütunda indeks kullanılabilir.

Uygulama tarafından müşteri adı ile kullanılacaksa, önce müşteriler tablosundan isme ait ID alınır ve sonrasında bu tablodan "where MusteriNo=xx..." şeklinde arama yaparsınız. Bu size ciddi hız kazandırır.

Diğer bir yöntem de, bu sorgunu stored procedure olarak kaydedilmesi. Stored procedure'ler önden planlanmış olarak kaydedilir ve bir miktar daha hızlı çalışır.

Eğer bilgi tablonuzda bunlardan daha fazla sütun varsa, sadece ilgili sütunları içeren bir View oluşturabilirsiniz. Sorgnuzu bu View üzerinde çalıştırırsanız biraz daha hız kazanacaktır.

Eğitimlerde SQL'e az işlem yaptırın, hız kazanın diye öğütlerler. Bundan harketle, sorgunuzdaki count işlemini PC tarafında daha hızlı yapabilirsiniz.

Son olarak eğer çok sayıda sonuç dönüyorsa, bir ksımını ekrana getirip kullanıcı onlara bakarken , diğer kısmını da getirmek bekleme süresini gözden kaçıracaktır.

ibocakir

@tunayk hocam ağzınıza sağlık çok güzel açıklamışsınız. Bir de benim sorum olsa,

Şuan sorgu atılan tablo ilintili bir tablo değilse(ki atılan sorgudan olmadığını görebiliyoruz), burada saklanın 1M satır veriyi SQL gibi bir yapıda değil de NoSQL gibi bir yapıda saklasak nasıl olur? Yani sistemde SQL ve NoSQL birlikte çalışacak, ilintili yapılar,veriler SQL veritabanında saklanacak, uzun ve vakit alacak kısımlar NoSQL veritabanında ?

tunayk

Açıkçası NoSql hakkında bilgim yok ancak anladığım kadarıyla kendi çalışmamdan açıklayayım.
Bir makinemiz var. Bu makine bir işlem yapıyor.  Bu işlem için iki tür verimiz var. Birinci grup işlemin özet bilgileri yani,ne zaman başladı ne zaman bitti işlem numarası reçete bilgisi vb. İkinci grup ta işlem süresi boyunca periyodik olarak alınan Log verileri basınç,sıcaklık akım gerilim vb. Gibi.
Bu uygulamada işlem bilgilerini işlemler tablosunda tuttum. İşlemler tablosunun bir sütunu Log bilgilerinin tutulduğu dosya yolu.
Log bilgileri her bir işlem için ayrı Access dosyası şeklinde tutuldu.
Böylece önce önce işlem bilgisine ulaşır, bakmak isterse Log dosyasından veriler okunur. Bu yöntemi çeşitlendirebilirsiniz. Access yerine text veya binary formatta dosyalama yapılabilir.
Tek bir Log tablosu kolaylık olur ancak sonradan bir işlemin logunu sürmek zahmetli olabilir.
Arkadaşın durum biraz daha farklı. Aynı senaryoyu ona uygulayacak olsam, herbir müşteri için bir hareketler tablosu oluştururdum.

muhittin_kaplan

stored procedures kullanabilirsin hocam

Yuunus

#5
...

esensoy

Stored procedure ler hangi zamanlarda çalışır? Bir şey ile tetiklemek gerekir mi?
En tehlikeli an "zafer" anıdır.

tunayk

Stored procedure denen şey normalde gönderdiğiniz sorguyu kaydetmekten ibarettir. Örneğin yukarıda verilen sorguyu "bilgi_getir" adıyla kaydedersiniz. Sonra da sql sorgusunda sadece bilgi_getir yazdığınızda kaydettiğiniz sorgu çalıştırılır ve sonuçları size döner.

ibocakir

"cache" mantığıyla aynı mı hocam ?

tunayk

 Eh işte  :) Öyle de denebilir.

boreas

Stored procedure, network trafiğini azaltır, sql.den daha geniş komut paketi vardır
CREATE PROCEDURE sp1 (start_val integer, end_val integer, ...)
AS
declare variable i integer;
BEGIN
i = start_val;
while (i < end_val) do
begin
...
i = i + 1;
end
END

Hatta dışarıdan DLL tarzı farklı uygulamalarda yazılmış kitaplıkları bağlayabilirsin. Hiç denemedim ama teorik olarak doviz kurunu alıp faturayı ona göre otomatik kaydeedn bir yazılım yapabilirsin. Ama belkide en önemli kullanım yeri katmanlı mimaridir. Şöyleki bir yazılımın var musteri_kaydet diye sp.var. Ve bu program web, android, windows ve linux sürümleri var. dedilerki müşteri kaydederken eskiden cari kaydi elle açıyorduk şimdi otomatik açsın. Ne yapacaksın butün yazılımları güncellemen gerekir. Ama müşteri kaydet SP.yi kullanıyorsan veritabanında SP.yi güncellediğin tek tek bütün programları güncellemen gerekmez. Esasen bu iş o kadar gelişmiştir ki Bilinen programlama dilleri nerdeyse sadece kullanıcı arayüzü sağlası veritabanı sorgu, kayıt, silme herşey database'de yazılsın derler.

esensoy

sp1 diye  bir stored procedurumuz var, saat başı çalıştırmak istesek, ne yapmamız gerekir?
En tehlikeli an "zafer" anıdır.