Atualmente, estou tentando ajustar um procedimento armazenado um tanto problemático e notei que a maioria dos custos associados à execução vem da análise de alguns XML em uma tabela temporária. Aqui está o SQL em questão:
CREATE TABLE #ChangeSet
(
RemarkTypeID TINYINT NOT NULL PRIMARY KEY,
RemarkText VARCHAR(2500) NOT NULL,
ListingID INT NOT NULL
)
INSERT INTO #ChangeSet
(RemarkTypeID,
RemarkText,
ListingID)
SELECT
T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID,
T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText,
@ListingID
FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c)
Além disso, para ter uma idéia da estrutura do XML que está sendo analisada:
<Remarks>
<Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" />
<Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211768" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="3" RemarkText="aaaell Maintained 3Bd 1.5Ba Semi-Detached Home In Cambridge Gardens. Garage W As Converted Into A Nice Family Room The Outside Is Maintence Free. Includes All Appliances,Security System,Storage Shed,Ceiling Fans And New Carpet.This Home Is Very Well Pricded. Seller Will Consider Fha Or Va Along With Conventional Finacing. This Is A Great Buy." />
</Remarks>
Há algo que eu possa fazer para melhorar o desempenho da análise desses nós XML e da configuração dessa tabela temporária?
sql-server
xml
temporary-tables
jdm5310
fonte
fonte
Respostas:
Você poderia tentar
OPENXML
. Agora eu normalmente não recomendo,OPENXML
pois ele tem vários problemas de memória conhecidos (basicamente, pode levar 1/8 do seu buffer pool dependendo do tamanho do XML) (!! TODO add link). Seja qual for a lenda, é mais rápido para pedaços maiores de XML, portanto vale a pena tentar em um ambiente de desenvolvimento / teste e, se você conhece os problemas de memória e obtém o desempenho, cabe a você decidir o que mais precisa. Algo assim:Lembre-se de sempre ligar
sp_xml_removedocument
. Suponho que seu XML real seja muito maior. Você pode nos dar uma idéia de quantosRemark
elementos ele terá e qual o tamanho em KB / MB. Voltarei ao post mais tarde e montarei uma plataforma de teste para comparar o desempenho com base em suas estatísticas.ATUALIZAÇÃO: De acordo com o script de exemplo, seu XML pode ter no máximo 256
Remark
elementos com um comprimento máximo de 2500. Depois de criar um exemplo de XML para atender a esses critérios e testá-lo, há pouco desempenho entre as duas técnicas, e ambos terminar em sub-segundo. Nesse caso, eu escolheria o tipo de dados e métodos XML. Você pode fornecer as outras informações solicitadas, por favor?fonte
Há duas coisas principais que você pode fazer para melhorar o desempenho da análise de XML:
fonte