SQL sorgusunu daha hızlı bir hale nasıl getirebilirim?

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

SQL sorgusunu daha hızlı bir hale nasıl getirebilirim?

Mesaj gönderen conari »

Arkadaşlar Yaklaşık 6 -7 dosyayı birbirine bağlayarak bir sql sorgusu çekiyorum . Bunu daha hızlı nasıl hale getirebilirim .Join yapılarını değiştirerek v.s.

Kod: Tümünü seç

SELECT STOKEK.INGISIM, SIPDETAY.STOK_KODU, SIPDETAY.FISNO, SIPDETAY.MIKTAR, SIPDETAY.STHAR_NF, SIPDETAY.STHAR_DOVFIAT, SIPDETAY.STHAR_TARIH, SIPDETAY.STHAR_TESTAR, SIPDETAY.STHAR_ACIKLAMA, CARIMAS.CARI_ISIM, SIPMAS.GEN_ISK1O, SIPMAS.GEN_ISK2O, STOKEK.KULL3S, CARIMAS.DOVIZ_TIPI, SIPDETAY.STRA_SIPKONT, SIPMAS.KOD1, CARIMAS.RAPOR_KODU3,
(SELECT SUM(STOKHAR.MIKTAR) A WHERE  STOKHAR.STHAR_GCKOD='C' and SIPDETAY.STOK_KODU = STOKHAR.STOK_KODU AND SIPDETAY.FISNO = STOKHAR.STHAR_SIPNUM AND SIPDETAY.STRA_SIPKONT = STOKHAR.STRA_SIPKONT) AS TESLIMAT 
FROM SIPDETAY  
INNER JOIN SIPMAS ON ( SIPMAS.FATIRS_NO = SIPDETAY.FISNO) 
INNER JOIN STOKEK ON (STOKEK.STOK_KODU = SIPDETAY.STOK_KODU) 
INNER JOIN CARIMAS ON (CARIMAS.CARI_KOD = SIPDETAY.STHAR_ACIKLAMA) 
LEFT JOIN STOKHAR ON (STOKHAR.STHAR_SIPNUM = SIPDETAY.FISNO 
AND STOKHAR.STRA_SIPKONT = SIPDETAY.STRA_SIPKONT) WHERE SIPDETAY.STOKHARTIP='6' AND SIPDETAY.STHAR_TARIH BETWEEN '2006-01-01' AND '2007-12-31' GROUP BY STOKEK.INGISIM, SIPDETAY.STOK_KODU, SIPDETAY.FISNO, SIPDETAY.MIKTAR, SIPDETAY.STHAR_NF, SIPDETAY.STHAR_DOVFIAT, SIPDETAY.STHAR_TARIH, SIPDETAY.STHAR_TESTAR, SIPDETAY.STHAR_ACIKLAMA, CARIMAS.CARI_ISIM, SIPMAS.GEN_ISK1O, SIPMAS.GEN_ISK2O, STOKEK.KULL3S, CARIMAS.DOVIZ_TIPI, SIPDETAY.STRA_SIPKONT, SIPMAS.KOD1, SIPDETAY.SIRA, STOKHAR.STHAR_SIPNUM, STOKHAR.STOK_KODU, STOKHAR.STRA_SIPKONT, STOKHAR.STHAR_GCKOD, CARIMAS.RAPOR_KODU3 ORDER BY SIPDETAY.STHAR_TARIH, SIPDETAY.STHAR_ACIKLAMA, SIPDETAY.FISNO, SIPDETAY.SIRA
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

WHERE içinde bakılan alanlar indeks li mi :?: Değilse ilgili alanlar için indeks oluşturmak perfomansı belirgin bir şekilde artıracaktır. Ayrıca ORDER BY da gerekmeyen alanları kaldırın :idea: En iyisi Order By ı tamamen kaldırıp ne kadar fark ettiğine bakabilirsiniz.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Hocam Sum ile toplattırdığım alanı query e koymasam çok hızlı geliyor, Onu hesaplar iken baya bir performans kaybım var. Orada bir iki oynama yapabilirmiyiz Acaba, Yani Order o kadar etkilemiyor.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Karşılaştırılan alanlar indeksli ise normal hızda gelmesi lazım.. Başka bir öneri aklıma gelmiyor.. Doğrusu değişik şekillerde aynı sonucu verecek şekilde denemek gerekir :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

SQL şu şekilde çalıştırabilir misiniz?

Kod: Tümünü seç

SELECT
  STOKEK.INGISIM, SIPDETAY.STOK_KODU, SIPDETAY.FISNO, SIPDETAY.MIKTAR, SIPDETAY.STHAR_NF, SIPDETAY.STHAR_DOVFIAT, SIPDETAY.STHAR_TARIH, SIPDETAY.STHAR_TESTAR, SIPDETAY.STHAR_ACIKLAMA, CARIMAS.CARI_ISIM, SIPMAS.GEN_ISK1O, SIPMAS.GEN_ISK2O, STOKEK.KULL3S, CARIMAS.DOVIZ_TIPI, SIPDETAY.STRA_SIPKONT, SIPMAS.KOD1, CARIMAS.RAPOR_KODU3,
  SUM(STOKHAR.MIKTAR) AS TESLIMAT
FROM SIPDETAY
  INNER JOIN SIPMAS  ON SIPMAS.FATIRS_NO = SIPDETAY.FISNO
  INNER JOIN STOKEK  ON STOKEK.STOK_KODU = SIPDETAY.STOK_KODU
  INNER JOIN CARIMAS ON CARIMAS.CARI_KOD = SIPDETAY.STHAR_ACIKLAMA
  LEFT JOIN STOKHAR  ON STOKHAR.STHAR_GCKOD = 'C' and SIPDETAY.STOK_KODU = STOKHAR.STOK_KODU AND SIPDETAY.FISNO = STOKHAR.STHAR_SIPNUM AND SIPDETAY.STRA_SIPKONT = STOKHAR.STRA_SIPKONT
WHERE SIPDETAY.STOKHARTIP = '6' AND SIPDETAY.STHAR_TARIH BETWEEN '2006-01-01' AND '2007-12-31'
GROUP BY STOKEK.INGISIM, SIPDETAY.STOK_KODU, SIPDETAY.FISNO, SIPDETAY.MIKTAR, SIPDETAY.STHAR_NF, SIPDETAY.STHAR_DOVFIAT, SIPDETAY.STHAR_TARIH, SIPDETAY.STHAR_TESTAR, SIPDETAY.STHAR_ACIKLAMA, CARIMAS.CARI_ISIM, SIPMAS.GEN_ISK1O, SIPMAS.GEN_ISK2O, STOKEK.KULL3S, CARIMAS.DOVIZ_TIPI, SIPDETAY.STRA_SIPKONT, SIPMAS.KOD1, CARIMAS.RAPOR_KODU3
ORDER BY SIPDETAY.STHAR_TARIH, SIPDETAY.STHAR_ACIKLAMA, SIPDETAY.FISNO, SIPDETAY.SIRA
İyi çalışmalar.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Kodu düzeltmişsin performans için deneme fırsatım olmadı deneyip döneceğim teşekkürler.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

bence şu olaylara dikkat ederseniz belki hız artabilir.

Mesaj gönderen unalaygun »

Sorgunuz var olan indexleri kullanabiliyormu.

kullanamıyorsa indexi kullanmaya zorlayabilirsiniz.
tablo adından sonra "with(index(index adi))"

Bence şunu yapabilirsiniz. Tarihe göre index yoksa yapmak çok faydalı olur. Aynı zamanda ıncludu columns diye bir özellik var yukarıda belirttiğiniz toplama işleminide hızlandıracaktır gözle görülür şekilde.

Tarih alanı indexine ınclude columns olarak toplayacağınız tutarı koyun.

Excuation planı da inceleyip join işlemlerinde merge,nested mı yoksa ..
mı yapıyor indexleriniz Clustred indexmi index seek mi index scan mi yapıyor görebilirsiniz..
kolay gelsin.
derviş
Cevapla