gpt4 book ai didi

xml - SQL 2005 和 SQL 2008 使用 XML 插入多行的区别

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:17 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Why insert-select to variable table from XML variable so slow?

我正在使用以下 SQL 代码在表中插入多行数据。使用 XML 变量将数据传递给存储过程:

INSERT INTO MyTable
SELECT SampleTime = T.Item.value('SampleTime[1]', 'datetime'),
Volume1 = T.Item.value('Volume1[1]', 'float'),
Volume2 = T.Item.value('Volume2[1]', 'float')
FROM @xml.nodes('//Root/MyRecord') T(item)

我有一大堆单元测试来验证我在调用存储过程时是否插入了正确的信息、正确的记录数等。

一切都很好 - 也就是说,直到我们开始对数据库的兼容级别进行调整。

只要我们将数据库的兼容级别保持在 90 (SQL 2005),上面的代码就可以很好地工作。当我们将兼容级别设置为 100(SQL 2008)时,单元测试失败,因为使用上述代码的存储过程超时。

单元测试正在删除数据库,从脚本重新创建它,并在全新的数据库上运行测试,所以我认为这不是“旧兼容级别”的问题。

使用 SQL Management Studio,我编写了一个快速测试 SQL 脚本。使用相同的 XML block ,我更改了 DB compat level ,截断表,然后使用上面的代码插入 650 行。当级别为 90(SQL 2005)时,它以毫秒为单位运行。当级别为 100 (SQL 2008) 时,有时需要一分钟多的时间,有时需要几毫秒。

如果有人对此有任何见解,我将不胜感激。


编辑

脚本需要一分钟多的时间来运行我的实际数据,它的行数比我在这里显示的多,是一个真实的表,并且有一个索引。使用以下示例代码,差异在毫秒和大约 5 秒之间。

--use [master]
--ALTER DATABASE MyDB SET compatibility_level =100

use [MyDB]

declare @xml xml

set @xml = '<?xml version="1.0"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Record>
<SampleTime>2009-01-24T00:00:00</SampleTime>
<Volume1>0</Volume1>
<Volume2>0</Volume2>
</Record>
..... 653 records, sample time spaced out 4 hours ........
</Root>'

DECLARE @myTable TABLE(
ID int IDENTITY(1,1) NOT NULL,
[SampleTime] [datetime] NOT NULL,
[Volume1] [float] NULL,
[Volume2] [float] NULL)

INSERT INTO @myTable
select
T.Item.value('SampleTime[1]', 'datetime') as SampleTime,
Volume1 = T.Item.value('Volume1[1]', 'float'),
Volume2 = T.Item.value('Volume2[1]', 'float')
FROM @xml.nodes('//Root/Record') T(item)

我取消注释顶部的两行,选择它们并运行它(ALTER DATABASE 语句),然后注释这两行,取消选择任何文本并运行整个过程。

当我从 90 变为 100 时,它在 5 秒内一直运行(我改变了一次级别,但我运行了几次系列以查看是否有一致的结果)。当我从 100 更改为 90 时,它一直以毫秒为单位运行。这样你也可以玩它。我使用的是 SQL Server 2008 R2 标准版。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com