SELECT 在 XML 字段速度慢
SELECT in XML Field is slow
我正在编写一个 SQL Server 2005 存储过程,但是 xml 上的 select 真的很慢。
这是我的代码:
INSERT INTO @T
SELECT DISTINCT
tr.ID, tr.Identificazione as identification,
ft.NumeroFattura, ft.IDFattura,
dbo.getInvoicePayedStatus(ft.IDFattura)
FROM
TestReport AS tr
INNER JOIN
Job AS j ON j.ID = tr.Job
INNER JOIN
Plan_Main AS pm ON pm.TESTREPORT = tr.ID
INNER JOIN
Fatture AS ft ON ft.IDFattura IN (SELECT T.N.value('(text())[1]','int')
FROM XMLDATA.nodes('InvoiceList/id') AS T(N))
WHERE
tr.DocumentStatus = 4
AND j.NomeCliente = @companyId
AND ft.IDFattura IS NOT NULL
ORDER BY
tr.id ASC
这是减慢我的存储过程的部分:
(SELECT T.N.value('(text())[1]','int')
FROM pm.XMLDATA.nodes('InvoiceList/id') AS T(N))
xml的例子:
<PrecedentTask />
<UsedResources />
<InvoiceList>
<id>4350</id>
</InvoiceList>
"SQL Where"之后的行数比较少(30左右)但是查询需要8秒多!
我也尝试使用“=”运算符代替 "IN" 并且性能很好(不到 1 秒)但是当我的 xml 的 "invoiceList" 包含多个排它不起作用。
你有什么解决办法吗?
目前您的查询正在返回以下 table 之间的匹配行。
TestReport as tr
INNER JOIN Job as j
on j.ID = tr.Job -- Only matching rows betwwen "TestReport" & "Job"
INNER JOIN Plan_Main as pm
on pm.TESTREPORT = tr.ID -- Only matching rows betwwen "TestReport" & "Plan_Main"
但是当您将上述 table 与 Fatture
table 连接时,上述任何 table 与 Fatture [=] 之间没有定义关系30=]
实际上 corss joins
从上述连接返回的 result set
和 Fatture
table IDFattura 在 XML 文档中。
我会说你的问题是 JOINS 而不是查询分解 XML。
加入Fatture
table时需要在ON
子句中定义关系,并在ON子句中或在where 子句。
有点像...
FROM TestReport as tr
INNER JOIN Job as j on j.ID = tr.Job
INNER JOIN Plan_Main as pm on pm.TESTREPORT = tr.ID
INNER JOIN Fatture as ft on ft.IDFattura = --<-- A column to join it back to any of the above tables
WHERE tr.DocumentStatus = 4
and j.NomeCliente = @companyId
and ft.IDFattura is not null
and ft.IDFattura IN (SELECT T.N.value('(text())[1]','int')
FROM pm.XMLDATA.nodes('InvoiceList/id') AS T(N))
ORDER BY tr.id ASC
我正在编写一个 SQL Server 2005 存储过程,但是 xml 上的 select 真的很慢。
这是我的代码:
INSERT INTO @T
SELECT DISTINCT
tr.ID, tr.Identificazione as identification,
ft.NumeroFattura, ft.IDFattura,
dbo.getInvoicePayedStatus(ft.IDFattura)
FROM
TestReport AS tr
INNER JOIN
Job AS j ON j.ID = tr.Job
INNER JOIN
Plan_Main AS pm ON pm.TESTREPORT = tr.ID
INNER JOIN
Fatture AS ft ON ft.IDFattura IN (SELECT T.N.value('(text())[1]','int')
FROM XMLDATA.nodes('InvoiceList/id') AS T(N))
WHERE
tr.DocumentStatus = 4
AND j.NomeCliente = @companyId
AND ft.IDFattura IS NOT NULL
ORDER BY
tr.id ASC
这是减慢我的存储过程的部分:
(SELECT T.N.value('(text())[1]','int')
FROM pm.XMLDATA.nodes('InvoiceList/id') AS T(N))
xml的例子:
<PrecedentTask />
<UsedResources />
<InvoiceList>
<id>4350</id>
</InvoiceList>
"SQL Where"之后的行数比较少(30左右)但是查询需要8秒多!
我也尝试使用“=”运算符代替 "IN" 并且性能很好(不到 1 秒)但是当我的 xml 的 "invoiceList" 包含多个排它不起作用。
你有什么解决办法吗?
目前您的查询正在返回以下 table 之间的匹配行。
TestReport as tr
INNER JOIN Job as j
on j.ID = tr.Job -- Only matching rows betwwen "TestReport" & "Job"
INNER JOIN Plan_Main as pm
on pm.TESTREPORT = tr.ID -- Only matching rows betwwen "TestReport" & "Plan_Main"
但是当您将上述 table 与 Fatture
table 连接时,上述任何 table 与 Fatture [=] 之间没有定义关系30=]
实际上 corss joins
从上述连接返回的 result set
和 Fatture
table IDFattura 在 XML 文档中。
我会说你的问题是 JOINS 而不是查询分解 XML。
加入Fatture
table时需要在ON
子句中定义关系,并在ON子句中或在where 子句。
有点像...
FROM TestReport as tr
INNER JOIN Job as j on j.ID = tr.Job
INNER JOIN Plan_Main as pm on pm.TESTREPORT = tr.ID
INNER JOIN Fatture as ft on ft.IDFattura = --<-- A column to join it back to any of the above tables
WHERE tr.DocumentStatus = 4
and j.NomeCliente = @companyId
and ft.IDFattura is not null
and ft.IDFattura IN (SELECT T.N.value('(text())[1]','int')
FROM pm.XMLDATA.nodes('InvoiceList/id') AS T(N))
ORDER BY tr.id ASC