Nel file di mapping ho queste due definizioni:
<sql-query name="sp_Test1">
<return-scalar column="Field5" type="Int32" />
exec MyStoredProcedure :Param1, :Param2, :Param3, :Param4
</sql-query>
<sql-query name="sp_Test2">
<return-scalar column="Field5" type="Int32" />
<![CDATA[
SELECT Field5 FROM MyTable WHERE Field1 = :Param1 AND Field2 = :Param2 AND Field3 = :Param3 AND Field4 = :Param4 ORDER BY Field5
]]>
</sql-query>
Il codice sql di "sp_Test2" è esattamente lo stesso codice presente all'interno della stored procedure.
Ora, se io eseguo un test come questo:
int count = 2500;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i=0; i<=count; i++) {
//Esecuzione query "sp_Test1"
}
sw.Stop();
//Stampa sw.ElapsedMilliseconds
sw.Reset();
sw.Start();
for (int i=0; i<=count; i++) {
//Esecuzione query "sp_Test2"
}
sw.Stop();
//Stampa sw.ElapsedMilliseconds
inserendo la chiamata alle query all'interno di un ciclo (in questo caso 2500 chiamate consecutive), ho questo risultato:
il ciclo di chiamate alla query sp_Test1 impiega meno di un secondo ad essere completato, mentre il ciclo di chiamate alla sp_Test2 impiega circa 20 secondi ad essere completato!
Qualcuno sa dirmi quale potrebbe essere la causa di questo degrado di performance? ...e se c'è un modo per ottimizzare l'esecuzione della query sp_Test2?
N.B. per fare questi test ho utilizzato NHibernate 2.1.2
Vi ringrazio in anticipo per ogni informazione utile a riguardo.
<sql-query name="sp_Test2">
<return-scalar column="Field5" type="Int32" />
<![CDATA[
DECLARE @Param1 nvarchar(30)
DECLARE @Param2 nvarchar(30)
DECLARE @Param3 nvarchar(30)
DECLARE @Param4 smallint
SET @Param1 = :Param1
SET @Param2 = :Param2
SET @Param3 = :Param3
SET @Param4 = :Param4
SELECT Field5 FROM MyTable WHERE Field1 = :Param1 AND Field2 = :Param2 AND Field3 = :Param3 AND Field4 = :Param4 ORDER BY Field5
]]>
</sql-query>
scrivendo la query in questo modo non riscontro più i problemi di performance ed ho sostanzialmente gli stessi temi di esecuzione tra stored procedure e sql nativo.