7 messaggi dal 17 settembre 2015
Ciao, ho un problema con una query che in realtà funziona ma impiega molto tempo nell'esecuzione.
Mi spiego meglio... dunque la query è questa:

SELECT
        DISTINCT UtentiMariani.dbo.Utenti.RagioneSociale AS CENTRO,
    (select sum(case when isnull(Gennaio,0) > 0  then 1 else 0 end) + sum(case when isnull(Febbraio,0) > 0  then 1 else 0 end) + sum(case when isnull(Marzo,0) > 0  then 1 else 0 end) + sum(case when isnull(Aprile,0) > 0  then 1 else 0 end) + sum(case when isnull(Maggio,0) > 0  then 1 else 0 end) + sum(case when isnull(Giugno,0) > 0  then 1 else 0 end) + sum(case when isnull(Luglio,0) > 0  then 1 else 0 end) + sum(case when isnull(Agosto,0) > 0  then 1 else 0 end) + sum(case when isnull(Settembre,0) > 0  then 1 else 0 end) + sum(case when isnull(Ottobre,0) > 0  then 1 else 0 end) + sum(case when isnull(Novembre,0) > 0  then 1 else 0 end) + sum(case when isnull(Dicembre,0) > 0  then 1 else 0 end) from dettclienti where dettclienti.assegnatario = UtentiMariani.dbo.utenti.idutente AND Annorif = 2018) As MENSILITA
    FROM
        UtentiMariani.dbo.utenti 
    INNER JOIN
        dettclienti 
            ON dettclienti.assegnatario = UtentiMariani.dbo.utenti.idutente 
    WHERE
        dettclienti.assegnatario in(select workers.Idutente as Dipendente from Gerarchia2 as mgrs, gerarchia2 as workers where (workers.lft between mgrs.lft and mgrs.rgt) and mgrs.idutente = 4)  AND Dettclienti.AnnoRif = 2018


Il problema sta nel WHERE finale dove c'è la clausola IN. Ora se all'interno della clausola IN ci metto una select come sopra evidenziata la query ci impiega 15 secondi per restituirmi i dati comunque corretti, ma se al posto della select ci metto direttamente i numeri del risultato di quella query, il risultato è immediato.
Cioe' sostituendo la query con i valori che vengono ricavati dalla stessa nella IN:
SELECT
        DISTINCT UtentiMariani.dbo.Utenti.RagioneSociale AS CENTRO,
    (select sum(case when isnull(Gennaio,0) > 0  then 1 else 0 end) + sum(case when isnull(Febbraio,0) > 0  then 1 else 0 end) + sum(case when isnull(Marzo,0) > 0  then 1 else 0 end) + sum(case when isnull(Aprile,0) > 0  then 1 else 0 end) + sum(case when isnull(Maggio,0) > 0  then 1 else 0 end) + sum(case when isnull(Giugno,0) > 0  then 1 else 0 end) + sum(case when isnull(Luglio,0) > 0  then 1 else 0 end) + sum(case when isnull(Agosto,0) > 0  then 1 else 0 end) + sum(case when isnull(Settembre,0) > 0  then 1 else 0 end) + sum(case when isnull(Ottobre,0) > 0  then 1 else 0 end) + sum(case when isnull(Novembre,0) > 0  then 1 else 0 end) + sum(case when isnull(Dicembre,0) > 0  then 1 else 0 end) from dettclienti where dettclienti.assegnatario = UtentiMariani.dbo.utenti.idutente AND Annorif = 2018) As MENSILITA
    FROM
        UtentiMariani.dbo.utenti 
    INNER JOIN
        dettclienti 
            ON dettclienti.assegnatario = UtentiMariani.dbo.utenti.idutente 
    WHERE
        dettclienti.assegnatario in(4,2,59)  AND Dettclienti.AnnoRif = 2018

la query è perfettamente funzionante e soprattutto velocissima.

Che cambia fra le due ?
Ci sto perdendo la testa.

Grazie a chi vorrà darmi una mano.
Giuseppe
Modificato da excalibur67 il 04 febbraio 2019 17:38 -
125 messaggi dal 05 novembre 2012
Ciao,

select workers.Idutente as Dipendente from Gerarchia2 as mgrs, gerarchia2 as workers where (workers.lft between mgrs.lft and mgrs.rgt) and mgrs.idutente = 4


una domanda stupida, ma se esegui la query nella clausola in quanto impiega?

Ciao

Alessio
790 messaggi dal 11 febbraio 2013
In genere se eseguo view con getdate() sul campo anno di tabelle grandi ottengo sempre performance peggiori di quando passo 2018

Forse il discorso delle funzioni non deterministiche vale anche qui...bho

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.