SQL Server:使用XQuery优化TSQL查询

时间:2015-09-18 08:33:26

标签: sql-server tsql xquery sqlxml xquery-sql

在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); 

2 个答案:

答案 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建议。这两者的结合应该会给你带来巨大的性能提升。