Sanırım bunun için kısmi bir açıklama yapabilirim ama lütfen onu vurmaktan veya alternatifler göndermekten çekinmeyin. @MartinSmith, yürütme planında TOP'un etkisini vurgulayarak kesinlikle bir şeye bağlıdır.
Basitçe söylemek gerekirse, 'Gerçek Satır Sayısı' bir operatörün işlediği satırların sayısı değil, operatörün GetNext () yönteminin kaç kez çağrıldığıdır.
Alındığı BOL :
Fiziksel operatörler başlatılır, veri toplar ve kapanır. Özellikle, fiziksel operatör aşağıdaki üç yöntem çağrısına cevap verebilir:
- Init (): Init () yöntemi, fiziksel bir operatörün kendisini başlatmasına ve gerekli veri yapılarını ayarlamasına neden olur. Fiziksel işleç birçok Init () çağrısı alabilir, ancak fiziksel bir işleç yalnızca bir tanesini alır.
- GetNext (): GetNext () yöntemi, fiziksel bir operatörün ilk veya sonraki veri satırını almasına neden olur. Fiziksel işleç sıfır veya çok sayıda GetNext () çağrısı alabilir.
- Close (): Close () yöntemi, fiziksel bir operatörün bazı temizleme işlemleri gerçekleştirmesine ve kendini kapatmasına neden olur. Fiziksel bir operatör yalnızca bir Close () çağrısı alır.
GetNext () yöntemi bir veri satırı döndürür ve çağrılma sayısı SET STATISTICS PROFILE ON veya SET STATISTICS XML ON kullanılarak üretilen Showplan çıktısında ActualRows olarak görünür.
Tamlık uğruna, paralel operatörler üzerinde küçük bir arka plan yararlıdır. İş, yeniden bölümleme akışı veya dağıtım akışı operatörleri tarafından paralel bir plandaki birden fazla akışa dağıtılır. Bunlar, dört mekanizmadan birini kullanarak satırları veya sayfaları iş parçacıkları arasında dağıtır:
- Hash, satırları, satırdaki sütunların karmasını temel alarak dağıtır
- Round-robin , bir döngüdeki iş parçacığı listesinde yineleme yaparak satırları dağıtır
- Yayın tüm sayfaları veya satırları tüm dizilere dağıtır
- Talep bölümleme sadece taramalar için kullanılır. İş parçacıkları döner, operatörden bir veri sayfası ister, işler ve tamamlandığında başka bir sayfa ister.
İlk dağıtım akışı operatörü (planın en sağında), sabit bir taramadan kaynaklanan satırlarda talep bölümleme kullanır. Toplam 10 'Gerçek Satır' için GetNext () 6, 4 ve 0 kez çağıran üç iş parçacığı vardır:
<RunTimeInformation>
<RunTimeCountersPerThread Thread="2" ActualRows="6" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="1" ActualRows="4" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>
Bir sonraki dağıtım operatörünün tekrar üç iş parçacığı var, bu sefer GetNext () 'e 50, 50 ve 0 çağrı ile toplam 100
<RunTimeInformation>
<RunTimeCountersPerThread Thread="2" ActualRows="50" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="1" ActualRows="50" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>
Nedeni ve açıklaması muhtemelen bir sonraki paralel operatörde belirir.
<RunTimeInformation>
<RunTimeCountersPerThread Thread="2" ActualRows="1" ActualEndOfScans="0" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="1" ActualRows="10" ActualEndOfScans="0" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>
Şimdi GetNext'e () 10 çağrı yapmayı beklediğimiz 11 çağrı var.
Düzenleme: 2011-11-13
Bu noktada sıkışmış, ben de ahbap ile cevapları hawking gitti kümelenmiş indeksi ve @MikeWalsh nazik yönettiği @SQLKiwi burada .