由于性能问题,SQL交叉应用的替代方案
我有点墨守成规。我有一个xml和SQl server。我想得到FBC的所有值,用逗号分隔 该表的名称为表1。存储xml的列的名称是FareDetails。BookingID和ID是表1的其他列由于性能问题,SQL交叉应用的替代方案,sql,sql-server,join,sqlxml,cross-apply,Sql,Sql Server,Join,Sqlxml,Cross Apply,我有点墨守成规。我有一个xml和SQl server。我想得到FBC的所有值,用逗号分隔 该表的名称为表1。存储xml的列的名称是FareDetails。BookingID和ID是表1的其他列 SELECT (PTSD.PSTDNode.value('(FBC)[1]', 'VARCHAR(1024)') + ',') [text()] FROM [Table1] CROSS APPLY [FareDetails].nodes('/AirFareInfo/PTSDPFS
SELECT
(PTSD.PSTDNode.value('(FBC)[1]', 'VARCHAR(1024)') + ',') [text()]
FROM
[Table1]
CROSS APPLY [FareDetails].nodes('/AirFareInfo/PTSDPFS/PTSD') PTSD(PSTDNode)
WHERE
[BookingID] = 123
ORDER BY
[AirTraveler].ID ASC
FOR XML PATH ('')
但是我在数据库中有一百万条记录,这对性能造成了巨大的损失
xml:
<AirFareInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" IPFA="false">
<PT>Flight</PT>
<FPMID>0</FPMID>
<PTID>1</PTID>
<FS>
<CID>2</CID>
<Value>0</Value>
</FS>
<TF>
<CID xsi:nil="true" />
<Value>0</Value>
</TF>
<VF>
<CID>2</CID>
<Value>0</Value>
</VF>
<VD>
<CID>2</CID>
<Value>0</Value>
</VD>
<VCR xsi:nil="true" />
<VC>
<CID>2</CID>
<Value>0</Value>
</VC>
<VFC>
<CID>2</CID>
<Value>0</Value>
</VFC>
<VST />
<VIT />
<AAPFVDR xsi:nil="true" />
<CC>
<CID>2</CID>
<Value>0</Value>
</CC>
<D>
<CID>2</CID>
<Value>514.15</Value>
</D>
<PD>
<CID>2</CID>
<Value>0</Value>
</PD>
<EBF>
<CID>2</CID>
<Value>0</Value>
</EBF>
<CST>
<DL>
<ATRID>13</ATRID>
<OB>
<CID>2</CID>
<Value>74.04</Value>
</OB>
<OC>
<CID>2</CID>
<Value>0.00</Value>
</OC>
<OS>
<CID>2</CID>
<Value>0.00</Value>
</OS>
<OF>
<CID>2</CID>
<Value>50.83</Value>
</OF>
<OP>
<CID>2</CID>
<Value>0.00</Value>
</OP>
<C>
<CID>2</CID>
<Value>0</Value>
</C>
<IBF>false</IBF>
<D>2014-06-09T14:57:53.521Z</D>
</DL>
</CST>
<CIT />
<CRMR xsi:nil="true" />
<CRM>
<CID>2</CID>
<Value>0</Value>
</CRM>
<TL ATC="Tax" PC="" DEN="User Development Fee - Arrival (UDF)">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>75.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="Passenger Service Fee">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>146.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="User Development Fee - Departure (UDF)">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>1681.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="Cute Fee">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>50.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="Government Service Tax">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>151.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="User Development Fee - Arrival (UDF)">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>833.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="Passenger Service Fee">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>1132.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="User Development Fee - Departure (UDF)">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>76.00</Value>
</Amount>
</TL>
<TL ATC="Tax" PC="" DEN="Government Service Tax">
<TID xsi:nil="true" />
<Amount>
<CID>2</CID>
<Value>148.00</Value>
</Amount>
</TL>
<PTSDPFS>
<PTSD IO="false">
<FBC>AP</FBC>
<ACD RBD="" ACCID="1" MCT="Super Sale Fare(AP)" INC="false" />
<ATSID xsi:nil="true" />
</PTSD>
</PTSDPFS>
<PTSDPFS>
<PTSD IO="false">
<FBC>AP</FBC>
<ACD RBD="" ACCID="1" MCT="Super Sale Fare(AP)" INC="false" />
<ATSID xsi:nil="true" />
</PTSD>
</PTSDPFS>
<RuleDetails>
<TRS xsi:nil="true" />
<PP xsi:nil="true" />
<II xsi:nil="true" />
<LTD xsi:nil="true" />
</RuleDetails>
</AirFareInfo>
航班
0
1.
2.
0
0
2.
0
2.
0
2.
0
2.
0
2.
0
2.
514.15
2.
0
2.
0
13
2.
74.04
2.
0
2.
0
2.
50.83
2.
0
2.
0
假的
2014-06-09T14:57:53.521Z
2.
0
2.
75
2.
146
2.
1681
2.
50
2.
151
2.
833
2.
1132
2.
76
2.
148
美联社
美联社
这种情况下的输出应该是AP,AP。如何提高性能?正如我在评论中所说,最佳答案取决于许多我不知道的因素。作为快速拍摄,您可以尝试以下方法:
SELECT REPLACE(FareDetails.query(N'data(/AirFareInfo/PTSDPFS/PTSD/FBC)').value('(text())[1]','nvarchar(100)'),' ',',')
FROM Table1
WHERE BookingID=123
XML方法
data()
返回所有找到的text()
,并用空格分隔(遗憾的是不能更改此值)。只要你的
中的文本本身不包含空白,这就行。你的xml格式不正确,不能用xml类型声明。阅读此标题“Nodes()方法应用程序和效率”xml操作还有一点,但我想不起来。但我在数据库中有一百万条记录。。。在XML中读取数以百万计的值不能太快。。。但是您使用的是,其中[BookingID]=123
。您是否将此呼叫筛选到一些记录?是
修复数(在本例中为两个)还是1:n
?此节点中的内容是否已修复,或者可能是1:n
中的某个位置?这是一次性行动还是你必须经常做的事情?你可以用扳机。要维护包含要搜索的值的边表,AirTraveler.ID
来自何处?@Shnugo:可以是1到n我提到的代码位于从sp调用的UDF中。性能可能来自此处:我提到的代码位于从sp调用(标量)的UDF中SP的UDF往往表现出糟糕的性能。你核对我的答案了吗?如果你可以把它称为内联的,它的性能应该会更好…这个答案给出了输出:AP,A而不是AP,AP@PiyushSing我试了一下,得到了正确的结果。可能这是在某个地方(变量变小,其他函数…)Hi@shnugo,当我们在表中有重复的bookingid时,它就会失败。例如bookingid 123在表中出现4次,在FareDetails(xml)中,FBC的值a、b、c、d对应于4个xml。对于所有4个BookingID,输出应为a、b、c、d。当前输出为a,用于第一个条目,b,用于第二个条目,c,用于第三个条目,d,用于第四个条目。请协助。@Piyussing请避免变色龙问题!最初的问题并没有说明每个BookingID有一个以上的记录。在这种情况下,您必须像上面那样阅读所有这些行,并将它们连接到一个答案中。但是重复值呢?这是一个全新的问题!如果我的回答解决了这个问题。请接受(在计票台下方勾选)并开始一个新问题。请将您的样品减少到所需的最低限度!谢谢你的解决方案,我已经发布了单独的问题,请看一看。