0
Introduction toNew T-SQL ProgrammabilityFeatures inSQL Server 2008Aaron Shilo, Database Consultant Oracle & MS Sql Server ...
Who Am I ??? Married + 2.5 children A DBA for 10 years. Oracle And Sql-Server Certified Professional. Used to be CTO@j...
Topics Data Compression Table value constructor support through the VALUES clause New date and time data types and func...
CompressionSQL Server 2008 supports both row and page compression for both tables and indexes.Data compression can be conf...
Considerations And Limitations Compression is available only in the SQL Server 2008 Enterprise and Developer editions. C...
Page Compression Compressing the leaf level of tables and indexes with page compression consists of threeoperations in th...
Prefix Compression For each page that is being compressed, prefix compression uses the following steps: For each column,...
Prefix Compression The following illustration shows a sample page of a table before prefix compression. The following il...
Dictionary Compression After prefix compression has been completed, dictionary compression is applied.Dictionary compress...
Row Compression Enabling compression only changes the physical storage format of the data that isassociated with a data t...
 demoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Table Value Constructor Support through theVALUES Clause SQL Server 2008 introduces support for table value constructors ...
 A table value constructor can be used to define table expressions such as key derivedtables and CTEs, and can be used wh...
 DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Date and Time Data Types Before SQL Server 2008, date and time improvements were probably at the top of the list of themo...
 Note that the format YYYY-MM-DD is language neutral for the new data types, but it islanguage dependent for the DATETIME...
HIERARCHYID Data Type The new HIERARCHYID data type in SQL Server 2008 is a system-supplied CLR UDT that canbe useful for...
 demoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Table Types and Table-Valued Parameters SQL Server 2008 introduces table types and table-valued parameters that help abbr...
 SQL Server 2008 also enhances client APIs to support defining and populating table-valued parameters. Table-valued param...
 demoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
MERGE Statement The new MERGE statement is a standard statement that combines INSERT, UPDATE, andDELETE actions as a sing...
 DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Grouping Sets SQL Server 2008 introduces several extensions to the GROUP BY clause that enable you todefine multiple grou...
 DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Sparse Columns Sparse columns are columns that are optimized for the storage of NULLs. To define a column as sparse, spe...
 DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Filtered Indexes A filtered index is an optimized nonclustered index, especially suited to cover queries thatselect from ...
Filtered Indexes Improved query performance and plan qualityA well-designed filtered index improves query performance and...
Filtered Indexes cont’Design Considerations : In order to design effective filtered indexes, it is important to understan...
 DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Change Data Capture Change data capture is a new mechanism in SQL Server 2008 that enables you to easilytrack data change...
 DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
Resource Governor Resource Governor is a new technology in SQL Server 2008 that enables you to manageSQL Server workload ...
Types of Resource Issues Resource Governor is designed to address the following types of resource issues which are common...
Resource Governor – Workloads Ability to differentiate workloads e.g. app_name, login Per-request limits Max memory %...
Resource Governor – Importance A workload can have animportance label Low Medium High Gives resource allocationprefer...
Resource Governor – Pools Resource pool: A virtual subset ofphysical database engine resources Provides controls to spec...
Resource GovernorPutting it all together Workloads are mapped toResource Pools (n : 1) Online changes of groups/pools S...
 All sample files demos and PPT. www.dbconsultant.co.il
THANK YOU!Aaron Shilo, Database Consultant Oracle & MS Sql Server Certifiedwww.dbconsultant.co.il * aaron@dbconsultant.co....
Upcoming SlideShare
Loading in...5
×

New fordevelopersinsql server2008

134

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
134
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "New fordevelopersinsql server2008"

  1. 1. Introduction toNew T-SQL ProgrammabilityFeatures inSQL Server 2008Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified4477117-050*aaron@dbconsultant.co.il*www.dbconsultant.co.il
  2. 2. Who Am I ??? Married + 2.5 children A DBA for 10 years. Oracle And Sql-Server Certified Professional. Used to be CTO@johnbryce training. Lead my own consulting business. Advisor to Tapuz.co.il / BezeqInt / Lavie Time-tec andmore
  3. 3. Topics Data Compression Table value constructor support through the VALUES clause New date and time data types and functions The HIERARCHYID data type Table types and table-valued parameters The MERGE statement, grouping sets enhancements Sparse columns Filtered indexes Change data capture Resource GovernorAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  4. 4. CompressionSQL Server 2008 supports both row and page compression for both tables and indexes.Data compression can be configured for the following database objects: A whole table that is stored as a heap. A whole table that is stored as a clustered index. A whole non clustered index. A whole indexed view. For partitioned tables and indexes, the compression option can be configured for eachpartition, and the various partitions of an object do not have to have the samecompression setting.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  5. 5. Considerations And Limitations Compression is available only in the SQL Server 2008 Enterprise and Developer editions. Compression can allow more rows to be stored on a page, but does not change themaximum row size of a table or index. A table cannot be enabled for compression when the maximum row size plus thecompression overhead exceeds the maximum row size of 8060 bytes For example, a table that has the columns c1 char(8000) and c2 char(53) cannot be compressedbecause of the additional compression overhead. When the vardecimal storage format is used, therow-size check is performed when the format is enabled. For row and page compression, the row-size check is performed when the object is initially compressed, and then checked as each row isinserted or modified. Compression enforces the following two rules: An update to a fixed-length type must always succeed. Disabling data compression must always succeed. Even if the compressed row fits on the page,which means that it is less than 8060 bytes; SQL Server prevents updates that would not fit on therow when it is uncompressed.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  6. 6. Page Compression Compressing the leaf level of tables and indexes with page compression consists of threeoperations in the following order: Row compression Prefix compression Dictionary compressionAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  7. 7. Prefix Compression For each page that is being compressed, prefix compression uses the following steps: For each column, a value is identified that can be used to reduce the storage space forthe values in each column. A row that represents the prefix values for each column is created and stored in thecompression information (CI) structure that immediately follows the page header. The repeated prefix values in the column are replaced by a reference to thecorresponding prefix. If the value in a row does not exactly match the selected prefixvalue, a partial match can still be indicated.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  8. 8. Prefix Compression The following illustration shows a sample page of a table before prefix compression. The following illustration shows the same page after prefix compression. The prefix ismoved to the header, and the column values are changed to references to the prefix.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  9. 9. Dictionary Compression After prefix compression has been completed, dictionary compression is applied.Dictionary compression searches for repeated values anywhere on the page, and storesthem in the CI area. Unlike prefix compression, dictionary compression is not restricted toone column. Dictionary compression can replace repeated values that occur anywhereon a page. The following illustration shows the same page after dictionary compression.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  10. 10. Row Compression Enabling compression only changes the physical storage format of the data that isassociated with a data type but not its syntax or semantics. Application changes are notrequired when one or more tables are enabled for compression. The new record storageformat has the following main changes: It reduces the metadata overhead that is associated with the record. This metadata isinformation about columns, their lengths and offsets. In some cases, the metadataoverhead might be larger than the old storage format. It uses variable-length storage format for numeric types (for example integer, decimal,and float) and the types that are based on numeric (for example datetime and money). It stores fixed character strings by using variable-length format by not storing the blankcharacters.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  11. 11.  demoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  12. 12. Table Value Constructor Support through theVALUES Clause SQL Server 2008 introduces support for table value constructors through the VALUESclause. You can now use a single VALUES clause to construct a set of rows. One use of thisfeature is to insert multiple rows based on values in a single INSERT statementINSERT INTO dbo.Customers(custid, companyname, phone, address)VALUES(1, cust 1, (111) 111-1111, address 1),(2, cust 2, (222) 222-2222, address 2),(3, cust 3, (333) 333-3333, address 3),(4, cust 4, (444) 444-4444, address 4),(5, cust 5, (555) 555-5555, address 5); Note that even though no explicit transaction is defined here, this INSERT statement isconsidered an atomic operation. So if any row fails to enter the table, the entire INSERToperation fails.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  13. 13.  A table value constructor can be used to define table expressions such as key derivedtables and CTEs, and can be used where table expressions are allowed (such as in theFROM clause of a SELECT statement or as the source table in a MERGE statement). Thefollowing example demonstrates using the VALUES clause to define a derived table in thecontext of an outer SELECT statement:SELECT * FROM(VALUES(1, cust 1, (111) 111-1111, address 1),(2, cust 2, (222) 222-2222, address 2),(3, cust 3, (333) 333-3333, address 3),(4, cust 4, (444) 444-4444, address 4),(5, cust 5, (555) 555-5555, address 5))AS C(custid, companyname, phone, address); The outer query can operate on this table expression like any other table expression,including joins, filtering, grouping, and so on.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  14. 14.  DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  15. 15. Date and Time Data Types Before SQL Server 2008, date and time improvements were probably at the top of the list of themost requested improvements for SQL Server—especially the request for separate date and timedata types, but also for general enhanced support for temporal data. SQL Server 2008 introduces four new date and time data types—including DATE, TIME, DATETIME2,and DATETIMEOFFSET. The four new date and time data types provide a split between date and time, support for alarger date range, improved accuracy, and support for a time zone element. The DATE and TIME data types split the date and time, which in previous versions were consolidated. The DATETIME2 data type is an improved version of DATETIME, providing support for a larger daterange and better accuracy. The DATETIMEOFFSET data type is similar to DATETIME2 with the addition of a time zone component.Table 1 describes the new data types, showing their storage in bytes, date-range support,accuracy, recommended entry format for literals.Data TypeStorage(bytes)Date Range AccuracyRecommended Entry Format andExampleDATE 3January 1, 0001, through December 31,9999 (Gregorian calendar)1 dayYYYY-MM-DD2009-02-12TIME 3 to 5100nanosecondshh:mm:ss.nnnnnnn12:30:15.1234567DATETIME2 6 to 8January 1, 0001, through December 31,9999100nanosecondsYYYY-MM-DD hh:mm:ss.nnnnnnn2009-02-12 12:30:15.1234567DATETIMEOFFSET 8 to 10January 1, 0001, through December 31,9999100nanosecondsYYYY-MM-DD hh:mm:ss.nnnnnnn[+|-]hh:mm2009-02-12 12:30:15.1234567 +02:00Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  16. 16.  Note that the format YYYY-MM-DD is language neutral for the new data types, but it islanguage dependent for the DATETIME and SMALLDATETIME data types. The language-neutral format for those data types is YYYYMMDD. The three new types that contain a time component (TIME, DATETIME2, andDATETIMEOFFSET) enable you to specify the fractional seconds precision in parenthesesfollowing the type name. The default is 7, meaning 100 nanoseconds. If you need afractional second accuracy of milliseconds, such as three for example, you must explicitlyspecify it: DATETIME2(3). The following code shows an example of using the new types:DECLARE@d AS DATE = 2009-02-12,@t AS TIME = 12:30:15.1234567,@dt2 AS DATETIME2 = 2009-02-12 12:30:15.1234567,@dto AS DATETIMEOFFSET = 2009-02-12 12:30:15.1234567 +02:00;SELECT @d AS [@d], @t AS [@t], @dt2 AS [@dt2], @dto AS [@dto];Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  17. 17. HIERARCHYID Data Type The new HIERARCHYID data type in SQL Server 2008 is a system-supplied CLR UDT that canbe useful for storing and manipulating hierarchies. This type is internally stored as a VARBINARY value that represents the position of thecurrent node in the hierarchy (both in terms of parent-child position and position amongsiblings). You can perform manipulations on the type by using either Transact-SQL or client APIs toinvoke methods exposed by the type.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  18. 18.  demoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  19. 19. Table Types and Table-Valued Parameters SQL Server 2008 introduces table types and table-valued parameters that help abbreviate your codeand improve its performance. Table types allow easy reuse of table definition by table variables, andtable-valued parameters enable you to pass a parameter of a table type to stored procedures andfunctions.Table Types Table types enable you to save a table definition in the database and use it later to define tablevariables and parameters to stored procedures and functions. Because table types let you reuse a tabledefinition, they ensure consistency and reduce chances for errors. You use the CREATE TYPE statement to create a new table type.Table-Valued Parameters You can now use table types as the types for input parameters of stored procedures and functions.Currently, table-valued parameters are read only, and you must define them as such by using theREADONLY keyword. A common scenario where table-valued parameters are very useful is passing an “array” of keys to astored procedure. Before SQL Server 2008, common ways to meet this need were based on dynamicSQL, a split function, XML, and other techniques. The approach using dynamic SQL involved the risk ofSQL Injection and did not provide efficient reuse of execution plans. Using a split function wascomplicated, and using XML was complicated and nonrelational. In SQL Server 2008, you simply pass the stored procedure a table-valued parameter. There is no risk of SQLInjection, and there is opportunity for efficient reuse of execution plans.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  20. 20.  SQL Server 2008 also enhances client APIs to support defining and populating table-valued parameters. Table-valued parameters are treated internally like table variables.Their scope is the batch (procedure, function). They have several advantages in somecases over temporary tables and other alternative methods: They are strongly typed. SQL Server does not maintain distribution statistics (histograms) for them; therefore, they donot cause recompilations. They are not affected by a transaction rollback. They provide a simple programming model.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  21. 21.  demoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  22. 22. MERGE Statement The new MERGE statement is a standard statement that combines INSERT, UPDATE, andDELETE actions as a single atomic operation based on conditional logic. Besides beingperformed as an atomic operation, the MERGE statement is more efficient than applyingthose actions individually. The statement refers to two tables: a target table specified in the MERGE INTO clause anda source table specified in the USING clause. The target table is the target for themodification, and the source table data can be used to modify the target. The semantics (as well as optimization) of a MERGE statement are similar to those of anouter join. You specify a predicate in the ON clause that defines which rows in the sourcehave matches in the target, which rows do not, and which rows in the target do not havea match in the source. You have a clause for each case that defines which action totake—WHEN MATCHED THEN, WHEN NOT MATCHED [BY TARGET] THEN, and WHEN NOTMATCHED BY SOURCE THEN. Note that you do not have to specify all three clauses, butonly the ones you need. As with other modification statements, the MERGE statement also supports the OUTPUTclause, which enables you to return attributes from the modified rows. As part of theOUTPUT clause, you can invoke the $action function, which returns the action thatmodified the row (INSERT, UPDATE, DELETE).Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  23. 23.  DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  24. 24. Grouping Sets SQL Server 2008 introduces several extensions to the GROUP BY clause that enable you todefine multiple groupings in the same query. These extensions are: the GROUPING SETS,CUBE, and ROLLUP subclauses of the GROUP BY clause and the GROUPING_ID function.The new extensions are standard and should not be confused with the older, nonstandardCUBE and ROLLUP options.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  25. 25.  DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  26. 26. Sparse Columns Sparse columns are columns that are optimized for the storage of NULLs. To define a column as sparse, specify the SPARSE attribute as part of the column definition.Sparse columns consume no storage for NULLs, even with fixed-length types; however,when a column is marked as sparse, storage of non-NULL values becomes more expensivethan usual. Therefore, you should define a column as sparse only when it will store a largepercentage of NULLs. SQL Server Books Online provides recommendations for thepercentage of NULLs that justify making a column sparse for each data type. Querying and manipulation of sparse columns is the same as for regular columns, with oneexception described later in this PresentationAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  27. 27.  DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  28. 28. Filtered Indexes A filtered index is an optimized nonclustered index, especially suited to cover queries thatselect from a well-defined subset of data. It uses a filter predicate to index a portion ofrows in the table. A well-designed filtered index can improve query performance, reduce indexmaintenance costs, and reduce index storage costs compared with full-table indexes.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  29. 29. Filtered Indexes Improved query performance and plan qualityA well-designed filtered index improves query performance and execution plan qualitybecause it is smaller than a full-table nonclustered index and has filtered statistics. Thefiltered statistics are more accurate than full-table statistics because they cover only therows in the filtered index. Reduced index maintenance costsAn index is maintained only when data manipulation language (DML) statements affectthe data in the index. A filtered index reduces index maintenance costs compared with afull-table nonclustered index because it is smaller and is only maintained when the data inthe index is affected. It is possible to have a large number of filtered indexes, especiallywhen they contain data that is affected infrequently. Similarly, if a filtered index containsonly the frequently affected data, the smaller size of the index reduces the cost ofupdating the statistics. Reduced index storage costsCreating a filtered index can reduce disk storage for nonclustered indexes when a full-table index is not necessary. You can replace a full-table nonclustered index with multiplefiltered indexes without significantly increasing the storage requirements.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  30. 30. Filtered Indexes cont’Design Considerations : In order to design effective filtered indexes, it is important to understand what queries yourapplication uses and how they relate to subsets of your data. Some examples of data thathave well-defined subsets are columns with mostly NULL values, columns withheterogeneous categories of values and columns with distinct ranges of values. Thefollowing design considerations give a variety of scenarios for when a filtered index canprovide advantages over full-table indexes.Filtered Indexes for Subsets of Data : When a column only has a small number of relevant values for queries, you can create afiltered index on the subset of values. For example, when the values in a column aremostly NULL and the query selects only from the non-NULL values, you can create afiltered index for the non-NULL data rows. The resulting index will be smaller and cost less tomaintain than a full-table nonclustered index defined on the same key columns.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  31. 31.  DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  32. 32. Change Data Capture Change data capture is a new mechanism in SQL Server 2008 that enables you to easilytrack data changes in a table. The changes are read by a capture process from thetransaction log and recorded in change tables. Those change tables mirror the columnsof the source table and also contain metadata information that can be used to deducethe changes that took place. Those changes can be consumed in a convenient relationalformat through TVFs. An extract, transform, and load (ETL) process in SQL Server Integration Services thatapplies incremental updates to a data warehouse is just one example of an applicationthat can benefit from change data capture.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  33. 33.  DemoAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  34. 34. Resource Governor Resource Governor is a new technology in SQL Server 2008 that enables you to manageSQL Server workload and resources by specifying limits on resource consumption byincoming requests. In the Resource Governor context, workload is a set of similarly sizedqueries or requests that can, and should be, treated as a single entity. This is not arequirement, but the more uniform the resource usage pattern of a workload is, the morebenefit you are likely to derive from Resource Governor. Resource limits can bereconfigured in real time with minimal impact on workloads that are executing. In an environment where multiple distinct workloads are present on the same server,Resource Governor enables you to differentiate these workloads and allocate sharedresources as they are requested, based on the limits that you specify. These resources areCPU and memory.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  35. 35. Types of Resource Issues Resource Governor is designed to address the following types of resource issues which are commonlyfound in a database environment: Run-away queries on the server. In this scenario a resource intensive query can take up most or all of theserver resources. Unpredictable workload execution. In this scenario concurrent applications on the same server haveworkloads of different size and type. For example, two data warehouse applications or a mix of OLTP anddata warehouse applications. These applications are not isolated from each other and the resultingresource contention causes unpredictable workload execution. Setting workload priority. In this scenario one workload is allowed to proceed faster than another or isguaranteed to complete if there is resource contention. Resource Governor enables you to assign arelative importance to workloads.All of the preceding scenarios require the ability to differentiate workloads in some way. Resource Governorprovides: The ability to classify incoming connections and route their workloads to a specific group. The ability to monitor resource usage for each workload in a group. The ability to pool resources and set pool-specific limits on CPU usage and memory allocation. Thisprevents or minimizes the probability of run-away queries. The ability to associate grouped workloads with a specific pool of resources. The ability to identify and set priorities for workloads.Aaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  36. 36. Resource Governor – Workloads Ability to differentiate workloads e.g. app_name, login Per-request limits Max memory % Max CPU time Grant timeout Max Requests Resource monitoringMemory, CPU, Threads, …BackupAdmin TasksOLTPActivityAd-hocReportsExecutiveReportsAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  37. 37. Resource Governor – Importance A workload can have animportance label Low Medium High Gives resource allocationpreference to workloads basedon importanceSQL ServerMemory, CPU, Threads, …ResourcesAdmin WorkloadBackupAdmin TasksOLTP WorkloadOLTPActivityReport WorkloadAd-hocReportsExecutiveReportsHighAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  38. 38. Resource Governor – Pools Resource pool: A virtual subset ofphysical database engine resources Provides controls to specify Min Memory % Max Memory % Min CPU % Max CPU % Max DOP Resource monitoring Up to 20 resource poolsSQL ServerMin Memory10%Max Memory20%Max CPU 20%Admin WorkloadBackupAdmin TasksOLTP WorkloadOLTPActivityReport WorkloadAd-hocReportsExecutiveReportsHighMax CPU 90%Application PoolAdmin PoolAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  39. 39. Resource GovernorPutting it all together Workloads are mapped toResource Pools (n : 1) Online changes of groups/pools SQL Server 2005 = default group +default poolMain Benefit Prevent run-away queriesSQL ServerMin Memory10%Max Memory20%Max CPU 20%Admin WorkloadBackupAdmin TasksOLTP WorkloadOLTPActivityReport WorkloadAd-hocReportsExecutiveReportsHighMax CPU 90%Application PoolAdmin PoolAaron Shilo, Database Consultant Oracle & MS Sql Server Certified
  40. 40.  All sample files demos and PPT. www.dbconsultant.co.il
  41. 41. THANK YOU!Aaron Shilo, Database Consultant Oracle & MS Sql Server Certifiedwww.dbconsultant.co.il * aaron@dbconsultant.co.il * 050-4477117
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×