Yorumları: 820
Konuları: 135
Kayıt Tarihi: 07-12-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.030 Uzman
09-05-2019, Saat: 15:01
(Son Düzenleme: 09-05-2019, Saat: 15:02, Düzenleyen: adelphiforumz.)
Selamlar
Aynı tabloya 2 farklı şekilde sorgu atıyorum fakat daha hızı olmasını düşündüğüm (Values) yöntemi daha yavaş çıktı
sizce burda yanılgıya düştüğüm yer neresidir.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz.
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868 Üstad
Sorun DövizKurları tablosu üzerinde Table Scan yapmasından kaynaklı gibi görünüyor. Döviz kurları tablosunda Kod sahası indexli mi ? Ayrıca bir müddettir Sql Server'dan uzak kalmıştım. İkinci Sql cümlenizdeki Values kullanımı bana biraz garip göründü.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 46
Konuları: 0
Kayıt Tarihi: 02-12-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 243 Acemi
Merhaba
select * from DOVIZKURLARI WHERE Kod IN ('USD','EUR','DEM')
bu şekilde daha hızlı çalışacaktır. where de IN ile altta başka bir sql çalışması sql i yavaşlatıyor.
Yorumları: 820
Konuları: 135
Kayıt Tarihi: 07-12-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.030 Uzman
09-05-2019, Saat: 17:44
(Son Düzenleme: 09-05-2019, Saat: 17:50, Düzenleyen: adelphiforumz.)
@ Tuğrul HELVACI Benim merak ettiğim aynı şartlar altındaki 2 farklı sorgu şekli neden yaklaşık 4 kat gibi sonuç üretiyor
Values kulanımı fonksiyonun yaptığını sabit olacak şekilde çalıştırıyor.
Values yapısı sabit işler için sql tarafında sıkça kullandığım bir yapı
Yapısını linkte detaylı bulabilirsiniz
https://docs.microsoft.com/en-us/sql/t-s...erver-2017
Bu durum milyonlarca kayıt içerisinde ciddi hız farkları oluşturacaktır
Ben sadece ornek olsun diye Doviz tablosu üzerinden yaptım
Index te oluşturup karşılaştırmaları inceledim hız orantısı pek değişmiyor
(09-05-2019, Saat: 17:41)hasangoktas Adlı Kullanıcıdan Alıntı: Merhaba
select * from DOVIZKURLARI WHERE Kod IN ('USD','EUR','DEM')
bu şekilde daha hızlı çalışacaktır. where de IN ile altta başka bir sql çalışması sql i yavaşlatıyor.
@ hasangoktas Verdiğniz örneği test ettim Values ile aynı sonucu üretiyor
Ve bu örnekte direkt TabloScan işlemi uyguladığı için büyük datalarda daha uzun sürme ihtimali var
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz.
Yorumları: 230
Konuları: 9
Kayıt Tarihi: 07-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.713 Programcı
Bir de çoklu değerlerin tablo yapısında olduğu yöntemde kod alanına indeks ekleyerek deneme yapın sonuç değişecek mi? declare @dvz table (Kod nvarchar(5) INDEX rvz_Kod NONCLUSTERED)
insert into @dvz (Kod) values ('USD'), ('EUR'), ('DEM')
select * from DovizKurlari where Kod in (select Kod from @dvz)
Kuvvetle muhtemel bir değişiklik olmayacak kanaatindeyim ama aşağıdaki gibi join ile ilişkilendirme yaparsak iş biraz değişebilir. declare @dvz table (Kod nvarchar(5) INDEX rvz_Kod NONCLUSTERED)
insert into @dvz (Kod) values ('USD'), ('EUR'), ('DEM')
select kur.* from DovizKurlari as kur
inner join @dvz as dvz on dvz.Kod=kur.Kod
Bu ikinci yapı belki bir nebze olsun performansı arttıracaktır diye tahmin ediyorum.
Yorumları: 69
Konuları: 7
Kayıt Tarihi: 14-08-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 199 Başlangıç
Sql kaynaklarında "IN" yerine "WHERE EXISTS" olarak kullanmanın çok daha hızlı sonuç vereceği söyleniyor.
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868 Üstad
10-05-2019, Saat: 08:32
(Son Düzenleme: 10-05-2019, Saat: 08:35, Düzenleyen: Tuğrul HELVACI.)
Merhaba,
IX_DOVIZKURLARI index'i hangi alan ile ilişkilendirilmiş ? Ayrıca tabloda primary key var mı ? (Execution plan'da heap ifadesini gördüğüm için sordum)
Bana kalırsa istatistikleri güncelleyin ve durumu yeniden gözlemleyin, bakalım bir fark oluşacak mı. Ayrıca bana gönderdiğiniz açıklamada belirtildiğine göre; sizin kullanım tarzınızda bir derived table oluşturuluyormuş ve datalar önce bu derived table'a aktarılıyor ardından bir üst sorguya girdi olarak sunuluyor. Belki küçük performans farkı bundan kaynaklanıyordur. Milyonlarca kaydın olduğu bir tablo için aynı durum oluşmayabilir, istatistikler güncel ise farklı bir execution plan oluşabilir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 820
Konuları: 135
Kayıt Tarihi: 07-12-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.030 Uzman
10-05-2019, Saat: 11:00
(Son Düzenleme: 10-05-2019, Saat: 11:12, Düzenleyen: adelphiforumz.)
(09-05-2019, Saat: 19:22)sabanakman Adlı Kullanıcıdan Alıntı: Bir de çoklu değerlerin tablo yapısında olduğu yöntemde kod alanına indeks ekleyerek deneme yapın sonuç değişecek mi? declare @dvz table (Kod nvarchar(5) INDEX rvz_Kod NONCLUSTERED)
insert into @dvz (Kod) values ('USD'), ('EUR'), ('DEM')
select * from DovizKurlari where Kod in (select Kod from @dvz)
Kuvvetle muhtemel bir değişiklik olmayacak kanaatindeyim ama aşağıdaki gibi join ile ilişkilendirme yaparsak iş biraz değişebilir.declare @dvz table (Kod nvarchar(5) INDEX rvz_Kod NONCLUSTERED)
insert into @dvz (Kod) values ('USD'), ('EUR'), ('DEM')
select kur.* from DovizKurlari as kur
inner join @dvz as dvz on dvz.Kod=kur.Kod
Bu ikinci yapı belki bir nebze olsun performansı arttıracaktır diye tahmin ediyorum.
@ sabanakman her iki şekildede söylediğiniz gibi test ettim.
Sonuçlar aşağıdaki sorgular ile aynı zamanda bitiyor. yaklaşık 60-70 ms aralığında
Select *
From DOVIZKURLARI
Where Kod In (Select Myval From ( Values ('USD'), ('EUR'), ('DEM') ) As TVal(MyVal))
(10-05-2019, Saat: 08:32)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Merhaba,
IX_DOVIZKURLARI index'i hangi alan ile ilişkilendirilmiş ? Ayrıca tabloda primary key var mı ? (Execution plan'da heap ifadesini gördüğüm için sordum)
Bana kalırsa istatistikleri güncelleyin ve durumu yeniden gözlemleyin, bakalım bir fark oluşacak mı. Ayrıca bana gönderdiğiniz açıklamada belirtildiğine göre; sizin kullanım tarzınızda bir derived table oluşturuluyormuş ve datalar önce bu derived table'a aktarılıyor ardından bir üst sorguya girdi olarak sunuluyor. Belki küçük performans farkı bundan kaynaklanıyordur. Milyonlarca kaydın olduğu bir tablo için aynı durum oluşmayabilir, istatistikler güncel ise farklı bir execution plan oluşabilir.
@ Tuğrul HELVACI tablo yapısı aşağıdaki şekilde
Testleri yapmadan önce "Update STATISTICS DOVIZKURLARI" şeklinde işlem yapıyorum
Create Table [dbo].[DOVIZKURLARI]( [IDAuto] [int] Identity(1,1) Not Null, [Tarih] [Date] Null, [CrossOrder] [Smallint] Null, [Kod] [NVarchar](5) Null, [CurrencyCode] [NVarchar](5) Null, [UNIT] [Varchar](50) Null, [Isim] [Varchar](100) Null, [CurrencyName] [Varchar](100) Null, [ForexBuying] [Float] Null, [ForexSelling] [Float] Null, [BanknoteBuying] [Float] Null, [BanknoteSelling] [Float] Null, Constraint [PK_DOVIZKURLARI] Primary Key Clustered ( [IDAuto] Asc )With (Pad_Index = Off, Statistics_Norecompute = Off, Ignore_Dup_Key = Off, Allow_Row_Locks = On, Allow_Page_Locks = On) On [PRIMARY] ) On [PRIMARY] go
Create NonClustered Index [IX_DOVIZKURLARI] On [dbo].[DOVIZKURLARI] ( [Kod] Asc )With (Pad_Index = Off, Statistics_Norecompute = Off, Sort_In_Tempdb = Off, Drop_Existing = Off, Online = Off, Allow_Row_Locks = On, Allow_Page_Locks = On) On [PRIMARY] Go
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz.
|