在SQL Server 2012中,我有一个包含XML列的行的表 - XMLdata
。 XML的大小约为10 MB。我写了一个查询,但执行大约需要1个小时。有没有选项如何重写查询,它会更快地工作?
XML的结构:
<Settings>
<Group Name="A">
<Group Name="AA">
<Group Name="AAA">
<Parameter Name="aaa">
<Value>test1</Value>
<Items>
<Item Index="0" Name="A"/>
<Item Index="1" Name="B"/>
</Items>
</Parameter>
</Group>
</Group>
</Group>
</Settings>
查询:
SELECT
A.B.value('../../../../../@Name', 'nvarchar(100)') + '/' + A.B.value('../../../../@Name', 'nvarchar(100)') + '/' + A.B.value('../../../@Name', 'nvarchar(100)') AS BlockPath
, A.B.value('../../@Name', 'nvarchar(100)') AS ParameterName
, A.B.value('./@Index', 'nvarchar(100)') AS ItemIndex
, A.B.value('./@Name', 'nvarchar(100)') AS ItemName
FROM
[table]
CROSS APPLY
XMLdata.nodes('//Item') AS A(B);
答案 0 :(得分:3)
尝试使用更多专注的 XPath,而不是使用臭名昭着的低效+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate {
NSDateComponents *components;
NSInteger days;
NSInteger hour;
NSInteger minutes;
NSString *durationString;
components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute
fromDate: startDate toDate: endDate options: 0];
days = [components day];
hour = [components hour];
minutes = [components minute];
if (days > 0) {
if (days > 1) {
durationString = [NSString stringWithFormat:@"%d days", days];
}
else {
durationString = [NSString stringWithFormat:@"%d day", days];
}
return durationString;
}
if (hour > 0) {
if (hour > 1) {
durationString = [NSString stringWithFormat:@"%d hours", hour];
}
else {
durationString = [NSString stringWithFormat:@"%d hour", hour];
}
return durationString;
}
if (minutes > 0) {
if (minutes > 1) {
durationString = [NSString stringWithFormat:@"%d minutes", minutes];
}
else {
durationString = [NSString stringWithFormat:@"%d minute", minutes];
}
return durationString;
}
return @"";
}
方法。
我试过这个并得到相同的结果,并且表现更好:
//Items
第一个SELECT
BlockPath = XC.value('../../../@Name', 'nvarchar(100)') + '/' + XC.value('../../@Name', 'nvarchar(100)') + '/' + XC.value('../@Name', 'nvarchar(100)'),
ParameterName = XC.value('@Name', 'varchar(100)'),
ItemIndex = XCItem.value('@Index', 'int'),
ItemName = XCItem.value('@Name', 'varchar(100)')
FROM
[table]
CROSS APPLY
XMLdata.nodes('/Settings/Group/Group/Group/Parameter') AS XT(XC)
CROSS APPLY
XC.nodes('Items/Item') AS XT2(XCItem);
获取CROSS APPLY
个节点 - 但是在其中包含任意<Parameter>
的直接XPath - 然后第二个//
获取CROSS APPLY
每个Items/Item
节点下的节点。
试试这个 - 你得到了多少改进?
答案 1 :(得分:1)
正如评论中所建议的那样,在列上创建XML Index是个好主意。您还可以将您的XML字段查询为marc_s建议。这两者的结合应该会给你带来巨大的性能提升。