Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 10757|Yanıt: 0

[Kaynak] SQL sorgulama hızını artırmak için 30 puan

[Bağlantıyı kopyala]
Yayınlandı 27.01.2015 20:09:54 | | |

1. Sorguyu optimize etmek için tam tablo taramasından kaçınmaya çalışmalı ve önce yer ve sırayla ilgili sütunlar için bir indeks oluşturmayı düşünmelisiniz.



2. Where cümlesinde olan alanlarda null değer yargısından kaçınmaya çalışın, aksi takdirde motorun indeks kullanımını bırakıp tam tablo taraması yapmasına neden olur, örneğin:

T bölümünden ID seçin, burada num null

Varsayılan değeri 0 olarak num üzerinde ayarlayabilir, tablodaki num sütununda null değer olmadığından emin olabilir ve ardından şöyle sorgulayabilirsin:

T'den ID seçin, burada num=0



3. Where cümlesinde != veya <> operatörlerini kullanmaktan kaçının, aksi takdirde motor indeks kullanımını bırakıp tam tablo taraması yapar.



4. Koşula katılmak için where cümlesinde OR kullanmaktan kaçınmalısınız, aksi takdirde motorun indeks kullanımını bırakıp tam bir tablo taraması yapmasına neden olur, örneğin:

T'den ID seçin, burada num=10 veya num=20

Böyle sorgu sorgulayabilirsiniz:

T'den ID seçin burada num=10

Birleşme hepsi

T bölümünden ID seçin burada num=20



5.in ve not in de dikkatli kullanılmalıdır, aksi takdirde tam tablo taramasına yol açar, örneğin:

T ile ID'yi seç, burada num in(1,2,3)

Sürekli değerler için, arada kullanabiliyorsanız in kullanmayın:

T üzerinden ID seçin, burada num 1 ile 3 arasında



6. Aşağıdaki sorgu da tam bir tablo taramasına yol açar:

T'den ID seç, burada ad gibi '%abc%'

Verimliliği artırmak için tam metin aramayı düşünün.



7. Bir where cümlesinde bir parametre kullanırsanız, tam bir tablo taraması da yapılır. SQL yalnızca yerel değişkenleri çalışma zamanında çözer, ancak optimizator erişim planlarının seçimini çalışma zamanına erteleyemez; Derleme sırasında seçilmelidir. Ancak, derleme sırasında bir erişim planı oluşturulursa, değişkenin değeri hâlâ bilinmez ve bu nedenle endeks seçimi için giriş öğesi olarak kullanılamaz. Aşağıdaki ifadeler tam olarak taranacaktır:

T bölümünden ID seçin, burada num=@num

Sorguyu bir indeks kullanmaya zorlayabilirsiniz:

T ile (index(index(index name)) arasından id seçin, burada num=@num



8. Where cümlesinde alanları ifade etmekten kaçının, bu da motorun indeks kullanımını bırakıp tam tablo taramasına geçmesine yol açar. Örneğin:

T bölümünden ID seçin, burada num/2=100

şu şekilde değiştirilmelidir:

T'den ID seçin burada num=100*2



9. Where cümlesinde çalışan alanlarda fonksiyon işlemlerini yapmaktan kaçının; bu da motorun indeks kullanımını bırakıp tam tablo taramasına geçmesine neden olur. Örneğin:

T'den id seçin, burada substring(name,1,3)='abc' --abc ile başlayan name id

T'den ID seçin, burada datediff(day,createdate,'2005-11-30')=0--'2005-11-30' oluşturulan id

şu şekilde değiştirilmelidir:

T'den ID seç, burada ad 'abc%' gibi

T arasından id seçin, burada createdate>='2005-11-30' ve createdate<'2005-12-1'



10. "=" harfinin solundaki fonksiyonlar, aritmetik işlemler veya diğer ifade işlemlerini burada yerine getirmeyin, aksi takdirde sistem indeksi doğru kullanamayabilir.



11. Bir indeks alanı koşul olarak kullanılırken, eğer indeks bileşik bir indeksse, sistemin indeks kullanmasını sağlamak için indeksin ilk alanı koşul olarak kullanılmalıdır, aksi takdirde indeks kullanılmaz ve alanların sırası mümkün olduğunca indeks sırasıyla tutarlı olmalıdır.



12. Boş bir tablo yapısı oluşturmak gibi anlamsız sorgular yazmayın:

T'den #t'ye col1,col2'yi seçin, burada 1=0

Bu tür kod herhangi bir sonuç kümesi döndürmez, ancak sistem kaynaklarını tüketir, bu yüzden şöyle bir şekilde değiştirilmelidir:

tablo oluştur #t(...)



13. Çoğu zaman mevcut olanlarla değiştirmek iyi bir tercih olur:

Num'u a'dan Num'u seç (Num'u B'den Seç)

Yerine aşağıdaki ifadeyi ekleyin:



Var olan A'dan NUM seçin (B'den 1'i seçin, burada num=a.num)

14. Tüm indeksler sorgular için geçerli değildir, SQL sorguyu optimize etmek için tablodaki verilere dayanır; indeks sütununda büyük miktarda veri çoğaltması varsa, SQL sorguları indeksi kullanmayabilir; örneğin bir tabloda cinsiyet alanı vardır, erkek, kadın neredeyse yarısıdır, ayrıca indeks cinsiyet üzerine kurulu olsa bile, sorgu verimliliğinde rol oynamaz.



15. Ne kadar çok indeks olmasa, indeks ilgili seçimin verimliliğini kesinlikle artırabilir, ancak ekleme ve güncelleme verimliliğini de azaltır; çünkü indeks ekleme veya güncelleme sırasında yeniden inşa edilebilir, bu yüzden bir indeksin nasıl oluşturulacağı özel duruma bağlı olarak dikkatlice düşünülmelidir. Bir tabloda 6'dan fazla indeks olmaması en iyisidir ve eğer çok fazlaysa, nadir kullanılan bazı sütunlarda indeks oluşturmanın gerekli olup olmadığını düşünün.



16. Kümelenmiş indeks veri sütunlarını mümkün olduğunca güncellemekten kaçının, çünkü kümelenmiş indeks veri sütunlarının sırası, tablo kayıtlarının fiziksel depolama sırasıdır ve sütun değeri değiştiğinde, tüm tablo kayıtlarının sırasının ayarlanmasına yol açar ve bu da önemli kaynaklar tüketir. Uygulamanızın kümelenmiş indeks sütunlarını sık sık güncellemesi gerekiyorsa, indeksi kümelenmiş bir indeks olarak oluşturup oluşturmamalı mısınız diye düşünmelisiniz.



17. Sayısal alanlar kullanmaya çalışın ve sadece karakter olarak sayısal bilgi içeren alanlar tasarlamayın; bu da sorguların ve bağlantıların performansını azaltır ve depolama yükünü artırır. Bunun nedeni, motorun sorgular ve birleştirmeler işlenirken dizide her karakteri teker tek karşılaştırması, sayısal tiplerde ise sadece bir kez karşılaştırılması yeterlidir.



18. Char/nchar yerine mümkün olduğunca varchar/nvarchar kullanın, çünkü birincisi, daha uzun alan depolama alanı depolama alanı tasarrufu sağlayabilir, ikincisi ise sorgular için nispeten küçük bir alanda arama verimliliği açıkça daha yüksektir.



19. Hiçbir yerden * seç * kullanma, "*" yerine belirli bir alan listesi ile yer değiştir ve kullanılmayan alanları geri gönderme.



20. Geçici tablolar yerine tablo değişkenleri kullanmayı deneyin. Tablo değişkeni büyük miktarda veri içeriyorsa, indeksin çok sınırlı olduğunu (sadece birincil anahtar indeks) unutmayın.



21. Sistem tablosu kaynaklarının tüketimini azaltmak için sık sık geçici tablolar oluşturup silmekten kaçının.

22. Geçici tablolar kullanılamaz değildir ve uygun şekilde kullanmak, örneğin büyük bir tabloda veya yaygın kullanılan bir tabloda bir veri setine tekrar tekrar referans vermeniz gerektiğinde bazı rutinleri daha etkili hale getirebilir. Ancak, tek seferlik etkinlikler için en iyisi bir dışa aktarma tablosu kullanmaktır.



23. Geçici bir tablo oluştururken, aynı anda eklenen veri miktarı büyükse, hızın artmasına neden olmak için çok sayıda logun oluşmasını önlemek için create table yerine select into kullanabilirsiniz; Veri miktarı büyük değilse, sistem tablosunun kaynaklarını kolaylaştırmak için önce tablo oluşturup sonra eklemelisiniz.



24. Geçici bir tablo kullanılıyorsa, depolanan prosedürün sonunda tüm geçici tabloları açıkça sildiğinizden emin olun, önce tabloyu kısaltın, ardından tabloyu kaldırın; böylece sistem tablosu uzun süre kilitlenmez.



25. İmleci kullanmaktan kaçınmaya çalışın, çünkü imlecin verimliliği düşük, eğer imlecin işlettiği veri 10.000 satırı azarsa, yeniden yazmayı düşünmelisiniz.



26. Sorunları çözmek için küme tabanlı çözümler, genellikle daha etkili olan imleç tabanlı veya geçici tablo yöntemleri kullanmadan önce aranmalıdır.



27. Geçici tablolar gibi, imleçler de kullanılamaz değildir. Küçük veri kümeleri için FAST_FORWARD imleci kullanmak, özellikle ihtiyacınız olan veriyi almak için birkaç tabloya başvurmanız gerekiyorsa, diğer satır satır işleme yöntemlerinden genellikle daha iyidir. Sonuç kümesinde "total" içeren rutinler genellikle imleciyle yürütülenlerden daha hızlıdır. Geliştirme süresi izin verirse, hem imleç tabanlı hem de küme tabanlı yöntemler hangisinin daha iyi çalıştığını görmek için denenebilir.



28. Tüm depolanmış prosedürlerin ve tetikleyicilerin başında SET NOCOUNT AÇIK, sonunda NOCOUNT'u KAPAT. Depolanan prosedürün ve tetikleyicinin her ifadesi yürütüldükten sonra istemciye DONE_IN_PROC mesaj göndermeye gerek yoktur.



29. Büyük işlem işlemlerinden kaçınmaya çalışın ve sistemin eşzamanlılık kapasitesini iyileştirin.



30. Büyük veriyi müşteriye geri göndermekten kaçınmaya çalışın; veri hacmi çok büyükse, ilgili talebin makul olup olmadığını düşünmelisiniz.




Önceki:Xen 4.1.2 sanal makine ile CentOS 6.5 sistemi
Önümüzdeki:SQL Server sorgu hızını nasıl iyileştirebilirim?
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com