MERGE utasítás Komponálható DML GROUPING SETS Adattömörítés Csillag Join és Bitmap Filter Sparse oszlopok Filtered index Full Text Kereső Megbízható függőségek Profiler Deprecation események Apróságok
INSERT/UPDATE/DELETE egy művelettel INSERT/UPDATE/DELETE egy művelettel Gyorsabb, mint a külön I/U/D – 1x megy végig a táblákon Gyorsabb, mint a külön I/U/D – 1x megy végig a táblákon Adatbetöltésekre Adatbetöltésekre UPSERT eljárásokhoz UPSERT eljárásokhoz Szinkronizáló alkalmazásokhoz Szinkronizáló alkalmazásokhoz A műveletek egy tranzakcióban futnak A műveletek egy tranzakcióban futnak merge into Cel using Forras on Forras.Id = Cel.Id when matched then update set Cel.Adat = Forras.Adat,... update set Cel.Adat = Forras.Adat,... when target not matched then insert (Id, Adat,...) insert (Id, Adat,...) values(Forras.Id, Forras.Adat,...) values(Forras.Id, Forras.Adat,...) when source not matched then delete; merge into Cel using Forras on Forras.Id = Cel.Id when matched then update set Cel.Adat = Forras.Adat,... update set Cel.Adat = Forras.Adat,... when target not matched then insert (Id, Adat,...) insert (Id, Adat,...) values(Forras.Id, Forras.Adat,...) values(Forras.Id, Forras.Adat,...) when source not matched then delete; merge into Cel using Forras on Forras.Id = Cel.Id when matched and (Forras.OszlopN <> Cel.OszlopN) then update set Cel.Adat = Forras.Adat,... update set Cel.Adat = Forras.Adat,... when target not matched then insert (Id, Adat,...) insert (Id, Adat,...) values(Forras.Id, Forras.Adat,...) values(Forras.Id, Forras.Adat,...) when source not matched then delete; merge into Cel using Forras on Forras.Id = Cel.Id when matched and (Forras.OszlopN <> Cel.OszlopN) then update set Cel.Adat = Forras.Adat,... update set Cel.Adat = Forras.Adat,... when target not matched then insert (Id, Adat,...) insert (Id, Adat,...) values(Forras.Id, Forras.Adat,...) values(Forras.Id, Forras.Adat,...) when source not matched then delete;
Adatmódosító műveletek által érintett sorok felhasználása „virtuális” táblaként Későbbi verzióban nem csak insert lehet a művelet célja insert into Egyiktábla(Oszlop) select Oszlop1 from (update MásikTábla Set Oszlop1 = Újérték output inserted.Oszlop1) as d; insert into Egyiktábla(Oszlop) select Oszlop1 from (update MásikTábla Set Oszlop1 = Újérték output inserted.Oszlop1) as d;
{ MERGE, Komponálható DML } Komponálható DML }
A GROUP BY kibővítése Több feltétel szerinti csoportosítás Egy eredményhalmazt ad vissza (több GROUP BY és UNION ALL-lal helyettesíthető) Egyszerűsíti a többféle szempont szerint aggregálásokat Gyorsabb mint a UNION-os megoldás Újrahasznosítja a részeredményeket Egyszer megy végig a forrásadatokon SELECT C1, C2, …, Cn, Agg(M1), …, Agg(Mk) FROM T GROUP BY GROUPING SETS ((G1), (G2), …, (Gx)) SELECT C1, C2, …, Cn, Agg(M1), …, Agg(Mk) FROM T GROUP BY GROUPING SETS ((G1), (G2), …, (Gx))
SELECT D.CalendarYear, D.CalendarQuarter, T.SalesTerritoryCountry, SUM(F.SalesAmount) AS SalesAmount FROM dbo.FactResellerSales F INNER JOIN dbo.DimDate D ON F.OrderDateKey = D.DateKey INNER JOIN dbo.DimSalesTerritory T ON F.SalesTerritoryKey = T.SalesTerritoryKey GROUP BY GROUPING SETS ( (CalendarYear, CalendarQuarter, SalesTerritoryCountry), (CalendarYear, CalendarQuarter), (SalesTerritoryCountry),()) ORDER BY CalendarYear, CalendarQuarter, SalesTerritoryCountry SELECT D.CalendarYear, D.CalendarQuarter, T.SalesTerritoryCountry, SUM(F.SalesAmount) AS SalesAmount FROM dbo.FactResellerSales F INNER JOIN dbo.DimDate D ON F.OrderDateKey = D.DateKey INNER JOIN dbo.DimSalesTerritory T ON F.SalesTerritoryKey = T.SalesTerritoryKey GROUP BY GROUPING SETS ( (CalendarYear, CalendarQuarter, SalesTerritoryCountry), (CalendarYear, CalendarQuarter), (SalesTerritoryCountry),()) ORDER BY CalendarYear, CalendarQuarter, SalesTerritoryCountry Ország Év, negyedév Országonkénti összes Idő- szaki összes Teljes összeg Év, negyedév, ország összes
Táblák és indexek tartalmát tárolja tömörítve Elsősorban adattárházak tény tábláihoz (mert a módosításokat kicsit lassítja) Lehetségesen gyorsabb lekérdezések IO intenzív lekérdezések esetén Kevesebb IO „költség” De több CPU „költség” 2-7-szeres tömörítés A többi szolgáltatás számára észrevétlen
Sor tömörítés fix adatok változó hosszúságú kódolása (int, decimal, stb.) Lap tömörítés Prefix enkódolás Adatszótár használata (hashtable-szerű működés) BLOB adatok (varchar(max) stb.) nem tömörítettek Megoldások: saját függvény, saját típus, alkalmazás tömörít, FILESTREAM tömörített NTFS-en alamizsna 3dár 4uszi 0lakatos aladár alamizsna alamuszi lakatos Anchor sor
Mennyi nyereség várható? Bekapcsolás táblára Indexre alter table Tába rebuild with (data_compression = page vagy row) alter table Tába rebuild with (data_compression = page vagy row) alter index Indexnév on Tábla rebuild with (data_compression = page vagy row); alter index Indexnév on Tábla rebuild with (data_compression = page vagy row); exec sp_estimate_data_compression_savings 'Séma', 'Tábla', Index id, Partíció, 'row' vagy 'page'
Új, belső módszer csillagtáblákra épülő JOIN- ok gyorsítására Hatalmas, n x 100 millió soros táblákra is Bloom Filter implementáció Feltételek Egyoszlopos, egyenlőség alapú JOIN Integer a legjobb, in-row optimization Csak párhuzamos végrehajtási tervben A Tény tábla legyen a legnagyobb Sok szál és memória kell hozzá
“Sparse” attribútum az oszlopon Tárolás optimalizálás: 0 bájt a NULL értékek tárolása NULL tömörítés a TDS (drót) szinten Az alkalmazások nem látnak belőle semmit Max egy táblán XML-ként is láthatók és módosíthatók a sparse oszlopok (Sparse Column Set) Gyorsabb lehet mint a többtáblás (Entity-Attribute-Value) design Entity-Attribute-ValueSparse
Az adatok egy {részhalmazára} épített nonclustered index Kicsi index, kicsi IO Sparse oszlopokkal rendelkező táblákra is kiváló, csak a tényleges (nem NULL) adatokat indexelve create nonclustered index idx_BOF on Production.BillOfMaterials (ComponentID, StartDate) where EndDate IS NOT NULL create nonclustered index idx_BOF on Production.BillOfMaterials (ComponentID, StartDate) where EndDate IS NOT NULL
{ Sparse oszlopok, Filtered Index, Filtered Index, Powershell integráció } Powershell integráció }
Full-Text motor és az indexek teljesen integráltak Katalógus, az index és a nem indexelendő szavak listája (stoplist) az adatbázisban lakik A motor is az adatbázisban fut! (a szótördelés nem) Jobb teljesítmény Vegyes lekérdezések (FullText & Relációs) gyorsabbak Az optimalizáló tud a FT indexről FileStream integrált Nyitottá vált, látható minden működési részlet és adat SELECT * FROM candidates WHERE CONTAINS(resume,’”SQL Server”’) --FT index AND ZipCode = ‘2049’ --SQL index
A függőségek {név} és id alapján is rögzítődnek A késleltetett névfeloldás miatt SQL Server 2005 csak id-t használt Adatbázisok és szerverek közötti hivatkozásokat is követi! sys.sql_expression_dependencies Általános ki-kitől függ alaptábla sys.dm_sql_referenced_entities Kire hivatkozik? sys.dm_sql_referencing_entities Ki hivatkozik rá?
{ Full Text kereső, Függőségek } Függőségek }
Jelzik, ha olyan szolgáltatást használunk, amit már nem fognak támogatni Deprecation Announcement Kerüljük, mert már nem támogatják a jövőben int; = 9 ALTER DATABASE AdventureWorks SET TORN_PAGE_DETECTION ON Deprecation Final Support Már a következő verzió se támogatja sp_addserver SELECT … FROM Sales.SalesOrderDetail COMPUTE SUM(UnitPrice) BY SalesOrderID
CONVERT hexa támogatás Sor konstruktor (VALUES) Értékadó operátorok: +=, -=, *=, /=, … Változó inicializálás létrehozáskor INSERT INTO Contact VALUES ('John Doe', ' '), ('Jane Doe', ' '), ('John Smith', ' '); INSERT INTO Contact VALUES ('John Doe', ' '), ('Jane Doe', ' '), ('John Smith', ' '); UPDATE Raktárkészlet SET Mennyiség += s.Mennyiség FROM Raktárkészlet AS r INNER JOIN Eladások AS r ON r.id = e.id UPDATE Raktárkészlet SET Mennyiség += s.Mennyiség FROM Raktárkészlet AS r INNER JOIN Eladások AS r ON r.id = e.id int = 5; varchar(10) = 'xxx'; int = 5; varchar(10) = 'xxx'; binary(4) = CAST( as binary(4)) SELECT 1) -- 0x075BCD15 binary(4) = CAST( as binary(4)) SELECT 1) -- 0x075BCD15
Fejlesztőknek XML újdonságok Entity Framework Filestream Spatial típusok HierarchyID Integration Services Analysis Services Reporting Services Üzemeltetőknek Szabály alapú felügyelet AuditTitkosításTömörítésFüggőségekMonitorozásOptimalizálás Resource Governor
{ Kezdés 13:25-kor }