SQL Server sorgularının bellekte çalışıp çalışmadığını veya diske gidip gitmediğini belirlemenin bir yolu var mı?


13

Bugün bir uygulamada uzun süren bir işlem içinde tekrar tekrar çağrılan bir dizi saklı yordamla karşılaştım. Her prosedürde, bazıları döngüler içinde olmak üzere birden fazla farklı seçme ifadesi buldum; Şaşırtıcı olmayan bir şekilde, şu anda kullanılan bu rutinlerin, sezginin birkaç saniye içinde tamamlanmasını beklediği zaman çalışması birkaç dakika sürer.

Bu prosedürler yazılırken performansın dikkate alınmadığı oldukça açık görünmektedir, sadece "iyi bir fikir değil" olan birçok şey vardır.

Veri alırken her satırı işlemek satır başına 300 ms sürüyor, bu nedenle nispeten küçük içe aktarma işlemlerinin işleme koyulması birkaç dakika sürüyor.

Bununla birlikte, prosedürlerde yer alan tablolar çoğunlukla oldukça küçüktür. Bence, bu tabloların hepsi bellekte tamamen ikamet ediyorsa, belki de bunlardan herhangi birini yeniden yazarak kazanılabilecek çok fazla şey yoktur.

Ben belirlemeye çalışıyorum .... Bu açıkça verimsiz kod için, ne kadar gerçek bir etkisi sahip? Düzeltmeye değer mi?

Yani soru şu:
- hangi tabloların tamamen belleğe sabitlendiğini belirlemenin bir yolu var mı?
- özellikle pahalı kısımları bulmak için iç içe saklı yordamları izlemek amacıyla izlemeyi açmanın bir yolu var mı?

Not: Bu SQL Server 2008 R2'de

Yanıtlar:


12

Toplam mantıksal okumaları ve toplam fiziksel okumaları görmek için bu iki sorgudan birini kullanabilirsiniz.

SELECT  DB_NAME(st.dbid) Db,
        OBJECT_NAME(st.objectid, st.dbid) Prc,
        qs.execution_count,
        qs.total_logical_reads,
        qs.total_physical_reads,
        qs.statement_start_offset,
        qs.statement_end_offset,
        st.text
FROM    sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;

SELECT  DB_NAME(database_id) Db,
        OBJECT_NAME(object_id, database_id) Prc,
        execution_count,
        total_logical_reads,
        total_physical_reads
FROM    sys.dm_exec_procedure_stats ps;

Birincisi bunu ifade ile yıkar, ikincisi tüm prosedürde sayılır.

Fiziksel okumalar diske, mantıksal okumalar belleğe karşı okunur. Bunu, sisteminizdeki en pahalı prosedürlerin veya ifadelerin hangileri olduğunu bulmak ve bunları ayarlamaya çalışmak için kullanabilirsiniz.

Mantıksal okumaların fiziksel okumalardan önemli ölçüde daha ucuz olmasına rağmen, yine de pahalıdır, bu nedenle bunların sayısını azaltmak (örneğin uygun bir dizin ekleyerek) sorgularınızın çok daha hızlı çalışmasını sağlayabilir.

Yukarıdaki DMV'lerde de ilginç bulabileceğiniz birçok ek sütun var.


Bir dizin mantıksal okumaları azaltmaya nasıl yardımcı olur?

SQL Server'da tüm veriler 8KB boyutunda bloklar halinde düzenlenmiştir. Bu bloklara "sayfa" denir.

Her tablo, pata sayfalarının yanı sıra tablonun yapısı hakkında bilgi içeren "meta" sayfaları içerir. Hiçbir dizin yoksa ve SELECT * FROM tbl WHERE Id = 7SQL Server gibi bir sorgu çalıştırırsanız tüm tabloyu bu veya bu satırları aramak zorunda. Böylece her seferinde tek bir sayfada okur, WHEREyan tümceye uyan satırları belirlemek için her sayfadaki tüm satırlarda dolaşır. Bu nedenle, tablonun saklanması için 1.000.000 sayfa gerekiyorsa, bu sorgu yürütmek için 1.000.000 mantıksal okuma alır.

Bir dizininiz varsa, SQL Server verileri mantıksal olarak sayfalar içinde sıralar ve sayfalar arasında bağlantılı bir liste oluşturur. Bu, a ile sorguların ORDER BYpahalı bir sıralama işlemi olmadan yürütülmesini sağlar. Ama daha da önemlisi, sıralama, SQL Server tabloya bir B + Ağacı ekler . B + Ağacı, belirli bir anahtar kelimeyi aramanın doğrudan anahtar kelimeyi içeren sayfaya atlamama izin verdiği bir kitaptaki dizine benzer bir yapıdır. Tipik bir kitap sadece bir endeks seviyesine sahipken, bir B + Ağacı çoklu olabilir. Dizinin kendisinin birden çok sayfa uzunluğunda olduğu büyük bir kitap düşünün. Böyle bir durumda, bize hangi sayfada başlayan dizin kelimelerinin Sbulunacağını söyleyen ek bir dizin katmanı eklemek mantıklıdır .

B + Ağaçları, dizinde herhangi bir kaydın dizin düzeyi başına bir sayfa okunarak bulunabilmesini sağlarken mümkün olduğunca az seviyeye sahip olacak şekilde optimize edilmiştir. Sıralı WHERE Id = 7bir dizine sahip olduğunuzda yukarıdaki sorguyu varsayalım Id. Dizinin 5 seviyesi olduğunu varsayalım. Şimdi, bu sorgu ile eşleşen tüm kayıtları bulmak için dizin düzeyi (5 sayfa) başına bir sayfa okumak zorunda. Bu "dizin arama" denir. Faturaya uyan birden fazla kayıt varsa hepsini almak için bir süre sıralı dizini takip etmek zorunda kalabilirim. Ama diyelim ki sadece bir kayıt var.

Yani, indeksi çalıştırmadan bu sorgu 1.000.000 okuma gerektiriyor, indes ile 5 okuma gerekiyordu. Mantıksal bir okuma bellek içi bir işlem olmasına rağmen, hala önemli bir maliyet vardır - aslında yukarıdaki gibi önemsiz bir sorguda en pahalı işlemdir. Dolayısıyla, 200.000 faktörün ihtiyaç duyduğu mantıksal okuma miktarını azaltmak, sorgunuzu benzer bir faktörle hızlandıracaktır.

Bu nedenle, mantıksal bir okuma tablo taramasına eşdeğer değildir, ancak tablo taraması bir dizin aramasından çok daha mantıklı okumalara neden olur.


> "... bunların sayısını azaltmak (örneğin uygun bir dizin ekleyerek) sorgularınızın çok daha hızlı çalışmasını sağlayabilir." Dizin eklemenin mantıksal okumaları nasıl azaltacağını (?) Açıklayabilir misiniz? Mantıksal okuma bir tablo taramasıyla eşanlamlı mı?

1
Yukarıdaki cevabıma bir açıklama eklendi.
Sebastian Meine

Teşekkürler. İlgili tüm tablolarda uygun indekslerin olduğu varsayıldığında bile ... Bellekte sabitlenen bir tablo ile diskten okunan (her iki senaryoda da aynı indeksleri varsayalım) arasında hala büyük bir performans farkı olduğunu düşünürüm ... kelimeler, endeksler eklemek daha az RAM ile bir makinede daha az belleğe sahip bir makineye göre% performans artışı daha az alacak .... doğru?

1
fiziksel disk erişimi, bellek erişiminden daha pahalı büyüklük sırasına sahiptir. Bundan kaçınmak için önlem almak sizi çok ileri götürecektir. Sorgu ayarı yapılırken hala mantıklı okuma sayısına bakmanız gerekir. Bunları düşük tutmak, fiziksel okumaları düşük tutacaktır. Ayrıca, sayfaların önbellekten çıkarılması gerekmediği için gerekli fiziksel okumaları daha da azaltabilirsiniz.
Sebastian Meine

2
Küçük nitpick - Bence sayfalar 8 kb :-). İyi cevap.
onupdatecascade

3
  • özellikle pahalı kısımları bulmak için iç içe saklı yordamları izlemek amacıyla izlemeyi açmanın bir yolu var mı?

SQL Profiler'ı kullanabilirsiniz. İzi başlattığınızda, RPC Tamamlandı, SP Başlatma, SP StmtStarting ve SP StmtCompleted'i seçmelisiniz (aşağıdaki resme bakın)

resim açıklamasını buraya girin

Bu, saklı yordamlar içinde çalışan her sorguyu görmenizi sağlar. Yuvalanmış bir saklı yordamın kaç kez çağrıldığını görmenizi sağlar. İz bittiğinde, kaydetmelisiniz. Ardından, yeniden açın ve bundan sonra, soruna neden olan sorguları bulmak için ("Sütun filtreleri" düğmesiyle) filtreleyebilirsiniz. (ör. x okumadan fazla veya x saniyeden fazla süren sorgular (süre) ...)

Size gösterdiğim profil oluşturucu seçenekleri de çok yardımcı olan yürütme planını gösteriyor.


1

Genel bir sorgu optimizasyonu sorusu gibi görünüyor. Açıklamanızdan:

  1. Satır satır işlem yapıp yapmadığını görmek için koda bakın. Eğer öyleyse, genellikle aynı mantık kümeler kullanılarak (aynı anda işlenmiş birden çok satır) uygulanarak büyüklük iyileştirme siparişleri yapılabilir. Diğer bir deyişle, "her satırın üzerindeki döngü" gibi davranıyorsa, "tüm satırları işlemek" olarak değiştirin. SQL üstünlük iyileştirici daha olası yöntemleri arasından seçim yapabilirsiniz, çünkü potansiyel olarak paralellik kullanmak Şuna bir kaldırmak sürü tek satırda-at-a-time gelen yükü.
  2. Daha sonra, işi destekleyen dizinler olduğundan emin olun. Çoğunlukla, yine, büyüklük iyileştirme emirleri, doğru endekslerle değil, doğru olabilir. Bu, bellekte ve disk erişiminde geçerlidir. Büyük bir veri kümesinde uygun dizinler yoksa, işlemler RAM'deki her şeyle saatlerce sürebilir.
  3. Sonra, set mantığı ve dizinleri yerinde olduğunda, etkilenen veri sayfalarının belleğe sığıp sığmadığına bakarım. Bu noktada, hala çok fazla disk erişimi varsa, fiziksel okumalara ve disk etkinliğine bakmak mantıklıdır, çünkü optimizasyondan elde edilen tüm büyük kazanımlar ilk iki adımda yapılır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.