Performance Tuning SSIS packages Performance Best Practices Performance Design Patterns
Bedankt sponsors!
Joost van Rossum Werkzaam als Business Intelligence en Datamigratie consultant bij Ilionx. Focus op SSIS Sinds 1999 in ICT werkzaam sinds 2005 met Business Intelligence Getrouwd, twee zoontjes Blog: microsoft-ssis.blogspot.com LinkedIn: nl.linkedin.com/in/joostvanrossum Twitter: @SSISJoost MSDN SSIS forum moderator
Performance Tuning Beter vooraf dan achteraf Zoek op google naar SSIS Performance Best Practices http://sqlcat.com/sqlcat/b/top10lists/archive/2008/10/01/top-10-sql-server-integration-services-best-practices.aspx http://www.mattmasson.com/2012/02/resources-for-ssis-performance-best-practices/ http://henkvandervalk.com/category/ssis Performance verwachtingen van te voren helder Baseline
Baseline demo Maak baseline: alles verwijderen behalve dataflow met source Dummy Transformatie toevoegen: RowCount/Trash Destination Tellen en meten buiten BIDS/SSDT (geen debug overhead) Query duur eventueel vergelijken in Management Studio Bottlenecks: netwerk, processor, geheugen en disk I.O.
Baseline demo
Buffers Source: http://blog.advocate-art.com/index.php/archives/2192/greatfire_bucketlinelo-3
Buffers demo: buffer grootte Optie: buffer groter maken zodat er meer records in passen, maar niet zo groot dat het niet meer past! (64kb tot 100mb, default 10MB)
Buffers demo: record grootte beperken Nooit tabel selecteren in source, maar altijd query. Aantal kolommen beperken Kolom grootte minimaliseren
Buffers demo: record grootte beperken Berekenen lengte van een record
Buffers demo: flat file Flat File connection manager: Juiste minimale datatype kiezen Alleen parsen naar int / datum indien kolom gebruikt wordt Flat File source: Niet gebruikte kolommen uitvinken Fast Parse aanzetten voor veilige bronnen (voor niet-string velden). Via advanced editor van Flat File Source.
Buffers demo: flat file
Non-blocking, Partial-blocking, Fully-blocking components Synchronous vs Asynchronous Non-blocking, hergebruik buffers en aantal rijen in = uit Voorbeeld: Derived Column Partial-blocking, creëert nieuwe buffers, wacht tot buffer vol is Voorbeeld: Merge Join Fully-blocking , creëert nieuwe buffers, leest eerst alle records Voorbeeld: Sort Zie ook http://sqlblog.com/blogs/jorg_klein/archive/2008/02/12/ssis-lookup-transformation-is-case-sensitive.aspx
Test: welke transformaties zijn fully-blocking
Test: welke transformaties zijn partial-blocking Magic Transformations
Demo: Partial-blocking vermijden Niet gevonden lookup items negeren en later vervangen in Derived Column. Zo kan de Union All vermeden worden.
Demo:Fully-blocking vermijden Sort in SQL Source (denk aan advanced editor) Aggregate in SQL Source Eventueel ook simpele joins in SQL Source (leesbaarheid vs performance) Joins eventueel vervangen door lookup
Demo:Fully-blocking vermijden Sort vermijden: Order by toevoegen in source query Advanced editor: IsSorted aan- zetten voor Source Output SortKeyPosition opgeven voor gesorteerde kolom
Demo:Fully-blocking vermijden Let op SSIS sorteert anders dan SQL Server. Voeg eventueel COLLATE toe aan source query. Meer info http://microsoft-ssis.blogspot.com/2011/03/sorting-in-sql-vs-sorting-in-ssis.html
Design pattern: Drie-traps raket lookups Indien meeste bron data gematched kan worden met kleine lookup dataset => full cache Niet gevonden data via partial cache lookup
Design pattern: meerdere Derived columns Verdelen van tekst bewerkingen en berekeningen over meerdere Derived Columns vaak sneller. Meer info: http://henkvandervalk.com/how-to-speed-up-ssis-derived-columns-transformations
Design pattern: te veel sources Niet te veel sources in een data flow. Kan leiden locks. Meer info: http://www.mattmasson.com/2012/01/too-many-sources-in-a-data-flow/
Design pattern: modulo bij langzame source Modulo in source query van langzame bron Meer info: http://henkvandervalk.com/reading-as-fast-as-possible-from-a-table-with-ssis-part-ii http://sqlblog.com/blogs/rob_farley/archive/2011/02/17/the-ssis-tuning-tip-that-everyone-misses.aspx
Design pattern: modulo bij langzame destination Modulo in Conditional Split Zie ook Balanced Data Distributor Meer info: http://henkvandervalk.com/speeding-up-ssis-bulk-inserts-into-sql-server
Vragen? nvarchar nchar => dt_wstr in SSIS varchar char => dt_str in SSIS dus maximale lengte wordt gebruikt voor buffer (in tegen stelling tot SQL Server) Case insensitive aggregate: zie opties ignore case SCD => Merge join of Change Date Capture geen update met OLE DB command, maar insert naar tijdelijke tabel en dan mass update query via Execute SQL Task