【发布时间】:2015-01-29 08:31:50
【问题描述】:
我在 SQL Server 中有一个包含 10,000,000 行的表
CREATE TABLE [dbo].[tmpTable](
[EventId] [int] NULL,
[Data] [nvarchar](max) NULL
)
CREATE NONCLUSTERED INDEX [ci] ON [dbo].[tmpTable]
(
[EventId] ASC
)
INCLUDE ([Data])
数据列是 XML
当我使用 SQL 时,
SELECT EventId
, CAST(Data AS xml ).value('(/d/nv/@v)[1]', 'uniqueidentifier') AS ID1
, CAST(Data AS xml ).value('(/d/nv/@v)[2]', 'int') AS ID2
, CAST(Data AS xml ).value('(/d/nv/@v)[3]', 'bigint') AS ID3
, CAST(Data AS xml ).value('(/d/nv/@v)[4]', 'bit') AS ID4
, CAST(Data AS xml ).value('(/d/nv/@v)[5]', 'nvarchar(100)') AS ID5
, CAST(Data AS xml ).value('(/d/nv/@v)[6]', 'nvarchar(100)') AS ID6
, CAST(Data AS xml ).value('(/d/nv/@v)[7]', 'bigint') AS ID7
, CAST(Data AS xml ).value('(/d/nv/@v)[8]', 'int') AS ID8
FROM tmpTable
WHERE EventId = 100
执行计划中会有Sort吗?这会扼杀性能。但是,如果我使用
Select Top 100
排序将消失。任何的想法?有什么办法可以去掉排序
执行计划:
|--Compute Scalar(DEFINE:([Expr1011]=[Expr1010], [Expr1022]=[Expr1021], [Expr1033]=[Expr1032], [Expr1044]=[Expr1043], [Expr1055]=[Expr1054], [Expr1066]=[Expr1065], [Expr1077]=[Expr1076], [Expr1088]=[Expr1087]))
|--Parallelism(Gather Streams)
|--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| |--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | |--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | | |--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | | | | | | |--Sort(ORDER BY:([tmpTable].[dbo].[tmptmpTable].[Data] ASC))
| | | | | | | | |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([tmpTable].[dbo].[tmptmpTable].[Data]))
| | | | | | | | |--Table Scan(OBJECT:([tmpTable].[dbo].[tmptmpTable]), WHERE:([tmpTable].[dbo].[tmptmpTable].[EventId]=(100)))
样本数据
<d>
<nv n="MediaDesc" v="79cc07e3-8d4a-4c8a-bc9f-3fcba485532b" />
<nv n="ChannelNumber" v="116" />
<nv n="Duration" v="61773" />
<nv n="IsTunedToService" v="True" />
<nv n="StreamSelection" v="FULLSCREEN_SECONDARY" />
<nv n="ChannelType" v="LiveTVMediaChannel" />
<nv n="TuneID" v="634050840267464082" />
</d>
【问题讨论】:
-
EventId上有索引吗? -
您能否提供示例数据并分享您的执行计划,因为我已经测试了上述场景并且没有找到任何类型
-
是的,EventId 有一个包含数据列的非集群索引
-
样本数据:
-
@SongTian 为问题添加详细信息,使其易于查看和阅读。以上内容不可读。
标签: sql-server performance sorting xquery sql-execution-plan