2013-04-14 14 views
5

Empno'da kümelenmiş benzersiz bir dizin içeren tablo yapısı.Bu sorgu, yürütme planında iki katılma işleçlerini nasıl oluşturur?

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL, 
    [ENAME] [varchar](10) NULL, 
    [JOB] [varchar](9) NULL, 
    [MGR] [int] NULL, 
    [HIREDATE] [datetime] NULL, 
    [SAL] [int] NULL, 
    [COMM] [int] NULL, 
    [DEPTNO] [int] NULL 
) ON [PRIMARY] 

sorgu

SELECT sal,sum(sal) over(PARTITION BY empno) 
FROM emp 

Sorgu Planı pencereli agrega ile

enter image description here

cevap

3

Planları normal olarak bir ortak alt sentezleme makarasını kullanmak. Planın bu tür bir iyi yazma yukarı

Partitioning and the Common Subexpression Spool tablosu aşağıdaki satırları

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL, 
    [SAL] [int] NULL) 

INSERT INTO [dbo].[EMP] 
VALUES (1,1), 
     (1,2), 
     (1,3), 
     (1,4), 
     (2,1), 
     (2,2) 

Tesiste 2 ayrı EMPNO değerlerle toplam 6 satır var olduğunu varsayalım burada. Yayımlanan gerçek satır sayısını gösteren gerçek yürütme planı aşağıdadır.

enter image description here

planının en az kademeli bir yineleyici yeni bir bölümü başlangıç ​​(yani empno değişti) olduğunda gösteren geçmesine satır için bir bayrak ekler.

Makara hemen soluna (birincil biriktirme) bölüm yineleyiciden bir satırda bir satır alır ve tempdb'deki bir çalışma tablosuna ekler. Bayrak, yeni bir grubun başladığını söyleyerek, iç içe döngüler operatörünün üst girişine bir satır döndürür.

Bu işlem, akış çizelgesinin çalışma tablosundaki satırlar üzerinden çağrılmasına neden olur (planda ikincil biriktirme), SUM([SAL]) hesaplanır ve bu değer çalışma tablosundaki satırlarla tekrar birleştirilir (üçüncü biriktirme işleci Plan) çalışma tablosundan önce yeni gruba hazır kesilir.

temel bölüm makara yayılan gerçek satır sayısı 3 (grup sayısı artı bir) OVER maddesi ile

0

Agrega fonksiyonları olarak gösterilmiştir nedenle işlenmiş son grup elde etmek için bir boş satır yayar can Bu nedenle yeniden yazılmalıdır: tablo AS x INNER JOIN (SELECT bölüm sütunları, AggregateWithoutOverClause (...) ... FROM ...) AS y ON x.PartitionColumns = y.PartitionColumns (bölüm sütunları zorunlu ise - NOT NULL).

Örnek:

SET STATISTICS IO ON; 
SET NOCOUNT ON; 

-- OP's query 
SELECT sal,sum(sal) over(PARTITION BY empno) 
FROM emp; 

-- Reqwriten query 
SELECT a.sal, b.SumSal 
FROM emp a 
INNER JOIN (SELECT EMPNO, SUM(sal) AS SumSal FROM emp GROUP BY EMPNO) b ON a.EMPNO = b.EMPNO; 

Sonuçlar:

sal   
----------- ----------- 
1   10 
2   10 
3   10 
4   10 
1   3 
2   3 

Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'EMP'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

sal   SumSal 
----------- ----------- 
1   10 
2   10 
3   10 
4   10 
1   3 
2   3 

Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'EMP'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Yürütme planları: enter image description here

Bu yalnızca son katılmak açıklayacağız: enter image description here

'un açıklaması için ilk olarak ürün grubuna "/ Grup Başına İşleme/Partitioning and the Common Subexpression Spool" bölümünde ulaşabilirsiniz.