SQL Azure 分区 Table 上的选择性 XML 索引
Selective XML Index on SQL Azure Partitioned Table
随着 Azure SQL 的 v12 更新,我们现在可以使用 CREATE SELECTIVE XML INDEX
语句创建 Selective XML Indexes。
我想不通的是如何在分区 table 上创建此索引,以便它与分区键对齐。例如,在 create 语句中包含分区键不起作用:
CREATE SELECTIVE XML INDEX ( PartitionKey, XmlColumn )
。同样指定 ON ( PartitionScheme( PartitionKey ) )
也不起作用。
似乎选择性 xml 索引是特殊的野兽。我非常希望能够创建过滤选择性 xml 索引,但它似乎又不受支持,或者我无法弄清楚语法。
回到我的问题:我们如何才能将选择性 xml 索引与分区 table 对齐,还是始终在幕后对齐?
选择性 XML 索引 (SXI) 基本上是一个内部 table,其分区方式与基础 table 相同。因此,您不需要像其他索引那样显式地对索引进行分区。
下面是一个显示行为的示例脚本:
use tempdb;
go
CREATE PARTITION FUNCTION myDateRangePF1 (date)
AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401',
'20030501', '20030601', '20030701', '20030801',
'20030901', '20031001', '20031101', '20031201');
GO
CREATE PARTITION SCHEME myRangePS3
AS PARTITION myDateRangePF1
ALL TO ( [PRIMARY] );
go
create table sxi_t (id int not null, dt date not null, primary key(dt, id), xmlcol xml)
on myRangePS3(dt);
go
CREATE SELECTIVE XML INDEX sxi_index
ON sxi_t(xmlcol)
FOR(
pathab = '/a/b' as XQUERY 'node()',
pathabc = '/a/b/c' as XQUERY 'xs:double',
pathdtext = '/a/b/d/text()' as XQUERY 'xs:string' MAXLENGTH(200) SINGLETON,
pathabe = '/a/b/e' as SQL NVARCHAR(100)
);
go
select *
from sys.partitions as p
join sys.internal_tables as it
on it.object_id = p.object_id
where it.parent_id = object_id('sxi_t');
go
drop table sxi_t;
drop partition scheme myRangePS3;
drop partition function myDateRangePF1;
go
至于过滤后的 SXI,如果您创建辅助 SXI,则它会在内部根据非 NULL 值创建为过滤后的 SXI。
我也提交了一个错误来更新联机丛书中的一些细节。
随着 Azure SQL 的 v12 更新,我们现在可以使用 CREATE SELECTIVE XML INDEX
语句创建 Selective XML Indexes。
我想不通的是如何在分区 table 上创建此索引,以便它与分区键对齐。例如,在 create 语句中包含分区键不起作用:
CREATE SELECTIVE XML INDEX ( PartitionKey, XmlColumn )
。同样指定 ON ( PartitionScheme( PartitionKey ) )
也不起作用。
似乎选择性 xml 索引是特殊的野兽。我非常希望能够创建过滤选择性 xml 索引,但它似乎又不受支持,或者我无法弄清楚语法。
回到我的问题:我们如何才能将选择性 xml 索引与分区 table 对齐,还是始终在幕后对齐?
选择性 XML 索引 (SXI) 基本上是一个内部 table,其分区方式与基础 table 相同。因此,您不需要像其他索引那样显式地对索引进行分区。
下面是一个显示行为的示例脚本:
use tempdb;
go
CREATE PARTITION FUNCTION myDateRangePF1 (date)
AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401',
'20030501', '20030601', '20030701', '20030801',
'20030901', '20031001', '20031101', '20031201');
GO
CREATE PARTITION SCHEME myRangePS3
AS PARTITION myDateRangePF1
ALL TO ( [PRIMARY] );
go
create table sxi_t (id int not null, dt date not null, primary key(dt, id), xmlcol xml)
on myRangePS3(dt);
go
CREATE SELECTIVE XML INDEX sxi_index
ON sxi_t(xmlcol)
FOR(
pathab = '/a/b' as XQUERY 'node()',
pathabc = '/a/b/c' as XQUERY 'xs:double',
pathdtext = '/a/b/d/text()' as XQUERY 'xs:string' MAXLENGTH(200) SINGLETON,
pathabe = '/a/b/e' as SQL NVARCHAR(100)
);
go
select *
from sys.partitions as p
join sys.internal_tables as it
on it.object_id = p.object_id
where it.parent_id = object_id('sxi_t');
go
drop table sxi_t;
drop partition scheme myRangePS3;
drop partition function myDateRangePF1;
go
至于过滤后的 SXI,如果您创建辅助 SXI,则它会在内部根据非 NULL 值创建为过滤后的 SXI。
我也提交了一个错误来更新联机丛书中的一些细节。