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.