Professional Documents
Culture Documents
ExecutionPlan II
ExecutionPlan II
osnovne upite
Lekcija
ikona=operator
Lista operatora
Select (Result) RID Lookup
Clustered Index Scan Filter
NonClustered Index Scan Lazy Spool
Clustered Index Seek Spool
NonClustered Index Seek
Eager Spool
Hash Match
Nested Loops Stream Aggregate
Merge Join Distribute Streams
Sort Repartition Streams
Key Lookup Gather Streams
Compute Scalar Bitmap
Constant Scan Split
Table Scan
Clustered Index Scan
Primer:
SELECT ct.*
FROM Person.ContactType AS ct;
Index Scan se deava kada indeks postoji, ali optimizer odlui da ima
suvie redova da vrati, da je bre da skenira sve vrednosti indeksa
nego da koristi kljueve tog indeksa
Ako vidite Index Scan u svom planu, treba se zapitati da li se vraa vie
redova nego to je potrebno tj. da li treba podesiti WHERE klauzulu
Primer:
SELECT ct.*
FROM Person.ContactType AS ct
WHERE ct.ContactTypeID = 7
Primer:
SELECT ct.ContactTypeId
FROM Person.ContactType AS ct
WHERE Name LIKE 'Own%'
Neklasterovan indeks smeta samo kljueve, ali ne i podatke
U ovom sluaju imamo pokrivajui indeks zato to se dve kolone koje se
koriste u upitu nalaze u samom indeksu: name kao klju i Id kao
vrednost tog kljua
Jo dodatnih informacija u odnosu na Tool Tip se moe dobiti desnim
klikom na Index Seek I selekcijom Properties iz drop-down menija
Key Lookup
SELECT object_name(sys.tables.object_id)
FROM sys.indexes
INNER JOIN sys.tables
ON sys.indexes.object_ID=sys.tables.OBJECT_ID
WHERE sys.indexes.type=0
Key Lookup
Prostatic Output List i Seek Predicates iz Tool Tipa za Index Seek i za Key
Lookup
U Output List se vide kolone vracene iz indeksa
Primetiti da je optimizator modifikovao sam upit!
U Output Listi za operator Key Lookup moemo videti I kolonu
Person.NameStyle koja je falila jo
Nested Loops spajanje je potrebno da bi se kombinovali podaci iz Index Seek
i Key Lookup
Ukoliko Key Lookup nije potreban, onda se ne pojavljuje ni Nested Loops
Ukoliko tabela nema klasterovan index, operator RID Lookup bi se koristio
umesto Key Lookup
RID je identifikator reda
Table Scan
Primer:
Nested Loops Join uzima skup podataka (outer set) i poredi ga,
red po red, sa drugim skupom podataka (inner set)
Koristi se kada je inner set mali, a outer set je indeksovan
svejedno da li je mali ili veliki
U tom sluaju je ovo spajanje izuzetno efikasno
Pogledajmo property od operacije Clustered Index Seek nad
Business Entity tabelom (kota 9%)
Nested Loops
Nested Loops
Tabela Employees se skenira a tabela
BusinessEntityAddress se pretrauje
(seek)
Broj redova je bio mali, tako da je
operacija vrlo efikasna
Compute Scalar
Nije vrsta spajanja, ali se nalazi u planu izvravanja za prethodni
primer
Odnosi se na p.LastName + ', ' + p.FirstName u upitu
Pogledati u Properties ovog operatora gde se nalazi opis
izraunavanja
Operacija daje skalarnu vrednost koja je obino rezultat nekog
izraunavanja
Compute Scalar
Troak je trivijalan
Pogledati na elipsu
Merge Join
Primer:
SELECT c.CustomerID
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID = oh.SalesOrderID
JOIN Sales.Customer c
ON oh.CustomerID = c.CustomerID
Merge Join
Primer:
SELECT e.[Title], a.[City],
c.[LastName] + ',' + c.[FirstName] AS EmployeeName
FROM [HumanResources].[Employee] e
JOIN [HumanResources].[EmployeeAddress] ed
ON e.[EmployeeID] = ed.[EmployeeID]
JOIN [Person].[Address] a
ON [ed].[AddressID] = [a].[AddressID]
JOIN [Person].[Contact] c
ON e.[ContactID] = c.[ContactID]
WHERE e.[Title] = 'Production Technician - WC20' ;
Primer:
SELECT Shelf
FROM Production.ProductInventory
ORDER BY Shelf
Primer:
SELECT *
FROM Production.ProductInventory
ORDER BY ProductID
Ako pogledamo execution plan, videemo da nema Sort
operatora
Hash Match (aggregate)
Constant Scan kreira red da bi sledei operatori imali gde da smeste podatke
Compute Scalar poziva funkciju getidentity (prva operacija u insertu)
Sledea Scalar operacija kreira serije prostora za sledee podatke (pogledati Property)
Sve to se prosleuje Clustered Index Insert operatoru, gde se najvei deo plana
realizira
Izlaz iz njega je ID koji se prosleuje Nested Loop joinu koji dobija podatke od
Clustered Index Seek operatora nad StateProvince tabele zbog provere
referencijalnog integriteta nad stranim kljue, StateProvinceId
Assert operator proverava da li je zadovoljen referencijalni integritet
Donja grana predstavlja podatke koji se dodaju u kolonu tipa spatial data (ne radimo)
UPDATE
UPDATE [Person].[Address]
SET [City] = 'Munro', [ModifiedDate] = GETDATE()
WHERE [City] = 'Monroe' ;
Non clastered Index Scan dohvata sve potrebne redove iz indeksa da bi pronaao sve
redove koji zadovoljavaju where klauzulu
Moda trebaju dodatni indeksi?
Top operator (nije korien)
Eager Spool olakava rollback operaciju (smeta objekte koji se auriraju u temp
objekat)
Compute Scalar procenjuje izraze i generie izraunate skalarne vrednosti (npr.
Getdate())
ClusteredIndex Update identifikuje redove i aurira ih (vrednosti su deo
klasterovanog indeksa)
Obratiti panju zbog performanse kako se redovi koji se auriraju dohvataju
(Clustered ili Non-Clustered Index Seek bolje neko Non-Clustered Index Scan)
DELETE
BEGIN TRAN
DELETE FROM Person.EmailAddress
WHERE BusinessEntityID = 42
ROLLBACK TRAN