Paolo Pialorsi

SOA, Workflow Foundation (WF), Windows Communication Foundation (WCF) e le Architetture Distribuite

News

Archives

OPENXML e Sharepoint

Questa sera ho risolto un problema di prestazioni che mi assillava da parecchi giorni. Avevo l'esigenza di restituire una lista di item di Sharepoint, filtrati in base a dei record che avevo in un database applicativo. La questione, di per sé banale, diventava critica dato che i record sia nel DB che in Sharepoint eranno diverse migliaia e non potendo (o meglio dire non volendo ... per non andare fuori dal modello ad oggetti del SDK di WSS/SPS) fare le query con una JOIN sul DB di Sharepoint, dovevo fare un pezzo di query con T-SQL e un altro con CAML ripetendo tra l'altro N volte la query CAML per esigenze mie applicative.

Ovviamente il risultato, dal punto di vista delle prestazioni, era molto deludente, tanto che, trattandosi di dati non troppo variabili nel tempo, avevo deciso di fare caching per 60 minuti del risultato, per rendere un po' meno pesante agli utenti la cosa (sono quelle "pezze" che non ti rendono mai troppo sereno se ami fare bene le cose....).

Poi questa sera - preso da un colpo di fulmine - ho trovato la soluzione ai miei problemi! Ho pensato: da una lista Sharepoint posso ottenere l'elenco dei record in formato XML. In SQL Server 2000 posso eseguire delle query OPENXML su un blob di testo che rappresenti un documento XML well-formed. Facendo 1+1=2 ho trovato la soluzione! Ora ho una stored procedure che fa la JOIN tra i dati applicativi in SQL e i dati ottenuti in XML da Sharepoint come se fossero una tabella di SQL (in effetti sotto OPENXML il buon SQL Server mi fa una tabella temporanea) e il gioco è fatto. Ora siamo passati da oltre 1 minuti di tempo di elaborazione (per me inaccettabile!!! Per questo non mi davo pace!) a pochi secondi di cui la gran parte sono spesi per eseguire una trasformazione XSLT del risultato e per passarlo via HTTP al client.

Riassumendo i punti chiave dell'attività:

  • Ottengo tutti gli item della lista Sharepoint con: myList.Items.Xml
  • Li carico come parametro di una stored procedure con una definizione simile a questa:

CREATE PROCEDURE dbo.spListXmlItems (
@XmlContacts ntext
)
AS
DECLARE @idXmlContacts int

exec sp_xml_preparedocument @idXmlContacts OUTPUT, @XmlContacts, '<root xmlns:z="#RowsetSchema" xmlns:rs="urn:schemas-microsoft-com:rowset"/>'

-- Qui in realtà nella mia SP faccio la JOIN con la tabella applicativa
SELECT * FROM OPENXML(@idXmlContacts, '/xml/rs:data/z:row', 1)

exec sp_xml_removedocument @idXmlContacts

  • Si noti il fatto che ho dovuto dichiarare i namespace XML con prefisso rs e z, che rappresentano i dati in formato ADODB.Recordset, usato anche da Sharepoint per rappresentare gli item di una lista
  • Nel mio caso poi il risultato è ancora un XML (infatto la stored procedure esegue una SELECT ... FOR XML EXPLICIT della JOIN tra la OPENXML e la tabella applicativa del mio DB SQL) per dare un risultato che deve essere elaborato in una trasformazione XSLT e restituito al client via HTTP
  • Spero che la mia folgorazione :-) di stasera possa magari essere utile anche ad altri, quindi ne ho lasciata traccia anche qui.

    Posted: mag 23 2005, 12:40 by paolo
    Filed under: