MS_SQL Server 2008 R2 Express Index Kullanımı

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ı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Herkese Selamlar,

Az önce bir şeyle karşılaştık ki, evlere şenlik bir durum. Öncelikle bunun nedenini ve avantajlarını bilen varsa yazsın (MSDN ve Technet'te zırvaladıkları haricinde esas noktalardan bahsediyorum, çünkü oraları okuduk)

Bir tablo üzerinde fihrist_id (autoinc), adi_soyadi (varchar(50)), telefon_no1 (varchar(25)), telefon_no2 (varchar(25)), telefon_no3 (varchar(25)) şeklinde fieldlarımız var.

Firebird'ün Index seçme ve kullanma üzerine denemeler yaptık ve LIKE'da dahi indexleri çok güzel ve kurnazca kullandığını gördük. Daha sonra bunları bir de M$-SQL Server da deneyelim bakalım ne yapıyor diye araştıralım istedik. Bir de ne gördük, index yaptığımız halde indexleri kullanmıyor. Table Scan yapıp duruyor. Acaba dedik, page size'dan kaynaklı düşük kayıt sayısı sebebiyle Table Scan kolayına geliyor da onu mu kullanıyor dedik, kayıt sayısını 500,000'lere filan çıkardık.

sorgu şu

Kod: Tümünü seç

SELECT adi_soyadi, telefon_no1, telefon_no2, telefon_no3
FROM tbl_fihrist
WHERE adi_soyadi = 'HAKAN ÖZTÜRK'
Amanın ne görelim, Actual Execution Planda hala Table Scan veriyor. 2 adet indeximiz var bir tanesi adi_soyadi alanı, 2. index ise telefon_no1 alanından oluşuyor. Alet inatla Table Scan yapıyor. Ama Actual Query Plan'da da bir uyarı veriyor. MISSING NONCLUSTRED INDEX deyip deyip duruyor. Biraz kurcuklayınca, INDEX'in içinde bir de ne görelim INCLUDE diye bir alan. INDEX'inizde KEY alanlarınız dışında, bir de SELECT'de çektiğiniz kolonları da INCLUDE kısmında istiyor. Yani biz SELECT'i şu şekilde kullanırsak

Kod: Tümünü seç

SELECT adi_soyadi 
FROM tbl_fihrist
WHERE adi_soyadi = 'HAKAN ÖZTÜRK'
o zaman indexi kullanıyor ama fazladan kolon koyarsak indexi kullanmıyor. Yada SELECT cümlesinde kullandığınız tüm kolonları Indexin INCLUDE bölümünde eklerseniz o zaman INDEX'i kullanıyor.

Yahu hangi akla hizmet böyle bir tospağalık yapmışlar? Bunun nedenini bilen var mı? INDEX'leriniz kontrol edin, SELECT'lerinizde yavaşlık varsa uyarıda bulunduğum konuyu dikkate alıp deneme yapın, acayip saçmalık bir şey uydurmuş yine bu mikropsoftçular (Tıpkı WITH NO LOCK gibi bir taraflarından yine bir şey uydurmuşlar)

Valla şaka etmiyorum, Allah rızası için bir bilen varsa bunun bana mantıklı bir izahını yapsın.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen mussimsek »

Selam abi,

Evet SQL Server'ın bünyesinde indekslerle alakalı bir öküzlük var. Biz de indeksleri kullanmadığını veya yanlış indeks tercih ettiğini farkettik. Çözümümüz with (NOLOCK) ifadesi ile kendi tercih ettiğimiz indeksi kullanmasını söylemek oldu.

with (NOLOCK, index=index_adı)

Bu şekilde verdiğin zaman, alanları eklesen bile indeksi kullanıyor mu, bir kontrol edebilir misin abi?

Kolay gelsin.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Selamlar,

Forced Index'de de kullanmıyorsa o zaman harbi denyonun önde gideni olur. Ama deneyeceğim bakalım ne yapıyor :)

Kolay Gelsin

Not : Sonucu yazarım
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Valla harbiden hangi akla hizmet yaptılar bu Ge(Rİ)liştirmeyi valla tebrik.

Az önce denemeyi yaptım. Diyecek laf bulamıyorum. İzah etmeye çalışayım.

Eğer INDEX'de KEY alan olarak belirttiğiniz alanların Query'sini çekiyorsanız, ACTUAL EXECUTION PLAN'da sadece 2 adet işlem gösteriyor. INDEXED SEEK ve RESULT.

Eğer fazladan alan kullanıyorsanız o zaman TABLE SCAN ve RESULT geliyor.

Eğer fazladan alan kullanıyorsanız ve directif olarak WITH (NOLOCK, INDEX=index_name) veriyosanız amca bu sefer de yolu uzatmak için elinden geleni yapıp INDEXED SEEK yapıyor sonra Compute Scalar ve paralel bir biçimde RID Lookup (Heap) işlemini yapıp, NESTED BİR LOOP ile sonucu birleştiriyor sonra RESULT'ı NESTED LOOP'tan veriyor. :bravo: :bravo: :bravo: :bravo: :bravo: :lol: Bu ne yaaaaa!!!!!!

Hayır anlamadığım nokta şu, ben JOIN yapmıyorum, tek bir tablo ve tek bir WHERE koşulu veriyorum. Bu amca ne yapıyorda HASH edip NESTED LOOP'a girip bilgileri birleştiriyor?

Hakikaten kafam almıyor !!!! Amaçları ne? Durduk yere Server'ın kaynaklarını boşa tüketmek mi, ya da bakın çok çalışıyorum izlemini mi vermek istiyorlar acaba? Anlam veremedim !!!!

Neyse sizin de bilginiz olsun Allah bilir JOINED veya NESTED Query'ler, IN'ler, EXISTS'ler filan gibi durumlarda böyle bir Execution Plan çıkartıyorsa yazık ki ne yazık......

Ama Index olayında iyice zıvanadan çıkmış gibi duruyorlar.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen orhancc »

Merak edip ben de denedim ve sadece Primary Key olan tablolarda bile her koşulda clustered index kullanıyor, table scan yapmıyor.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Selamlar,

Hangi SQL Server versiyonu? Actual Execution Planları nedir?


Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Tekrar Selamlar,

Bendeki

MS SQL Server Express Edition with Advanced Services
Version : 10.50.1617.0

Sizdeki nedir?
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Bakın işte bendeki resultlar,

Tek Kolon olunca çıkan Execution Plan,
Resim

Uploaded with ImageShack.us

SELECT * deyince ortaya çıkan Execution Plan

Resim

Uploaded with ImageShack.us

Forced Index verildiğinde ortaya çıkan execution plan

Resim

Uploaded with ImageShack.us
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen orhancc »

Bendeki de aynı versiyon ve bunu 1 milyonun üzerinde kayıtla deniyorum. Ayrıca bu tabloda index oluşturulmadı sadece Primary Key var.

Resim

Uploaded with ImageShack.us
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen Kuri_YJ »

Selamlar,

PK'yı kaldırıp denerseniz, o zaman PK'siz bir şekilde getirecektir. Zaten dikkat edin size de MISSING INDEX diyor !!!!!!!! Ayrıca PK Clustred olduğu için zaten siz ne yaparsanız yapın (ORDER BY vermediğiniz zaman) Clustred yani Kayıtların geldiği şekilde diske yazıldığı sırada indexin dizilimindeki kayıtların da aynı sırada durduğu sistem) şeklinde getirir. Siz alanlarınızı WHERE koşulunda farklı alanlardan sorgu yaptığınızda hala size Clustred PK olarak getiriyorsa (ki getirecektir) bu daha vahim bir durum.

Çünkü Tarih alanı sorgusu çekerken, ID alanı indexiyle verileri getirirse Table Scan yapmaktan da daha uzun süre alır !!!! Doğru WHERE koşullarında doğru Index kullanıyor olmanız lazım. Zannedersem siz Indexli geliyor diye doğru index kullandığını düşünüyorsunuz ama malesef yanılıyorsunuz. Bunu bir inceleyin. Değişik alanları WHERE koşulunda kullanın. Hala hiç index değiştirmezse (ki değiştirmeyecek) çünkü elinizde sadece PK var. Bu durumda index kullanıyor olmanız dezavantaj yaratır.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: MS_SQL Server 2008 R2 Express Index Kullanımı

Mesaj gönderen orhancc »

Bu benim veritabanım değil zaten örnek bi veri vardı orada çektim. Ama yine de denerim.
Cevapla