215 messaggi dal 08 marzo 2012
Ciao,

posso programmaticamente verificare la "complessità" di una query per sollevare dei warning nel caso in cui sia troppo onerosa?

Esistono dei parametri di riferimento per comprendere la reale complessità di una query?

Mi riferisco nello specifico a SQL AZURE.

grazie
11.872 messaggi dal 09 febbraio 2002
Contributi
Ciao,
nel caso di Sql Azure hai proprio il Database Advisor che ti fornisce delle raccomandazioni.
https://docs.microsoft.com/it-it/azure/sql-database/sql-database-advisor

Leggi anche l'ultimo paragrafo che ti mostra anche altri strumenti di analizi che Azure può offrire.
https://docs.microsoft.com/it-it/azure/sql-database/sql-database-advisor#next-steps

ciao,
Moreno

Enjoy learning and just keep making
215 messaggi dal 08 marzo 2012
Grazie come sempre della risposta.
Ma a livello di codice non posso fare nulla?

Intendo vorrei prima di eseguire una query custom avere la possibilità di capire se "onerosa" e nel caso rifiutarne l'esecuzione per non appesantire il sistema.

Grazie e buone ferie!
11.872 messaggi dal 09 febbraio 2002
Contributi
Intendo vorrei prima di eseguire una query custom


Ah ok, tu quindi consenti ai tuoi clienti di definire delle proprie query SQL ma vuoi evitare che consumino troppe risorse.


Ma a livello di codice non posso fare nulla?

Sì, puoi usare ADO.NET per ottenere il piano di esecuzione stimato e, in base ai valori che SQL Server ti avrà comunicato, decidere se acconsentire all'esecuzione della query o no.

In pratica:
  • Prima esegui SET SHOWPLAN_XML ON
  • Poi mandi la query
  • Infine esegui SET SHOWPLAN_XML OFF
  • Parsi l'XML che viene restituito da SQL Server e leggi i valori
  • Decidi se eseguire la query o restituire un errore


Ecco un esempio:
https://social.msdn.microsoft.com/Forums/en-US/aaf5e9c9-a222-414a-baed-5c0adcc329e2/accessing-query-execution-plan-results-programmatically?forum=sqldatabaseengine

Ed ecco la documentazione di SET SHOWPLAN_XML che come vedi si può usare anche su Sql Azure.
https://docs.microsoft.com/it-it/sql/t-sql/statements/set-showplan-xml-transact-sql?view=sql-server-2017

ciao,
Moreno
Modificato da BrightSoul il 13 agosto 2019 20:26 -

Enjoy learning and just keep making
215 messaggi dal 08 marzo 2012
Ciao,


Ma a livello di codice non posso fare nulla?

Sì, puoi usare ADO.NET per ottenere il piano di esecuzione stimato e, in base ai valori che SQL Server ti avrà comunicato, decidere se acconsentire all'esecuzione della query o no.

In pratica:
  • Prima esegui SET SHOWPLAN_XML ON
  • Poi mandi la query
  • Infine esegui SET SHOWPLAN_XML OFF
  • Parsi l'XML che viene restituito da SQL Server e leggi i valori
  • Decidi se eseguire la query o restituire un errore


Ecco un esempio:
https://social.msdn.microsoft.com/Forums/en-US/aaf5e9c9-a222-414a-baed-5c0adcc329e2/accessing-query-execution-plan-results-programmatically?forum=sqldatabaseengine

Ed ecco la documentazione di SET SHOWPLAN_XML che come vedi si può usare anche su Sql Azure.
https://docs.microsoft.com/it-it/sql/t-sql/statements/set-showplan-xml-transact-sql?view=sql-server-2017

sto provando ad integrare la funzione ma non mi permette di usare i "parameters" classici di ADO.Net.
In pratica mi accetta la query sono se la compongono come "concatenazione" di stringhe...cosa che vorrei evitare per motivi di security.
Tra l'altro i valori che mi restituisce come posso interpretarli?

Ovvero da cosa capisco se una query rientra nell'ordine di complessità che mi sta bene eseguire?

Grazie!
11.872 messaggi dal 09 febbraio 2002
Contributi
Ciao,


sto provando ad integrare la funzione ma non mi permette di usare i "parameters" classici di ADO.Net.

Prova ad usare questo pacchetto NuGet per ottenere una query in cui i valori dei parametri siano uniti al resto della query.
https://www.nuget.org/packages/MsSqlHelper

Ecco un esempio completo.
var connString = @"...";
using (var conn = new SqlConnection(connString))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SET SHOWPLAN_XML ON";
        cmd.ExecuteNonQuery();
    }
    using (var cmd = conn.CreateCommand())
    {
        var sql = "SELECT * FROM Tabella WHERE Id=@id";
        var parameters = new SqlParameter[]
        {
            new SqlParameter("id", 2)
        };
        //Uso la classe SqlGenerator per unire query e parametri
        cmd.CommandText = new SqlGenerator().CreateExecutableSqlStatement(sql, CommandType.Text, parameters);

        using (var reader = cmd.ExecuteReader())
        {
            reader.Read();
            var xml = reader.GetString(0);
            //TODO: parsing dell'XML ed estrazione dei valori interessanti
        }
    }
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SET SHOWPLAN_XML OFF";
        cmd.ExecuteNonQuery();
    }
}



Tra l'altro i valori che mi restituisce come posso interpretarli?

E' un documento XML che contiene i valori che visualizzeresti in Sql Server Management Studio.
Vedi questa immagine.
https://i.stack.imgur.com/zs6mK.png
Qui c'è un minimo di spiegazione:
https://blog.sqlauthority.com/2010/01/22/sql-server-execution-plan-estimated-io-cost-estimated-cpu-cost-no-unit/


Ovvero da cosa capisco se una query rientra nell'ordine di complessità che mi sta bene eseguire?

Prendi a modello una query tosta che reputi troppo complessa e leggi i valori misurati. Se la query che l'utente vuole eseguire ha valori maggiori o uguali a quella, gliela blocchi.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.