Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Sorgulama performansı hakkında bilgi alışverişi
#1
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. 
Cevapla
#2
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...
WWW
Cevapla
#3
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.
WWW
Cevapla
#4
@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. 
Cevapla
#5
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.
Cevapla
#6
Sql kaynaklarında "IN" yerine "WHERE EXISTS" olarak kullanmanın çok daha hızlı sonuç vereceği söyleniyor.
Cevapla
#7
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...
WWW
Cevapla
#8
(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 
PHP Kod: (Select All)
Create Table [dbo].[DOVIZKURLARI](
    [
IDAuto] [intIdentity(1,1Not Null,
    [
Tarih] [DateNull,
    [
CrossOrder] [SmallintNull,
    [
Kod] [NVarchar](5Null,
    [
CurrencyCode] [NVarchar](5Null,
    [
UNIT] [Varchar](50Null,
    [
Isim] [Varchar](100Null,
    [
CurrencyName] [Varchar](100Null,
    [
ForexBuying] [FloatNull,
    [
ForexSelling] [FloatNull,
    [
BanknoteBuying] [FloatNull,
    [
BanknoteSelling] [FloatNull,
 
Constraint [PK_DOVIZKURLARIPrimary Key Clustered 
(
    [
IDAutoAsc
)With (Pad_Index OffStatistics_Norecompute OffIgnore_Dup_Key OffAllow_Row_Locks OnAllow_Page_Locks OnOn [PRIMARY]
On [PRIMARY]
go

Create NonClustered Index 
[IX_DOVIZKURLARIOn [dbo].[DOVIZKURLARI]
(
    [
KodAsc
)With (Pad_Index OffStatistics_Norecompute OffSort_In_Tempdb OffDrop_Existing OffOnline OffAllow_Row_Locks OnAllow_Page_Locks OnOn [PRIMARY]
Go 
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  triger hakkında basit bir soru. Bay_Y 8 1.008 17-08-2023, Saat: 20:05
Son Yorum: Tuğrul HELVACI
  DBNETLIB Hatası hakkında adelphiforumz 5 1.776 02-06-2023, Saat: 14:18
Son Yorum: Misc-2
  Değer ve yetkiye göre sorgulama denizfatihi 0 745 26-09-2021, Saat: 12:23
Son Yorum: denizfatihi
  MSSQl üzerinde çalışan bir sorgunun durumu hakkında bilgi almak. Bay_Y 5 2.075 21-09-2021, Saat: 11:26
Son Yorum: Bay_Y
  En yakın değeri bulmak hakkında adelphiforumz 8 4.502 25-02-2021, Saat: 22:53
Son Yorum: adelphiforumz



Konuyu Okuyanlar: 1 Ziyaretçi