İSTATİSTİK IO siparişine karşı yürütme planı


20

SQL Server grafik yürütme planları sağdan sola ve yukarıdan aşağıya okunur. Ürettiği çıktı için anlamlı bir düzen var mı SET STATISTICS IO ON?

Aşağıdaki sorgu:

SET STATISTICS IO ON;

SELECT  *
FROM    Sales.SalesOrderHeader AS soh
        JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID
        JOIN Production.Product AS p ON sod.ProductID = p.ProductID;

Bu planı oluşturur:

Grafik uygulama planı

Ve bu STATISTICS IOçıktı:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 3, read-ahead reads 1277, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 689, physical reads 1, read-ahead reads 685, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Product'. Scan count 1, logical reads 15, physical reads 1, read-ahead reads 14, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Tekrar ediyorum: ne veriyor? STATISTICS IOÇıktı için anlamlı bir emir var mı veya bazı keyfi emir kullanılıyor mu?

Yanıtlar:


9

Çeşitli sorgularla ilk oynamam hiç bir desen önermedi, ancak daha yakından dikkat ederek seri planlar için öngörülebilir gibi görünüyor. @ AustinZellner'ın bahsettiği KB314648'de sona erdi :

Her SQL Server bağlantısı, bağlantıya özgü durum bilgilerini tutan ilişkili bir işlem durumu yapısına (PSS) sahiptir. Sysprocesses sistem tablosundaki her benzersiz sunucu işlem kimliği (SPID) farklı bir PSS'yi temsil eder ve sysprocesses sanal tablosundaki bilgiler bu durum bilgilerine bir "görünüm" dür.

Ve sorunuzla ilgili bölüm:

İSTATİSTİK IO bir bağlantı için etkinleştirilirse, SQL Server sorgu yürütme sırasında IO bilgilerini tablo başına izlemek için bir dizi ayırır. SQL Server sorguyu işlerken, bu mantıksal G / Ç isteğinin fiziksel G / Ç ile sonuçlanıp sonuçlanmadığıyla birlikte, bu dizideki uygun tablonun girişindeki bir sayfa için her mantıksal isteği kaydeder. SQL Server, sorgunun sonunda 3615 hata iletisindeki bilgileri döndürür.

Gözlemlenen davranış, diziye, ES'nin oluşturulduğu sırayla, esasen fiziksel bir işleçteki GetNext () sonucunun yapıldığını gösterir. İstatistik çıktısındaki son girdi, bir ES'nin kaydedilmesi ile sonuçlanan ilk tablodur, ilk girdi son tablodur. Öncelikle hangi paralel görevin planlanacağına dair bir garanti olmadığından, paralel planlar için siparişin öngörülebilir olmadığını (veya daha azını) tahmin ediyorum.


5

Bana plandaki veri okuma erişiminin tam tersi gibi görünüyor. Karma tablonuzu (çalışma tablosu) oluşturmak için planınız önce Ürün tablosundan okuyacaktır. Daha sonra SalesOrderHeader'dan okur ve bunları birleştirme birleştirme işleciyle birleştirerek SalesOrderDetail oluşturur. Ardından çalışma masası, orijinal Ürün satırlarını birleştirme birleşimindekilerle eşleştirmek için sondan okunur. İstatistik çıktınızda listelendikleri tam tersi sıra.

Ancak, bunu belirten herhangi bir belgenin farkında değilim. Hangi sırada tablo erişiminin gerçekleştiğinden emin olmak istiyorsanız, yürütme planını okuyun.


Bu durumda tersi bir sırada gelir, diğerlerinde farklıdır. Genel olarak halka açık olmayan motor hakkında samimi bilgi olmadan keşfedilebilecek bir emir olmadığından şüpheleniyorum.
Jeremiah Peschka

Farklı bir sırada nerede olduğuna dair bir örneğiniz var mı?
Sebastian Meine

SELECT * FROM Sales.SalesOrderHeader AS soh JOIN Satış.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID LEFT JOIN Satış.SalesPerson AS sp ON soh.SalesPersonID = sp.BusinessEntityID LEFT JOIN Person.Person AS sp2 soh.SalesPersonID = sp. .ŞirketEdityID Üretime KATILIR. Sod ÜZERİNDE Ürün AS.Ürün Kimliği = p.Ürün Kimliği;
Jeremiah Peschka

Paralellik olmadığı sürece gözlemlerim geçerli. Seri planlarını görmek için sorgunuzu bir TOP (100), TOP (1000) ve TOP (10000) ile çalıştırabilirsiniz. Ancak, TOP (100000) veya TOP olmadan iki farklı paralel plan alırsınız ve orada tüm bahisler kapalı gibi görünür.
Sebastian Meine

3

Yönetimden daha fazla programlama yaptığımda her zaman bir emir olduğunu düşündüm. Birkaç infaz planından geçtim ve inançlarımı tekrar kontrol ettim.

İşte gördüğüm:

Çok adımlı bir sorguda (saklanan yordamlarımızın çoğu gibi), sıra sorguların çalıştırıldığı fiziksel sırayı yansıtır.

Belirli bir sorgu için, istatistikler ES sağdan başlayarak ve soldan çalışan istatistikleri raporlayarak yürütme planını yansıtıyor gibi görünüyor

Belki de bu her şeyden çok bir gözlemdir.


2
Bunda bir şey olabilir. Tabloların sırasını SELECT COUNT(*) FROM HumanResources.EmployeeDepartmentHistory UNION ALL SELECT COUNT(*) FROM HumanResources.Employee UNION ALL SELECT COUNT(*) FROM HumanResources.Departmenttersine çevirmek de IOçıktıyı tersine çevirir, ancak çalışma tablosunun neden örnekte ilk olarak rapor edildiğini açıklamaz.
Martin Smith

@MartinSmith Evet, çalışma masası sınırlı bakış açımdan joker bir kart.
RLF

0

Bu yüzden istatistiklerin sonuçlarının çalışma zamanında gerçekte ne olduğuna dair daha fazla bilgi verdiğini, çünkü hesaba katacağını ve önbellek yerine diskten okuma ihtiyacından etkileneceğini ve aynı zamanda hesabın izinlerinden de etkileneceğini düşünüyorum. sorgu altında çalıştırılıyor. Tablonun istatistik dönüşündeki konumu, profiler tarafından dikkate alınanlardan başka faktörlerden etkilenir.

İşte fikir ve bazı örnekler veren bir kb makalesi: http://support.microsoft.com/kb/314648


1
Soru STATISTICS IOgenel olarak çıktı ile ilgili değildir . Sadece çeşitli tabloların okumalarının raporlanma sırası ile ilgilidir. Bağlantında bunun hakkında hiçbir şey göremiyorum.
Martin Smith
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.