What’s New in SQL Server 2005?

Download Report

Transcript What’s New in SQL Server 2005?

XML and XML Query Plans
Martin Bell
SQL Server - MVP
XML Enhancements







New XML Datatype
XQUERY Support
XML Data Manipulation Language
FOR XML Enhancements
XML Schema (XSD) Support
MSXML 6.0 (Native)
.Net XML Framework
New XML Datatype
 Store XML data, reducing the need to
shred it
 Stored as binary (underlying
varbinary(MAX) 2GB maximum)
 Compressed and tokenized – improved
storage (large documents) and speed
 Index XML columns
 Untyped (no schema) and typed XML
(data must conform to given schema)
 Use a datatype for variables
OPENROWSET Changes
 Can now be used for BULK loading
with BULK keyword
 Can use parameters similar to BULK
INSERT command
– FIRSTROW, LASTROW, FIELDTERMINATOR,
ROWTERMINATOR, CODEPAGE, DATAFILETYPE,
FORMATFILE, ERRORFILE, MAXERRORS,
ROWS_PER_BATCH
 Hints
– KEEPIDENTITY, KEEPDEFAULTS,
IGNORE_CONSTRAINTS, IGNORE_TRIGGERS,
TABLOCK
 Type of Data
– SINGLE_BLOB, SINGLE_CLOB, SINGLE_NCLOB
Using OPENROWSET to
populate a XML column
CREATE TABLE XMLAddress (
XMLAddress XML NOT NULL )
GO
INSERT INTO dbo.XMLAddress (XMLAddress )
SELECT *
FROM OPENROWSET ( BULK 'C:\demos\XML and
XML Query Plans\XML Examples\Address.xml',
SINGLE_BLOB ) AS b
GO
XQUERY Support
Method
Description
query() Method
Use this method to query over an
XML instance.
value() Method
Use this method to retrieve a value of
SQL type from an XML instance.
exist() Method
Use this method to determine
whether a query returns a nonempty
result.
modify() Method
Use this method to specify XML DML
statements to perform updates.
nodes() Method
Use this method to shred XML into
multiple rows to propagate parts
XML Data Manipulation
Language
 Update, Insert and Deletion of XML data using XQUERY
though modify method
UPDATE dbo.XMLAddress
SET XMLAddress.modify(
'replace value of (/Address/AddressID[text()="1"]/text())[1]
with "2"')
GO
XML Data Manipulation
Language
 Deletion of XML data using
XQUERY though modify method
UPDATE dbo.XMLAddress
SET XMLAddress.modify(
'delete /Address/AddressLines')
GO
XML Data Manipulation
Language
insert
Expression1
( {as first | as last} into | after |
before
Expression2
)
XML Data Manipulation
Language
 Inserting of XML data using XQUERY
though modify method
UPDATE dbo.XMLAddress
SET XMLAddress.modify(
'insert <AddressLines/>
before (/Address/City)[1]'
)
XML Schema (XSD) Support
 CREATE XML SCHEMA
COLLECTION
 ALTER XML SCHEMA COLLECTION
 DROP XML SCHEMA COLLECTION
 xml_schema_namespace function –
reconstructs a schema
xml_schema_namespace(
Relational_schema ,
XML_schema_collection_name , [ Namespace ] )
Schema Limitations
 Not supported:
<xsd:include>, <xsd:key>, <xsd:keyref>,
<xsd:unique>, <xsd:redefine>, xs:ID, xs:IDREF,
xs:IDS, union types, NOTATION type, lax
validation…
 Limitation of long (2^31) for value of length,
minLength, and maxLength
 Types derived from xs:date, xs:time, and
xs:dateTime are required to have time zones
XML Schema DMVs








sys.xml_schema_collections
sys.xml_schema_namespaces
sys.xml_schema_components
sys.xml_schema_elements
sys.xml_schema_attributes
sys.xml_schema_types
sys.xml_indexes
plus others
Using a schema to validate a
XML Column
CREATE TABLE [dbo].[Addresses](
[AddressID] [int] IDENTITY(1,1) NOT NULL,
[AddressLine1] [nvarchar](60) NOT NULL,
[AddressLine2] [nvarchar](60) NULL,
[City] [nvarchar](30) NOT NULL,
[PostalCode] [nvarchar](15) NOT NULL,
[AddressXML] XML (DOCUMENT AddressXMLSchema),
CONSTRAINT [PK_Addresses_AddressID] PRIMARY KEY
CLUSTERED
(
[AddressID]
)
)
Using a schema to
validate a XML Column
Schema definition for Postalcode has the restriction
pattern "[0-9]{5}“
<xs:element name="PostalCode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{5}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Using a schema to
validate a XML Column
-- Insert Data this works OK!
INSERT INTO [dbo].[Addresses] ( AddressID, AddressLine1,
AddressLine2, City, PostalCode, AddressXML )
SELECT 0,'1970 Napa Ct.','Parkside','Bothell','98011',
'<?xml version="1.0" encoding="UTF-8"?>
<Address xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<AddressID>0</AddressID>
<AddressLine1>1970 Napa Ct.</AddressLine1>
<AddressLine2>Parkside</AddressLine2>
<City>Bothell</City>
<PostalCode>98011</PostalCode>
</Address>'
Using a schema to
validate a XML Column
-- Insert Data, this will give an error on PostalCode validation
INSERT INTO [dbo].[Addresses] ( AddressID, AddressLine1,
AddressLine2, City, PostalCode, AddressXML )
SELECT 1,'Threadneedle Street',NULL,'London','EC2R 8AH',
'<?xml version="1.0" encoding="UTF-8"?>
<Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AddressID>1</AddressID>
<AddressLine1>Threadneedle Street</AddressLine1>
<City>London</City>
<PostalCode>EC2R 8AH</PostalCode>
</Address>‘
Msg 6926, Level 16, State 1, Line 1
XML Validation: Invalid simple type value: 'EC2R 8AH'. Location:
/*:Address[1]/*:PostalCode[1]
Using a schema to
validate a XML Column
<xs:element name="ZipCode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{5}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Postcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z]{1,2}[\d]{1,2}([A-Za-z])?\s?[\d][A-Za-z]{2}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Using a schema to
validate a XML Column
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:element ref="AddressID"/>
<xs:element ref="AddressLine1"/>
<xs:element ref="AddressLine2" minOccurs="0"/>
<xs:element ref="City"/>
<xs:choice>
<xs:element ref="ZipCode"/>
<xs:element ref="Postcode"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Using a schema to validate
an XML Variable
DECLARE @AddressXML XML (CONTENT AddressXMLSchema)
SET @AddressXML = '<?xml version="1.0" encoding="UTF-8"?>
<Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AddressID>0</AddressID>
<AddressLine1>1970 Napa Ct.</AddressLine1>
<AddressLine2>Parkside</AddressLine2>
<City>Bothell</City>
<State>WA</State>
<ZipCode>98011</ZipCode>
</Address>'
Using a schema to
validate a XML Variable
-- Wrong element
DECLARE @AddressXML XML (CONTENT AddressXMLSchema)
SET @AddressXML = '<?xml version="1.0" encoding="UTF-8"?>
<Address xmlns="UK Address" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<AddressID>2</AddressID>
<AddressLine1>Threadneedle Street</AddressLine1>
<City>London</City>
<ZipCode>98011</ZipCode>
</Address>'
Msg 6926, Level 16, State 1, Line 1
XML Validation: Invalid simple type value: 'EC2R 8AH'. Location:
/*:Address[1]/*:PostalCode[1]
Multiple Schema Validation
DECLARE @XmlSchema varbinary(max)
SELECT @XmlSchema = BulkColumn
FROM OPENROWSET (
BULK 'C:\demos\XML and XML Query Plans\XML Examples\XML SPY Schema
Validate US Address.xsd',
SINGLE_BLOB ) AS b
SELECT @XmlSchema = @XmlSchema + BulkColumn
FROM OPENROWSET (
BULK 'C:\demos\XML and XML Query Plans\XML Examples\XML SPY Schema
Validate UK Address.xsd',
SINGLE_BLOB ) AS b
CREATE XML SCHEMA COLLECTION AddressXMLSchema AS @XmlSchema
Multiple Schema Validation
SET @AddressXML = '<?xml version="1.0" encoding="UTF-8"?>
<Address xmlns="UK Address">
<AddressID>1</AddressID>
<AddressLine1>Threadneedle Street</AddressLine1>
<City>London</City>
<Postcode>EC2R 8AH</Postcode>
</Address>
<Address xmlns="US Address">
<AddressID>0</AddressID>
<AddressLine1>1970 Napa Ct.</AddressLine1>
<AddressLine2>Parkside</AddressLine2>
<City>Bothell</City>
<State>WA</State>
<ZipCode>98011</ZipCode>
</Address>'
XML Indexes
 XML Primary indexes
– Based on ORDPATH (reverse materialised path! Data is
shredded so be careful of space required)
– Requires a separate Clustered index on the table
– Creates a Node table in the sys schema
 XML Secondary Indexes
– PATH
 Useful if most of usage is .query() or .exist() using path
based searches
– PROPERTY
 Useful if most of usage is .value() to get property values
– VALUE
 Useful if wildcard searching
XML Primary indexes
CREATE TABLE [dbo].[Addresses](
[AddressID] [int] NOT NULL,
[AddressLine1] [nvarchar](60) NOT NULL,
[AddressLine2] [nvarchar](60) NULL,
[City] [nvarchar](30) NOT NULL,
[PostalCode] [nvarchar](15) NOT NULL,
[AddressXML] XML NOT NULL,
CONSTRAINT [PK_Addresses_AddressID] PRIMARY KEY
CLUSTERED
(
[AddressID]
)
)
CREATE PRIMARY XML INDEX idx_Addresses ON [Addresses] (
AddressXML )

Creates a Node table in the sys schema
XML Secondary indexes
CREATE XML INDEX idx_Addresses_PATH ON [Addresses] (
AddressXML )
USING XML INDEX idx_Addresses FOR PATH
GO
CREATE XML INDEX idx_Addresses_PROPERTY ON
[Addresses] ( AddressXML )
USING XML INDEX idx_Addresses FOR PROPERTY
GO
CREATE XML INDEX idx_Addresses_VALUE ON [Addresses] (
AddressXML )
USING XML INDEX idx_Addresses FOR VALUE
GO
Creating XML Query Plans
 Permissions needed to see plans
– SHOWPLAN permission is a database-level
permission which
– dbo, sysadmin, dbcreator roles have this
permission and can grant, deny and revoke it
– Supports ownership chaining
– Security Implications (can see definitions or
imply data distributions)
Creating XML Query Plans
 How to generate XML Query Plans
– Set Commands
 SHOWPLAN_XML (Display Estimated Execution Plan)
 STATISTICS_XML (Include Actual Execution Plan)
– SQL Profiler event classes
 Showplan XML
 Showplan XML for Query Compile,
 Showplan XML Statistics Profile
– From Query Cache
 sys.dm_exec_query_plan (only method which will return
XML datatype!)
Set Commands
 Set Commands
– SHOWPLAN_XML (Display Estimated
Execution Plan)
– STATISTICS_XML (Include Actual Execution
Plan)
Set Commands
Command
Execute
Query?
Display
Plan
Text?
Display
Estimated
Row Counts
& Stats
Display
Actual
Row Counts
set showplan_xml on No
Yes
Yes
No
set statistics xml on
Yes
Yes
Yes
Yes
SQL Profiler
 SQL Profiler event classes
– Showplan XML
– Showplan XML for Query Compile
– Showplan XML Statistics Profile
SQL Profiler
SQL Profiler
Query Cache
 Dynamic Management Functions
– sys.dm_exec_query_plan
– sys.dm_exec_cached_plans
 Permissions
– VIEW SERVER STATE
– sysadmin (sys.dm_exec_query_plan)
Query Cache
Note:
– sys.dm_exec_query_plan does not always return a
query plan
 If the plan has been evicted from the cache
 If they query contains a statement that is not cached
 If they query contains a call to a user-defined function or a
call to dynamic SQL
 If the number of nested elements exceed 128 levels (limit in
XML data type)
 If a ad-hoc query used simple or forced parameterised only the
query text is returned
Query Cache
Example:
Return all plans currently in the Query Cache
SELECT *
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle)
Query Cache
Example:
Return all plans that have statistics
SELECT *
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)
XML Query Plan Schema
 Schema
– C:\Program Files\Microsoft SQL
Server\90\Tools\Binn\schemas\sqlserver\2004\0
7\showplan\showplanxml.xsd
Loading XML Query Plans




Openrowset
XMLBulkload
SSIS
CLR
SQLXML BulkLoad Component
 SQLXML BulkLoad Component
– SQLXMLBulkLoad4
 Written to make use of XML datatype and CLR UDTs
– Examples in Books Online
Using SSIS to load XML files
Using SSIS to load XML files
Using SSIS to load XML files
Using SSIS to load XML files
Using SSIS to load XML files
Loading XML Showplan from
Trace
CREATE TABLE [dbo].[XMLShowplans](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[XML] [xml] NOT NULL
)
INSERT INTO [dbo].[XMLShowplans] ( XML )
SELECT TextData
FROM fn_trace_gettable ( 'C:\demos\XML and XML Query Plans\XML
Examples\GlasgowShowplanTrace.trc' , default)
WHERE EventClass = 122
AND ApplicationName <> 'SQLAgent - Alert Engine'
GO
Using CLR to load XML Query
Plans
 Processing XML Showplans Using SQLCLR
in SQL Server 2005
http://msdn2.microsoft.com/enus/library/ms345130.aspx
Analysing XML Query Plans
-- Get Each Query Cost
SELECT id, XML.value
('declare namespace
p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
(//p:RelOp)[1]/@EstimatedTotalSubtreeCost', 'float') AS QueryCost
FROM [dbo].[XMLShowplans]
Analysing XML Query Plans
-- Get Showplans with warnings
SELECT id, XML.query(
'declare namespace
p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
for $pc in //p:Warnings
return $pc
')
FROM [dbo].[XMLShowplans]
Analysing XML Query Plans
-- Exclude those which don't have warnings
SELECT id, XML.query(
'declare namespace
p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
for $pc in //p:Warnings
return $pc
')
FROM [dbo].[XMLShowplans]
WHERE XML.exist(
'declare namespace
p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
//p:Warnings
') = 1
Analysing XML Query Plans
-- Output Column Names for missing index
SELECT s.id,
cols.value('@Database','varchar(128)') AS [Database],
cols.value('@Schema','varchar(128)') AS [Schema],
cols.value('@Table','varchar(128)') AS [Table],
cols.value('@Column','varchar(128)') AS [Column]
FROM [dbo].[XMLShowplans] S
CROSS APPLY XML.nodes(
'declare namespace
ns="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
for $pc in //ns:ColumnsWithNoStatistics/ns:ColumnReference
return $pc
') as sp(cols)
Resources
 Home page
http://www.microsoft.com/sql/default.mspx
 Technet
http://www.microsoft.com/technet/prodtechn
ol/sql/default.mspx
 Virtual Labs
http://msdn.microsoft.com/virtuallabs/sql/def
ault.aspx
 Webcasts
http://www.microsoft.com/events/series/msd
nsqlserver2005.mspx
Resources
 perfectxml.com
http://www.perfectxml.com/
 sqlxml.org http://sqlxml.org/
Blogs
 Simon Sabin
http://sqlblogcasts.com/blogs/simons
 Craig Freedman
http://blogs.msdn.com/craigfr
 Jeni Tennison
http://www.jenitennison.com/blog
 Denis Ruckebusch
http://blogs.msdn.com/denisru
 Mike Rorke http://blogs.msdn.com/mrorke
 Microsoft XML Team
http://blogs.msdn.com/xmlteam
 Michael Rys http://blogs.msdn.com/mrys
Books
 Professional SQL Server 2005 XML, Scott
Klein ISBN 0764597922
 Pro SQL Server 2005, Thomas Rizzo et al.
ISBN 1590594770
 Professional SQL Server 2005 Integration
Services, Brian Knight et al. ISBN 0764584359
 Inside SQL server 2005 T-SQL Programming
Itzik Ben-Gan ISBN 0735621977
 A Developers Guide to SQL Server 2005 Bob
Beauchemin ISBN 0321382188