2017-10-03 3 views
0

Je ne parviens pas à optimiser la requête de mise à jour suivantetrès lent import xml dans SQL Server 2016

requête SQL

DECLARE @XmlFile4 XML 

SELECT @XmlFile4 = BulkColumn 
FROM OPENROWSET(BULK 'C:\Temp\GeoDynamics\Downloads\GeoBewegingen.xml', SINGLE_BLOB) x; 

WITH XMLNAMESPACES (DEFAULT 'http://www.geodynamics.be/webservices') 
UPDATE GeoBewegingen 
SET voernaam = resource.value('(../../Vehicle/Name)[1]', 'varchar(255)'), 
    voercode = resource.value('(../../Vehicle/Code)[1]', 'varchar(255)'), 
    pervan = resource.value('(../../FromDateLocal)[1]', 'varchar(255)'), 
    pertot = resource.value('(../../ToDateLocal)[1]', 'varchar(255)'), 
    tripvan = resource.value('(FromDateLocal)[1]', 'varchar(255)'), 
    triptot = resource.value('(ToDateLocal)[1]', 'varchar(255)'), 
    tripvanlocstr = resource.value('(FromLocation/Address/Street)[1]', 'varchar(255)'), 
    tripvanlocnr = resource.value('(FromLocation/Address/HouseNumber)[1]', 'varchar(255)'), 
    tripvanlocpc = resource.value('(FromLocation/Address/PostalCode)[1]', 'varchar(255)'), 
    tripvanloccity = resource.value('(FromLocation/Address/City)[1]', 'varchar(255)'), 
    tripvanlocsub = resource.value('(FromLocation/Address/Submunicipality)[1]', 'varchar(255)'), 
    tripvanloccountry = resource.value('(FromLocation/Address/Country)[1]', 'varchar(255)'), 
    tripvanlong = resource.value('(FromLocation/Longitude)[1]', 'varchar(255)'), 
    tripvanlat = resource.value('(FromLocation/Latitude)[1]', 'varchar(255)'), 
    tripnaarlocstr = resource.value('(ToLocation/Address/Street)[1]', 'varchar(255)'), 
    tripnaarlocnr = resource.value('(ToLocation/Address/HouseNumber)[1]', 'varchar(255)'), 
    tripnaarlocpc = resource.value('(ToLocation/Address/PostalCode)[1]', 'varchar(255)'), 
    tripnaarloccity = resource.value('(ToLocation/Address/City)[1]', 'varchar(255)'), 
    tripnaarlocsub = resource.value('(ToLocation/Address/Submunicipality)[1]', 'varchar(255)'), 
    tripnaarloccountry = resource.value('(ToLocation/Address/Country)[1]', 'varchar(255)'), 
    tripnaarlong = resource.value('(ToLocation/Longitude)[1]', 'varchar(255)'), 
    tripnaarlat = resource.value('(ToLocation/Latitude)[1]', 'varchar(255)'), 
    triptype = resource.value('(Type)[1]', 'varchar(255)'), 
    tripkmgereden = resource.value('(MileageDriven)[1]', 'varchar(255)'), 
    tripkmvogelvlucht = resource.value('(MileageBirdFlight)[1]', 'varchar(255)'), 
    tripuserid = resource.value('(Users/UserEntity/Id)[1]', 'varchar(255)'), 
    tripusername = resource.value('(Users/UserEntity/Name)[1]', 'varchar(255)') 
FROM 
    @XmlFile4.nodes('//TripOverview_GetByVehicleIdListDateResponse/TripOverview_GetByVehicleIdListDateResult/TripOverviewEntity/TripItemEntities/TripItemEntity') AS XTbl1(resource) 
WHERE 
    resource.value('(../../Vehicle/Id)[1]', 'varchar(255)') = id 
    AND resource.value('(FromDateLocal)[1]', 'varchar(255)') = tripvan 

Je suis en train d'importer ce fichier XML (https://ufile.io/8d9of), mais il faut compter entre 2-3 minutes pour terminer l'importation. Comment puis-je l'accélérer puisque le serveur n'est pas le problème (SQL Server 2016, ssd d'entreprise, Dual Xeon cpu et 256Go ddr4 ram)

Répondre

1

Le chargement et l'analyse du XML est plutôt performant ... 585 enregistrements dans 0.108 secondes. Je soupçonne que la mise à jour provoque la dégradation. Peut-être en plaçant l'analyse XML dans un CTE, puis effectuer la mise à jour via un JOIN.

Avis I a ajouté deux champs et KID kFromDateLocal

Exemple

Declare @XmlFile4 xml 
Select @XmlFile4 = BulkColumn FROM OPENROWSET(BULK 'C:\Working\geobewegingen.xml', SINGLE_BLOB) x; 

;WITH XMLNAMESPACES (DEFAULT 'http://www.geodynamics.be/webservices') 
,cte as (
Select kID    = resource.value('(../../Vehicle/Id)[1]', 'varchar(255)'), 
     kFromDateLocal  = resource.value('(FromDateLocal)[1]', 'varchar(255)'), 
     voernaam   = resource.value('(../../Vehicle/Name)[1]', 'varchar(255)'), 
     voercode   = resource.value('(../../Vehicle/Code)[1]', 'varchar(255)'), 
     pervan    = resource.value('(../../FromDateLocal)[1]', 'varchar(255)'), 
     pertot    = resource.value('(../../ToDateLocal)[1]', 'varchar(255)'), 
     tripvan   = resource.value('(FromDateLocal)[1]', 'varchar(255)'), 
     triptot   = resource.value('(ToDateLocal)[1]', 'varchar(255)'), 
     tripvanlocstr  = resource.value('(FromLocation/Address/Street)[1]', 'varchar(255)'), 
     tripvanlocnr  = resource.value('(FromLocation/Address/HouseNumber)[1]', 'varchar(255)'), 
     tripvanlocpc  = resource.value('(FromLocation/Address/PostalCode)[1]', 'varchar(255)'), 
     tripvanloccity  = resource.value('(FromLocation/Address/City)[1]', 'varchar(255)'), 
     tripvanlocsub  = resource.value('(FromLocation/Address/Submunicipality)[1]', 'varchar(255)'), 
     tripvanloccountry = resource.value('(FromLocation/Address/Country)[1]', 'varchar(255)'), 
     tripvanlong  = resource.value('(FromLocation/Longitude)[1]', 'varchar(255)'), 
     tripvanlat   = resource.value('(FromLocation/Latitude)[1]', 'varchar(255)'), 
     tripnaarlocstr  = resource.value('(ToLocation/Address/Street)[1]', 'varchar(255)'), 
     tripnaarlocnr  = resource.value('(ToLocation/Address/HouseNumber)[1]', 'varchar(255)'), 
     tripnaarlocpc  = resource.value('(ToLocation/Address/PostalCode)[1]', 'varchar(255)'), 
     tripnaarloccity = resource.value('(ToLocation/Address/City)[1]', 'varchar(255)'), 
     tripnaarlocsub  = resource.value('(ToLocation/Address/Submunicipality)[1]', 'varchar(255)'), 
     tripnaarloccountry = resource.value('(ToLocation/Address/Country)[1]', 'varchar(255)'), 
     tripnaarlong  = resource.value('(ToLocation/Longitude)[1]', 'varchar(255)'), 
     tripnaarlat  = resource.value('(ToLocation/Latitude)[1]', 'varchar(255)'), 
     triptype   = resource.value('(Type)[1]', 'varchar(255)'), 
     tripkmgereden  = resource.value('(MileageDriven)[1]', 'varchar(255)'), 
     tripkmvogelvlucht = resource.value('(MileageBirdFlight)[1]', 'varchar(255)'), 
     tripuserid   = resource.value('(Users/UserEntity/Id)[1]', 'varchar(255)'), 
     tripusername  = resource.value('(Users/UserEntity/Name)[1]', 'varchar(255)') 
From @XmlFile4.nodes('//TripOverview_GetByVehicleIdListDateResponse/TripOverview_GetByVehicleIdListDateResult/TripOverviewEntity/TripItemEntities/TripItemEntity') AS XTbl1(resource) 
) 
Update A 
    set voernaam   = B.voernaam 
     ,voernaam   = B.voernaam 
     ,voercode   = B.voercode 
     ,pervan    = B.pervan 
     ,pertot    = B.pertot 
     ,tripvan   = B.tripvan 
     ,triptot   = B.triptot 
     ,tripvanlocstr  = B.tripvanlocstr 
     ,tripvanlocnr  = B.tripvanlocnr 
     ,tripvanlocpc  = B.tripvanlocpc 
     ,tripvanloccity  = B.tripvanloccity 
     ,tripvanlocsub  = B.tripvanlocsub 
     ,tripvanloccountry = B.tripvanloccountry 
     ,tripvanlong  = B.tripvanlong 
     ,tripvanlat   = B.tripvanlat 
     ,tripnaarlocstr  = B.tripnaarlocstr 
     ,tripnaarlocnr  = B.tripnaarlocnr 
     ,tripnaarlocpc  = B.tripnaarlocpc 
     ,tripnaarloccity = B.tripnaarloccity 
     ,tripnaarlocsub  = B.tripnaarlocsub 
     ,tripnaarloccountry = B.tripnaarloccountry 
     ,tripnaarlong  = B.tripnaarlong 
     ,tripnaarlat  = B.tripnaarlat 
     ,triptype   = B.triptype 
     ,tripkmgereden  = B.tripkmgereden 
     ,tripkmvogelvlucht = B.tripkmvogelvlucht 
     ,tripuserid   = B.tripuserid 
     ,tripusername  = B.tripusername 
From GeoBewegingen A 
Join cte B on A.id = B.kID and A.tripvan = B.kFromDateLocal 
+0

Mise à jour - déclaration complète de mise à jour Ajouté –