SQL Sorgu Performans Sorunu
-
SELECT (SELECT TOP (1) sBarkod FROM dbo.tbStokBarkodu WHERE nStokID = dbo.tbStok.nStokID) AS sBarkod ,(SELECT TOP (1) sBarkod FROM dbo.tbStokBarkodu WHERE nStokID = dbo.tbStok.nStokID AND nFirmaID <> '0') AS sFirmaBarkod , dbo.tbStok.sAciklama , sFiy1.lFiyat AS TA , sFiy2.lFiyat AS ISF , sFiy3.lFiyat AS PSF , sFiy4.lFiyat AS TAI ,dbo.tbStok.sKodu ,dbo.tbKdv.nKdvOrani ,dbo.tbStok.sModel ,dbo.tbRenk.sRenkAdi ,dbo.tbStok.sBeden ,dbo.tbStok.nStokID ,dbo.tbStokSinifi.sSinifKodu14 FROM dbo.tbStokSinifi RIGHT OUTER JOIN dbo.tbStok ON dbo.tbStokSinifi.nStokID = dbo.tbStok.nStokID RIGHT OUTER JOIN dbo.tbStokBarkodu AS tbStokBarkodu_1 ON dbo.tbStok.nStokID = tbStokBarkodu_1.nStokID LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy1 ON dbo.tbStok.nStokID = sFiy1.nStokID AND sFiy1.sFiyatTipi = 'TA' LEFT OUTER JOIN dbo.tbRenk ON dbo.tbStok.sRenk = dbo.tbRenk.sRenk LEFT OUTER JOIN dbo.tbKdv ON dbo.tbStok.sKdvTipi = dbo.tbKdv.sKdvTipi LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy2 ON dbo.tbStok.nStokID = sFiy2.nStokID AND sFiy2.sFiyatTipi = 'ISF' LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy4 ON dbo.tbStok.nStokID = sFiy4.nStokID AND sFiy4.sFiyatTipi = 'TAI' LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy3 ON dbo.tbStok.nStokID = sFiy3.nStokID AND sFiy3.sFiyatTipi = 'PSF' GROUP BY dbo.tbStok.sKodu, dbo.tbStok.nStokID, dbo.tbStok.sAciklama, dbo.tbStok.sBeden, dbo.tbRenk.sRenkAdi, sFiy1.sFiyatTipi, sFiy2.sFiyatTipi, sFiy3.sFiyatTipi, sFiy4.sFiyatTipi, sFiy1.lFiyat, sFiy2.lFiyat, sFiy3.lFiyat, sFiy4.lFiyat, dbo.tbKdv.nKdvOrani, dbo.tbStok.sModel, dbo.tbStokSinifi.sSinifKodu14Böyle bir sorgum var bu sorgunun tamamnlanması yaklasık 47 sn suruyor.
sorgu performans araclarında 47 saniyeyi alt sorgularımın biri %33 diğeri %31 alıyor bu alt sorguları daha farklı calıstırmak ıcın bır yol varmı acaba
-
lazz bunu yazdı
SELECT (SELECT TOP (1) sBarkod FROM dbo.tbStokBarkodu WHERE nStokID = dbo.tbStok.nStokID) AS sBarkod ,(SELECT TOP (1) sBarkod FROM dbo.tbStokBarkodu WHERE nStokID = dbo.tbStok.nStokID AND nFirmaID <> '0') AS sFirmaBarkod , dbo.tbStok.sAciklama , sFiy1.lFiyat AS TA , sFiy2.lFiyat AS ISF , sFiy3.lFiyat AS PSF , sFiy4.lFiyat AS TAI ,dbo.tbStok.sKodu ,dbo.tbKdv.nKdvOrani ,dbo.tbStok.sModel ,dbo.tbRenk.sRenkAdi ,dbo.tbStok.sBeden ,dbo.tbStok.nStokID ,dbo.tbStokSinifi.sSinifKodu14 FROM dbo.tbStokSinifi RIGHT OUTER JOIN dbo.tbStok ON dbo.tbStokSinifi.nStokID = dbo.tbStok.nStokID RIGHT OUTER JOIN dbo.tbStokBarkodu AS tbStokBarkodu_1 ON dbo.tbStok.nStokID = tbStokBarkodu_1.nStokID LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy1 ON dbo.tbStok.nStokID = sFiy1.nStokID AND sFiy1.sFiyatTipi = 'TA' LEFT OUTER JOIN dbo.tbRenk ON dbo.tbStok.sRenk = dbo.tbRenk.sRenk LEFT OUTER JOIN dbo.tbKdv ON dbo.tbStok.sKdvTipi = dbo.tbKdv.sKdvTipi LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy2 ON dbo.tbStok.nStokID = sFiy2.nStokID AND sFiy2.sFiyatTipi = 'ISF' LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy4 ON dbo.tbStok.nStokID = sFiy4.nStokID AND sFiy4.sFiyatTipi = 'TAI' LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy3 ON dbo.tbStok.nStokID = sFiy3.nStokID AND sFiy3.sFiyatTipi = 'PSF' GROUP BY dbo.tbStok.sKodu, dbo.tbStok.nStokID, dbo.tbStok.sAciklama, dbo.tbStok.sBeden, dbo.tbRenk.sRenkAdi, sFiy1.sFiyatTipi, sFiy2.sFiyatTipi, sFiy3.sFiyatTipi, sFiy4.sFiyatTipi, sFiy1.lFiyat, sFiy2.lFiyat, sFiy3.lFiyat, sFiy4.lFiyat, dbo.tbKdv.nKdvOrani, dbo.tbStok.sModel, dbo.tbStokSinifi.sSinifKodu14Böyle bir sorgum var bu sorgunun tamamnlanması yaklasık 47 sn suruyor.
sorgu performans araclarında 47 saniyeyi alt sorgularımın biri %33 diğeri %31 alıyor bu alt sorguları daha farklı calıstırmak ıcın bır yol varmı acaba
Hocam outer join satirlari kaldirmadan ilerler diye biliyorum.
Inner join sadece iki tablodan istenileni alir

full outer join iki tablodan verileri alir ve eslesmeyen satirlari null gosterir

left outer join full ile ayni olup sadece sag taraftaki tablonun soldakiyel eslesen kisimlarini alir. Eslesmeyenere null degeri koyar

Birde cross join var ki hepsini hepsiyle eslestiriyor.
OUTER JOIN yerine inner join kullanabilir misin bir bak.
Ayrica alt sorgu yerine funksiyon veya stored procedure yazabirlisin.
-
okadar ıyı degılım ama ogrenebılırım
Ayrica alt sorgu yerine funksiyon veya stored procedure yazabirlisin.
bu deıdıgını nasıl yapabılırım vb nettekine benzıyenn bır seydır herhalde
-
profil resmini begenmedim :)
sorgunun uzun sürmesinin muhtemel nedeni yaptigin gruplama.. bunu yazilim tarafinda da yapabilirsin (eger varsa).
Ayrica iki konu hakkinda arastirma yaparsan bir cok sey ogrenebilirsin. Database Normalization ve Database Index. Maalesef bu konular gözden kaciliyor. Oysa cok onemli konular..
Ikinci tavsiyem, kodunu yavas yavas kirp ve performanslarini ölc, boylece yük getiren kismi tam olarak bulursun ve ona göre de sorgunu tekrar yazarsin
unbalanced tarafından 23/Haz/17 13:32 tarihinde düzenlenmiştir -
unbalanced bunu yazdı
profil resmini begenmedim :)
sorgunun uzun sürmesinin muhtemel nedeni yaptigin gruplama.. bu yazilim tarafinda da yapabilirsin.
Ayrica iki konu hakkinda arastirma yaparsan bir cok sey ogrenebilirsin. Database Normalization ve Database Index. Maalesef bu konular gözden kaciliyor. Oysa cok onemli konular..
Ikinci tavsiyem, kodunu yavas yavas kirp ve performanslarini ölc, boylece yük getiren kismi tam olarak bulursun ve ona göre de sorgunu tekrar yazarsin
hocam profıl ruh halımı yansıtyor
test ettiğimde 47 sn zaten %60 dan fazlasını ıkı alt sorgum harcıyor.
şimdi fonksıyon olusturdum ama kullanmayı bulamadım
SELECT (SELECT * FROM dbo.sBarkodBull(dbo.tbStok.nStokID)) AS sBarkod ,(SELECT TOP (1) sBarkod FROM dbo.tbStokBarkodu WHERE nStokID = dbo.tbStok.nStokID AND nFirmaID <> '0') AS sFirmaBarkod , dbo.tbStok.sAciklama, sFiy1.lFiyat AS TA , sFiy2.lFiyat AS ISF , sFiy3.lFiyat AS PSF , sFiy4.lFiyat AS TAI ,dbo.tbStok.sKodu ,dbo.tbKdv.nKdvOrani ,dbo.tbStok.sModel ,dbo.tbRenk.sRenkAdi ,dbo.tbStok.sBeden ,dbo.tbStok.nStokID ,dbo.tbStokSinifi.sSinifKodu14 FROM dbo.tbStokSinifi RIGHT OUTER JOIN dbo.tbStok ON dbo.tbStokSinifi.nStokID = dbo.tbStok.nStokID RIGHT OUTER JOIN dbo.tbStokBarkodu AS tbStokBarkodu_1 ON dbo.tbStok.nStokID = tbStokBarkodu_1.nStokID LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy1 ON dbo.tbStok.nStokID = sFiy1.nStokID AND sFiy1.sFiyatTipi = 'TA' LEFT OUTER JOIN dbo.tbRenk ON dbo.tbStok.sRenk = dbo.tbRenk.sRenk LEFT OUTER JOIN dbo.tbKdv ON dbo.tbStok.sKdvTipi = dbo.tbKdv.sKdvTipi LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy2 ON dbo.tbStok.nStokID = sFiy2.nStokID AND sFiy2.sFiyatTipi = 'ISF' LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy4 ON dbo.tbStok.nStokID = sFiy4.nStokID AND sFiy4.sFiyatTipi = 'TAI' LEFT OUTER JOIN dbo.tbStokFiyati AS sFiy3 ON dbo.tbStok.nStokID = sFiy3.nStokID AND sFiy3.sFiyatTipi = 'PSF' GROUP BY dbo.tbStok.sKodu, dbo.tbStok.nStokID, dbo.tbStok.sAciklama, dbo.tbStok.sBeden, dbo.tbRenk.sRenkAdi, sFiy1.sFiyatTipi, sFiy2.sFiyatTipi, sFiy3.sFiyatTipi, sFiy4.sFiyatTipi, sFiy1.lFiyat, sFiy2.lFiyat, sFiy3.lFiyat, sFiy4.lFiyat, dbo.tbKdv.nKdvOrani, dbo.tbStok.sModel, dbo.tbStokSinifi.sSinifKodu14usttekı alt sorguyu değiştim ama çalıştıramadım
-
fonsiyonun ne getirecegini bilmiyorum ama su sekil cagirabilirsin
select dbo.fonksiyonun('varsa_parametren')
bunu cagirinca donen sonucu gorursun...
Ayrica dedigim gibi Indexleme olayina bakarsan performansin artar. DB yi yormamak adina da bir yazilim dili kullaniyorsan her seyi SQL serverdan beklememek gerek.
Kolay gelsin
-
indexleme yapılıp yapılmadıgını nasıl kontrol edebılırım birde
bu sekılde yazınca foksıyounu bulamıyo acaba atladıgım bırseymı var
-
lazz bunu yazdı
indexleme yapılıp yapılmadıgını nasıl kontrol edebılırım birde
bu sekılde yazınca foksıyounu bulamıyo acaba atladıgım bırseymı var
https://www.youtube.com/watch?v=rreKY6K3S_A Burada iyi bir şekilde anlatılıyor hocam. Ek olarak sanırım joinler ile sadece tek bir parametre çekiyorsun. Join yaparak tüm parametreleri ele alıyorsun. LeftJoin veya Right join'i yukarıda dhmm anlatmış zaten onlarla fazladan işleme sokuyorsun sorguyu . Indexleme olayı da veritabanını çok iyileştiriyor birebir şahit oldum. heleki LIKE Sorguları varsa .........
MhmdAlmz tarafından 23/Haz/17 15:47 tarihinde düzenlenmiştir -
MhmdAlmz bunu yazdı
Ek olarak sanırım joinler ile sadece tek bir parametre çekiyorsun. Join yaparak tüm parametreleri ele alıyorsun. LeftJoin veya Right join'i yukarıda dhdmm anlatmış zaten onlarla fazladan işleme sokuyorsun sorguyu . Indexleme olayı da veritabanını çok iyileştiriyor birebir şahit oldum. heleki LIKE Sorguları varsa .........
Cok rica edecegim dhmm yazalim :). Saka bir yana FB tan email, pm vs bana bi ulasirmisin.
-
lazz bunu yazdı
indexleme yapılıp yapılmadıgını nasıl kontrol edebılırım birde
bu sekılde yazınca foksıyounu bulamıyo acaba atladıgım bırseymı var
hocam bu konularla ilgili videolar vs izlersen daha faydali olur. Hem daha iyi ögrenmis olursun ve ilerde sorun yasamazsin. Iki dakikayla anlatilacak seyler yok. Iyi ve performansli bir veritabani hazirlamak icin veritabani uzmanlari var ve cidden cok buyuk isler bunlar. Ben ileri seviye veritabani dersleri aldim ancak bilgim yine de cok kisitli, bu da baska bir derya deniz misali. O yüzden veritabani performansi ile ilgili videolar üzerinden gidersen senin acindan daha iyi olur. Ben senin tablo yapilarini vs bilmedigim icin su kodu al bu performanslidir diyemiyorum.
Ancak merak ediyorsan Sql plan query cost diye aratirsan, sorgularin getirecegi yükleri bulabilirsin ve yeniden yazarak düzeltebilirsin. ama dedigim gibi benim bunu burada iki dakika da anlatmam mümkün degil. Bunla ilgili kitaplar mevcut.
kolay gelsin
