sqlserver中XML导入的优化

sqlserver中XML导入的优化,sql,sql-server,xml,sql-server-2005,Sql,Sql Server,Xml,Sql Server 2005,我有这段代码来导入一个50mb的XML,其中包含大约26.280个实体。 但这需要很长时间,只有50分钟,而且还在运行,可以吗?或者这段代码可以优化 INSERT INTO OSUSR_DFP_PEP_ENTITIES (ENT_ID, NAME, FIRSTNAME, LASTNAME, PREFIX, SUFFIX, AKA, NAMESOURCE, PARENTID, GOVDESIGNATION, ENTRYTYPE, ENTRYCATEGOR

我有这段代码来导入一个50mb的XML,其中包含大约26.280个实体。 但这需要很长时间,只有50分钟,而且还在运行,可以吗?或者这段代码可以优化

INSERT INTO OSUSR_DFP_PEP_ENTITIES (ENT_ID, NAME, FIRSTNAME, LASTNAME, PREFIX, SUFFIX,
                      AKA, NAMESOURCE, PARENTID, GOVDESIGNATION, ENTRYTYPE, ENTRYCATEGORY, ENTRYSUBCATEGORY,
                      ORGANIZATION, POSITIONS, REMARKS, DOB, POB, COUNTRY, EXPIRATIONDATE, EFFECTIVEDATE, 
                      PICTUREFILE, LINKEDTO, RELATED_ID, SOURCEWEBLINK, TOUCHDATE, DIRECTID, PASSPORTID, 
                      NATIONALID, OTHERID, DOB2, ENTLEVEL, MASTERID, WATCH, RELATIONSHIPS) 
SELECT X.product.query('Ent_ID').value('.', 'INT'),
       X.product.query('Name').value('.', 'nvarchar(1000)'),
       X.product.query('FirstName').value('.', 'nvarchar(500)'),
       X.product.query('LastName').value('.', 'nvarchar(500)'),
       X.product.query('Prefix').value('.', 'nvarchar(500)'),
       X.product.query('Suffix').value('.', 'nvarchar(500)'),

       X.product.query('Aka').value('.', 'nvarchar(500)'),
       X.product.query('NameSource').value('.', 'nvarchar(500)'),
       X.product.query('ParentID').value('.', 'INT'),
       X.product.query('GovDesignation').value('.', 'nvarchar(500)'),
       X.product.query('EntryType').value('.', 'nvarchar(500)'),
       X.product.query('EntryCategory').value('.', 'nvarchar(500)'),
       X.product.query('EntrySubCategory').value('.', 'nvarchar(500)'),

       X.product.query('Organization').value('.', 'nvarchar(500)'),
       X.product.query('Positions').value('.', 'nvarchar(500)'),
       X.product.query('Remarks').value('.', 'nvarchar(max)'),
       X.product.query('DOB').value('.', 'nvarchar(500)'),
       X.product.query('POB').value('.', 'nvarchar(500)'),
       X.product.query('Country').value('.', 'nvarchar(500)'),
       X.product.query('ExpirationDate').value('.', 'nvarchar(500)'),
       X.product.query('EffectiveDate').value('.', 'nvarchar(500)'),

       X.product.query('PictureFile').value('.', 'nvarchar(500)'),
       X.product.query('LinkedTo').value('.', 'nvarchar(500)'),
       X.product.query('Related_ID').value('.', 'INT'),
       X.product.query('SourceWebLink').value('.', 'nvarchar(max)'),
       X.product.query('TouchDate').value('.', 'nvarchar(500)'),
       X.product.query('DirectID').value('.', 'nvarchar(500)'),
       X.product.query('PassportID').value('.', 'nvarchar(500)'),

       X.product.query('NationalID').value('.', 'nvarchar(500)'),
       X.product.query('OtherID').value('.', 'nvarchar(50)'),
       X.product.query('DOB2').value('.', 'nvarchar(500)'),
       X.product.query('EntLevel').value('.', 'nvarchar(500)'),
       X.product.query('MasterID').value('.', 'int'),
       X.product.query('Watch').value('.', 'bit'),
       X.product.query('Relationships').value('.', 'bit')
FROM ( 
SELECT CAST(x AS XML)
FROM OPENROWSET(
     BULK 'C:\temp\teste.xml',
     SINGLE_BLOB) AS T(x)
     ) AS T(x)
CROSS APPLY x.nodes('Export/Entities') AS X(product);  
---工作版本,仅需42秒

DECLARE @X XML

SELECT @X = CAST(x AS XML)
FROM OPENROWSET(
     BULK 'C:\temp\teste.xml',
     SINGLE_BLOB) AS T(x)


INSERT INTO OSUSR_DFP_PEP_ENTITIES (ENT_ID, NAME, FIRSTNAME, LASTNAME, PREFIX, SUFFIX,
                      AKA, NAMESOURCE, PARENTID, GOVDESIGNATION, ENTRYTYPE, ENTRYCATEGORY, ENTRYSUBCATEGORY,
                      ORGANIZATION, POSITIONS, REMARKS, DOB, POB, COUNTRY, EXPIRATIONDATE, EFFECTIVEDATE, 
                      PICTUREFILE, LINKEDTO, RELATED_ID, SOURCEWEBLINK, TOUCHDATE, DIRECTID, PASSPORTID, 
                      NATIONALID, OTHERID, DOB2, ENTLEVEL, MASTERID, WATCH, RELATIONSHIPS) 
SELECT X.product.value('(Ent_ID/text())[1]', 'INT'),
       X.product.value('(Name/text())[1]', 'nvarchar(1000)'),
       X.product.value('(FirstName/text())[1]', 'nvarchar(500)'),
       X.product.value('(LastName/text())[1]', 'nvarchar(500)'),
       X.product.value('(Prefix/text())[1]', 'nvarchar(500)'),
       X.product.value('(Suffix/text())[1]', 'nvarchar(500)'),

       X.product.value('(Aka/text())[1]', 'nvarchar(500)'),
       X.product.value('(NameSource/text())[1]', 'nvarchar(500)'),
       X.product.value('(ParentID/text())[1]', 'INT'),
       X.product.value('(GovDesignation/text())[1]', 'nvarchar(500)'),
       X.product.value('(EntryType/text())[1]', 'nvarchar(500)'),
       X.product.value('(EntryCategory/text())[1]', 'nvarchar(500)'),
       X.product.value('(EntrySubCategory/text())[1]', 'nvarchar(500)'),

       X.product.value('(Organization/text())[1]', 'nvarchar(500)'),
       X.product.value('(Positions/text())[1]', 'nvarchar(500)'),
       X.product.value('(Remarks/text())[1]', 'nvarchar(max)'),
       X.product.value('(DOB/text())[1]', 'nvarchar(500)'),
       X.product.value('(POB/text())[1]', 'nvarchar(500)'),
       X.product.value('(Country/text())[1]', 'nvarchar(500)'),
       X.product.value('(ExpirationDate/text())[1]', 'nvarchar(500)'),
       X.product.value('(EffectiveDate/text())[1]', 'nvarchar(500)'),

       X.product.value('(PictureFile/text())[1]', 'nvarchar(500)'),
       X.product.value('(LinkedTo/text())[1]', 'nvarchar(500)'),
       X.product.value('(Related_ID/text())[1]', 'INT'),
       X.product.value('(SourceWebLink/text())[1]', 'nvarchar(max)'),
       X.product.value('(TouchDate/text())[1]', 'nvarchar(500)'),
       X.product.value('(DirectID/text())[1]', 'nvarchar(500)'),
       X.product.value('(PassportID/text())[1]', 'nvarchar(500)'),

       X.product.value('(NationalID/text())[1]', 'nvarchar(500)'),
       X.product.value('(OtherID/text())[1]', 'nvarchar(50)'),
       X.product.value('(DOB2/text())[1]', 'nvarchar(500)'),
       X.product.value('(EntLevel/text())[1]', 'nvarchar(500)'),
       X.product.value('(MasterID/text())[1]', 'INT'),
       X.product.value('(Watch/text())[1]'), 'bit',
       X.product.value('(Relationships/text())[1]', 'bit')

FROM @X.nodes('Export/Entities') AS X(product);  
我建议两件事

  • 将XML加载到XML变量,并在查询中使用XML变量
  • 将提取值的代码更改为仅使用
    .value
    和使用
    text()
  • 试试这个:

    DECLARE @X XML
    
    SELECT @X = CAST(x AS XML)
    FROM OPENROWSET(
         BULK 'C:\temp\teste.xml',
         SINGLE_BLOB) AS T(x)
    
    INSERT INTO OSUSR_DFP_PEP_ENTITIES
    .
    .
    .
    SELECT X.product.value('(Ent_ID/text())[1]'), 'INT'),
           X.product.value('(Name/text())[1]', 'nvarchar(1000)'),
    .
    .
    .
    FROM @X.nodes('Export/Entities') AS X(product);  
    

    只是在我的帖子中添加了一个新的版本,但是给了我这个错误;INSERT语句的select列表包含的项目少于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配。slect和insert在某些行中具有相同的列(“a”)”。它的作品。只需42秒将50MB xml文件加载到变量中可能会占用8倍的内存(感谢MSXML)。假设这是一个2GB的XML文件……有人能详细解释一下为什么需要
    /text()
    ?至少对于我当前的XML文件,它似乎在没有后缀的情况下工作。在这种情况下是否有任何性能提升?如果它有好处,我很乐意键入它,但如果它是一样的,我希望通过删除它来简化我的代码。@下划线\d这是出于性能原因。如果处理混合内容的XML,情况也有明显不同。不确定这里是否有详细说明其工作原理的答案。如果您想更详细地了解查询计划中的不同之处,请提出一个新问题,是什么让它更快。