sql server

Să crea un tabel partiționat simplu:
crea pf funcția de partiție (int) ca interval de valori (0, 10, 100)
a crea partiție schema ps ca partiție PF toate la ([primar])
crea tabelul t (a int, b int) pe ps (a)
Acest script creează un tabel cu patru secțiuni. Identificatorii SQL Server valori atribuite fiecăruia dintre cele patru secțiuni așa cum se arată în tabelul de mai jos:
| -Nested Buclele (interioară se alăture, REFERINȚE EXTERIOARE: ([PtnIds1004]) partition ID: ([PtnIds1004]))
...... | -Constant Scan (VALORI: (((1)), ((2)), ((3)) ((4))))
. ...... | -Table Scan (OBIECT: ([t]))
secțiuni de filtrare statice
Luați în considerare următoarea interogare:
selectați * de la t în cazul în care un <100
| -Nested Buclele (interioară se alăture, REFERINȚE EXTERIOARE: ([PtnIds1005]) partition ID: ([PtnIds1005]))
. ...... | -Constant Scan (VALORI: (((1)), ((2)), ((3))))
. ...... | -Table Scan (OBIECT: ([t]), unde: ([t] [a].<(100)) PARTITION ID:([PtnIds1005]))
În cazul în care, ca urmare a unei filtrări statice va fi exclus toate, dar o singură partiție, nu avem nevoie de operatori «Constant scanare» și «Bucle imbricate Participați»:
selectați * de la t în cazul în care un <0
| -Table Scan (OBIECT: ([t]), unde: ([t] [a].<(0)) PARTITION ID:((1)))
secțiuni dinamice de filtrare
În unele cazuri, SQL Server nu poate stabili că, la momentul compilării compoziției secțiunilor vizualizate nu se va schimba, dar este clar pentru el că unele secțiuni pot fi eliminate.
selectați * de la t în cazul în care un <@i
| -Nested Buclele (interioară se alăture, REFERINȚE EXTERIOARE: ([PtnIds1004]) partition ID: ([PtnIds1004]))
. ...... | -Filter (UNDE: ([PtnIds1004]<=RangePartitionNew([@i],(0),(0),(10),(100))))
....... | | -Constant Scan (VALORI: (((1)), ((2)), ((3)), ((4))))
. ...... | -Table Scan (OBIECT: ([t]), unde: ([t] [a].<[@i]) PARTITION ID:([PtnIds1004]))
Aceasta este o interogare parametrizată. Din moment ce nu am știut înainte de executarea valorii parametrului (ceea ce eu folosesc constant ca parametru în aceeași Butch nu se schimba status quo-ul), apoi compila este imposibil să se determine valoarea unui identificator pentru secțiunea «Constant Scanare» operator. Este posibil să aveți pentru a vizualiza numai secțiunea 1, sau va fi secțiunile 1 și 2, și așa mai departe. Prin urmare, această declarație conține toate cele patru secțiuni ale ID-ul, și vom utiliza filtrarea secțiunile ID-urile în timpul rulării. Noi numim acest lucru „Secțiunile de filtrare dinamică» (Eliminare dinamic Partition).
secțiunea de filtrare compară fiecare identificator c rezultat al funcției speciale «RangePartitionNew». Această funcție evaluează rezultatele aplicării funcției de partiționare la valoarea parametrului. Argumentele acestei funcții (de la stânga la dreapta) sunt:
- Valoarea (în acest caz, opțiunea @i), dorim să afișeze pe secțiunea ID;
- flag boolean care indică dacă funcția de partiționare a valorilor la limită emisiunilor rămase (0) sau dreapta (1);
- secțiuni valori la limită (în acest caz 0, 10 și 100).
În unele cazuri, instrumentul de optimizare este deja la momentul compilarii poate determina că vom scana doar o singură secțiune, chiar dacă aceasta nu poate determina ceea ce a fost. De exemplu, în cazul în care predicatul de interogare utilizează echivalența cheie de partiționare, atunci știm că doar o singură secțiune poate îndeplini această condiție. Prin urmare, în ciuda faptului că a trebuit să fie un secțiuni de filtrare dinamice, nu avem nevoie de operatori «Constant Scanare» și «Bucle imbricate Participați». exemplu:
selectați * de la t în cazul în care a = @i
| -Table Scan (OBIECT :. ([T]), unde: ([t] [a] = [@ i]) PARTITION ID: (RangePartitionNew ([@ i], (0) (0) (10 ), (100))))
Combinația de secțiuni de filtrare statice și dinamice
SQL Server poate combina secțiuni de filtrare statice și dinamice într-un plan de interogare:
selectați * de la t, unde a> 0 și <@i
| -Nested Buclele (interioară se alăture, REFERINȚE EXTERIOARE: ([PtnIds1004]) partition ID: ([PtnIds1004]))
...... | -Filter (UNDE: ([PtnIds1004]<=RangePartitionNew([@i],(0),(0),(10),(100))))
...... | | -Constant Scan (VALORI: (((2)), ((3)) ((4))))
...... | -Table Scan (OBIECT: ([t]), unde: ([t] [a].<[@i] AND [t].[a]>(0)) PARTITION ID: ([PtnIds1004]))
Rețineți că, în urmă sens este prezent static secțiune filtrare ID = 1 folosind «Constant Scan», și prezintă, de asemenea, un filtru dinamic pentru celelalte secțiuni, definite de predicate.
Puteți apela în mod explicit o RangePartitionNew funcție, folosind partiția $:
selectați *, partition.pf $ (a) de la T
| -Compute scalar (DEFINE: ([Expr1004] = RangePartitionNew ([t] [a], (0), (0), (10), (100)))).
...... | -Nested Buclele (interioară se alăture, REFERINȚE EXTERIOARE: ([PtnIds1005]) partition ID: ([PtnIds1005]))
......... .. | -Constant Scan (VALORI: (((1)), ((2)), ((3)) ((4))))
......... .. | -Table Scan (OBIECT: ([t]))
O trăsătură distinctivă a acestui plan de interogare este aspectul operatorului Compute scalar.