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 setFatture 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