none
Comportamento anomalo select RRS feed

  • Domanda

  • Ciao,

    ho un database con numerose tabelle. ho creato una view che mi restituisce 3119 record.

    SELECT        TOP (100) PERCENT dbo.RegistroIspezioni.IDRegistroIspezioni, dbo.RegistroIspezioni.TipoIspezione, dbo.[02_ELENCOOPERE].[Codice Opera], 
                             dbo.[02_ELENCOOPERE].Via, dbo.[02_VIA].Denominazione, dbo.[02_ELENCOOPERE].[Denominazione Opera], YEAR(dbo.RegistroIspezioni.DataIspezione) 
                             AS AnnoIspezione, dbo.Ispezioni.Valutazione
    FROM            dbo.Ispezioni INNER JOIN
                             dbo.[08_Distinta_Elementi] ON dbo.Ispezioni.COD_ES = dbo.[08_Distinta_Elementi].COD_ES INNER JOIN
                             dbo.[02_VIA] INNER JOIN
                             dbo.[02_ELENCOOPERE] ON dbo.[02_VIA].ID_Gestore = dbo.[02_ELENCOOPERE].ID_Gestore AND dbo.[02_VIA].Codice = dbo.[02_ELENCOOPERE].Via ON 
                             dbo.[08_Distinta_Elementi].CodiceOpera = dbo.[02_ELENCOOPERE].[Codice Opera] AND 
                             dbo.[08_Distinta_Elementi].Via = dbo.[02_ELENCOOPERE].Via RIGHT OUTER JOIN
                             dbo.RegistroIspezioni ON dbo.Ispezioni.IDRegistroIspezioni = dbo.RegistroIspezioni.IDRegistroIspezioni
    WHERE        (YEAR(dbo.RegistroIspezioni.DataIspezione) = 2012) AND (dbo.RegistroIspezioni.IDRegistroIspezioni > 461) AND (dbo.RegistroIspezioni.IDRegistroIspezioni < 476)

    ORDER BY dbo.RegistroIspezioni.IDRegistroIspezioni

    se poi faccio un select della view ci mette quasi 9 minuti ad eseguirla

    SELECT TOP (100) PERCENT [IDRegistroIspezioni]
          ,[TipoIspezione]
          ,[Codice Opera]
          ,[Via]
          ,[Denominazione]
          ,[Denominazione Opera]
          ,[AnnoIspezione]
          ,[Valutazione]

      FROM [G:\LAVORO SOFTWARE\SIOS\DATI\105400_SATAP A21.MDF].[dbo].[View_1]

    se sostituisco 'TOP (100) PERCENT' con 'TOP (99.999) PERCENT' l'esecuzione avviene in 2 secondi restituendo sempre 3119 record.

    qualcuno sa spiegarmi perchè? in altri casi simili non esegue nemmeno la query ed il software che si interfaccia con il database si blocca.

    uso anche altri database che hanno la stessa struttura e record ovviamente diversi ma, le istruzioni Select vanno tutte a buon fine.

    Grazie

    Marco

    martedì 16 settembre 2014 12:22

Risposte

  • Ciao. Le cause possono essere molteplici. Basta cancellare un indice per stravolgere il comportamento una query.

    Fondamentale è la corretta manutenzione del database.

    Qui puoi trovare una spiegazione.

    Manutenzione database


    vibi6

    • Contrassegnato come risposta itamarcus martedì 23 settembre 2014 12:27
    martedì 16 settembre 2014 18:58

Tutte le risposte

  • Ciao.

    Premetto che non so dirti perché c'è il rallentamento nella esecuzione della tua vista.

    Dovresti studiarti il piano di esecuzione per cercare di capire.

    Ad ogni modo potresti fare questa prova.

    La clausola SELECT TOP (100) PERCENT nella tua vista è necessaria solo perché in essa hai indicato una clausola ORDER BY. La ORDER BY, infatti, non è possibile utilizzarla in una vista se non utilizzando, ad esempio, una clausola TOP.

    Potresti provare ad eliminare TOP e ORDER BY nella vista e ad eseguire la vista con la clausola ORDER BY per vedere cosa succede.


    vibi6

    martedì 16 settembre 2014 13:10
  • ho ricreato le tabelle coinvolte su un nuovo database e tutto funziona regolarmente.

    e' possibile che quel database si sia 'ingrippato'?

    se si, c'è latro rimedio che ripartire da zero con un nuovo database 'vergine'?

    martedì 16 settembre 2014 18:24
  • Ciao. Le cause possono essere molteplici. Basta cancellare un indice per stravolgere il comportamento una query.

    Fondamentale è la corretta manutenzione del database.

    Qui puoi trovare una spiegazione.

    Manutenzione database


    vibi6

    • Contrassegnato come risposta itamarcus martedì 23 settembre 2014 12:27
    martedì 16 settembre 2014 18:58

  • La clausola SELECT TOP (100) PERCENT nella tua vista è necessaria solo perché in essa hai indicato una clausola ORDER BY. La ORDER BY, infatti, non è possibile utilizzarla in una vista se non utilizzando, ad esempio, una clausola TOP.


    non mi risulta proprio questa cosa ossia non è affatto obbligatorio usare TOP quando serve la clausola ORDER BY quindi si può tranquillamente scrivere

    select * from [tabella] order by [campo]

    senza usare TOP

    ref: http://msdn.microsoft.com/it-it/library/ms189463.aspx


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    mercoledì 17 settembre 2014 12:29
    Moderatore

  • La clausola SELECT TOP (100) PERCENT nella tua vista è necessaria solo perché in essa hai indicato una clausola ORDER BY. La ORDER BY, infatti, non è possibile utilizzarla in una vista se non utilizzando, ad esempio, una clausola TOP.


    non mi risulta proprio questa cosa ossia non è affatto obbligatorio usare TOP quando serve la clausola ORDER BY quindi si può tranquillamente scrivere

    select * from [tabella] order by [campo]

    senza usare TOP

    ref: http://msdn.microsoft.com/it-it/library/ms189463.aspx


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    Ciao Edoardo.

    Stiamo parlando di VISTE e in una vista non puoi usare ORDER BY.

    Qualcuno, per poterlo fare, usa il trucco della SELECT TOP (100) PERCENT.


    vibi6

    mercoledì 17 settembre 2014 13:03
  • hai ragione, non avevo colto il particolare che si parlava di viste.

    anzi, ho notato ora che se aggiungi la clausola order by in una vista, SSMS aggiunge automaticamente la TOP.


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org


    mercoledì 17 settembre 2014 13:25
    Moderatore
  • C'è da dire che la documentazione MSDN sull'argomento:

    http://msdn.microsoft.com/it-it/library/ms187956.aspx

    precisa questo:

    Importante

    La clausola ORDER BY viene utilizzata esclusivamente per determinare le righe restituite dalla clausola TOP oppure OFFSET nella definizione della vista.

    La clausola ORDER BY non garantisce risultati ordinati in caso di query sulla vista, a meno che tale clausola non venga specificata anche nella query.

    Quindi, se ho ben interpretato, il trucco sarebbe anche inutile.


    vibi6


    • Modificato vibi6 mercoledì 17 settembre 2014 13:47 Formattazione testo
    mercoledì 17 settembre 2014 13:46
  • ho fatto una routine che ricostruisce da zero il database e tutti gli errori svaniscono.

    grazie

    martedì 23 settembre 2014 12:28