Xpathでいくつかの助けが必要です。私は毎日(約500MB)のシュレッダーに必要なXML文書を持っています。SQL ServerのXpath
のXmlの例を次に示します。
https://docs.google.com/document/d/11Ov6KXo83pu3xEXGovrFK-Hm2cMjZW1gqwTnRTraj58/edit?usp=sharing
実際のファイルは、取引の停止し、数十万人が含まれています。
私はここに文書を細断するために取り組んでストアドプロシージャを持っている: https://docs.google.com/document/d/1tegGjaK0x7L3uajeUlD1ex0F-yoeSueujDTarkW_Bak/edit?usp=sharing
問題は、私はSQL Serverエージェントからの私たちのVM上でそれを実行したとき、それは5時間を要するということです。
理想的には、これは1時間以内に実行されます(これは個人用のマシンで実行されます)。
私は多分、私はこのような何かを行うと、1文ではなく、使用の一時テーブルと参加に全力を尽くすことができると考えた:
SELECT
se.value('@Filename', 'varchar(50)') As [Filename],
se.value('@FareIdentifier', 'varchar(50)') As FareIdentifier,
se.value('@DeviceType', 'varchar(50)') As DeviceType,
ro.value('@ServiceIdentifier', 'varchar(50)') As ServiceIdentifier,
ro.value('@ServiceNumber', 'varchar(50)') As ServiceNumber,
ro.value('@CarrierNumber', 'varchar(50)') AS CarrierNumber,
jo.value('@VehicleRegistration', 'varchar(50)') As VehicleRegistration,
jo.value('@VehicleNumber', 'varchar(50)') As VehicleNumber,
jo.value('@VehicleDepotNumber', 'varchar(50)') As VehicleDepotNumber,
jo.value('@ServiceDepotNumber', 'varchar(50)') As ServiceDepotNumber,
jo.value('@JourneyDirection', 'varchar(50)') As JourneyDirection,
jo.value('@JourneyEnd', 'varchar(50)') As JourneyEnd,
jo.value('@JourneyStart', 'varchar(50)') As JourneyStart,
jo.value('@RunningBoardNumber', 'varchar(50)') As RunningBoardNumber,
jo.value('@RunningBoardDepotNumber', 'varchar(50)') As RunningBoardDepotNumber,
jo.value('@DutyNumber', 'varchar(50)') As DutyNumber,
jo.value('@DutyDepotNumber', 'varchar(50)') As DutyDepotNumber,
jo.value('@DriverName', 'varchar(50)') As DriverName,
jo.value('@DriverNumber', 'varchar(50)') As DriverNumber,
jo.value('@FinalTicketSerial', 'varchar(50)') As FinalTicketSerial,
jo.value('@StartTicketSerial', 'varchar(50)') As StartTicketSerial,
jo.value('@ContractType', 'varchar(50)') As ContractType,
jo.value('@DriverDepotNumber', 'varchar(50)') As DriverDepotNumber,
jo.value('@EtmDepotNumber', 'varchar(50)') As EtmDepotNumber,
jo.value('@Company', 'varchar(50)') As Company,
jo.value('@JourneyType', 'varchar(50)') As JourneyType,
jo.value('@JourneyNumber', 'varchar(50)') As JourneyNumber,
st.value('@TCA', 'varchar(50)') As TCA,
st.value('@Latitude', 'varchar(50)') As Latitude,
st.value('@Longitude', 'varchar(50)') As Longitude,
st.value('@NaptanCode', 'varchar(50)') As NaptanCode,
st.value('@AtcoCode', 'varchar(50)') As ATCOCode,
st.value('@StopName', 'varchar(50)') As StopName,
st.value('@BusStopNumber', 'varchar(50)') As BusStopNumber,
st.value('@StopNumber', 'varchar(50)') As StopNumber,
st.value('@BoardingFareStageName', 'varchar(50)') As BoardingFareStageName,
st.value('@BoardingFareStageNumber', 'varchar(50)') As BoardingFareStageNumber,
st.value('@BoardingFareStageOwner', 'varchar(50)') As BoardingFareStageOwner,
st.value('@RealDeparture', 'varchar(50)') As RealDeparture,
st.value('@RealArrival', 'varchar(50)') As RealArrival,
st.value('@OwnerNumber', 'varchar(50)') As OwnerNumber,
cs.value('@SoldTicketClassName', 'varchar(50)') As SoldTicketClassName,
cs.value('@SalesPrice', 'varchar(50)') As SalesPrice,
cs.value('@PaymentMethod', 'varchar(50)') As PaymentMethod,
cs.value('@ISOCurrency', 'varchar(50)') As ISOCurrency,
cs.value('@SoldTicketClassNo', 'varchar(50)') As SoldTicketClassNo,
cs.value('@TicketProductName', 'varchar(50)') As TicketProductName,
cs.value('@TicketProductNumber', 'varchar(50)') As TicketProductNumber,
cs.value('@NumTransactions', 'varchar(50)') As NumTransactions,
cs.value('@NumPgersOnTicket', 'varchar(50)') As NumPgersOnTicket,
cs.value('@IssueDateTime', 'varchar(50)') As IssueDateTime,
cs.value('@TicketNumber', 'varchar(50)') As TicketNumber,
cs.value('@TicketGUID', 'varchar(50)') As TicketGUID,
cs.value('@DestinationFareStageName', 'varchar(50)') As DestinationFareStageName,
cs.value('@DestinationFareStageNumber', 'varchar(50)') As DestinationFareStageNumber,
cs.value('@DestinationFareStageOwner', 'varchar(50)') As DestinationFareStageOwner,
cs.value('@EventDateTime', 'varchar(50)') As EventDateTime,
cs.value('@TransactionType', 'varchar(50)') As TransactionType,
cs.value('@CardId', 'varchar(50)') As CardId,
cs.value('@SchemeIdentifier', 'varchar(50)') As SchemeIdentifier
FROM
XMLUpload CROSS APPLY
XmlData.nodes('Header/Session') AS [Session](se) CROSS APPLY
se.nodes('Routes/Route') AS [Route](ro) CROSS APPLY
ro.nodes('Journey') As [Journey](jo) CROSS APPLY
jo.nodes('DrivenStops/Stop') As [Stop](st) CROSS APPLY
st.nodes('Events/*') As [CashSale](cs)
それは要素CashSaleとCardUsageの重複行が作成されますので、これは動作しません。 (1行では、CashSaleフィールドはnullであり、1つのCardUsageフィールドではnullです)、同じ行に含める必要があります。
理想的な結果は、それぞれのCashSaleに1つのレコードが存在するときに、同じ行にCardUsageフィールドがあることです。 CardUsageがない場合、これらのフィールドはヌルです。
誰かがいくつかの最適化を提案することができますか、いくつかのオンラインリソースに向けて私を指摘してください。私はオンラインで役立つものを探すのに苦労しています。
データ型を変更するだけで、必要なサイズになるようにしましたが、パフォーマンスは向上しますが、必要なだけではありません。
私は完全に(powershellなどを使用して)別のソリューションには公開されていますが、このxmlで他のソリューションを使用することはできませんでした。