Ottimizzare view

giovedì 21 novembre 2013 - 13.00

jjchuck Profilo | Senior Member

ciao a tutti...
ho una vista che impiega 1 m e 46 secondi...(12 tabelle e 24 colonne)

come posso migliorare le performance ?

premetto che ho già ridotto le sciocchezze a zero: non ci sono order by, pochissimi filtri....ecc

basta indicizzarla per fare la differenza?

se si come? tempo fa mi ero cimentato anche in storedprocedure...ma era qualcosa di piu grande di me...

alx_81 Profilo | Guru

>ciao a tutti...
ciao

>ho una vista che impiega 1 m e 46 secondi...(12 tabelle e 24 colonne)
>come posso migliorare le performance ?
di cosa? Di solito la vista è una query salvata sul database, ma è fatta per essere riutilizzata nel codice, non solo come una semplice tabella.
Vuoi ottimizzare la chiamata nella vista? Oppure una query che la consuma? Questo cambia abbastanza il punto di vista.

>premetto che ho già ridotto le sciocchezze a zero: non ci sono
>order by, pochissimi filtri....ecc
sciocchezze... dipende
A volte i filtri sono importantissimi per ridurre i set.
Le order by invece nelle viste non andrebbero mai fatte, a meno che la vista non contenga una clausola di TOP.

>basta indicizzarla per fare la differenza?
vediamo di capire come la chiami e com'è fatta.

>se si come? tempo fa mi ero cimentato anche in storedprocedure...ma era qualcosa di piu grande di me...
sono due tipi di oggetti differenti. La vista è una tabella virtuale, La stored procedure è una programmabilità, che ti dà anche la possibilità di spezzare il lavoro per renderlo più performante e anche ricco di logiche.

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

jjchuck Profilo | Senior Member

>>ciao a tutti...
>ciao
>
>>ho una vista che impiega 1 m e 46 secondi...(12 tabelle e 24 colonne)
>>come posso migliorare le performance ?
>di cosa? Di solito la vista è una query salvata sul database,
>ma è fatta per essere riutilizzata nel codice, non solo come
>una semplice tabella.
>Vuoi ottimizzare la chiamata nella vista? Oppure una query che
>la consuma? Questo cambia abbastanza il punto di vista.
>forse tutte e due
>>premetto che ho già ridotto le sciocchezze a zero: non ci sono
>>order by, pochissimi filtri....ecc
>sciocchezze... dipende
>A volte i filtri sono importantissimi per ridurre i set.
>Le order by invece nelle viste non andrebbero mai fatte, a meno
>che la vista non contenga una clausola di TOP.
>
>>basta indicizzarla per fare la differenza?
>vediamo di capire come la chiami e com'è fatta.
>
>>se si come? tempo fa mi ero cimentato anche in storedprocedure...ma era qualcosa di piu grande di me...
>sono due tipi di oggetti differenti. La vista è una tabella virtuale,
>La stored procedure è una programmabilità, che ti dà anche la
>possibilità di spezzare il lavoro per renderlo più performante
>e anche ricco di logiche.

ciao ale
voglio ridurre il tempo di esecuzione (
ho studiato un paio di testi sulle view...mi ricordo solo una cosa
scherzi a parte
ricordo che inserendo un indice clust da "fisicità" (oddio spero non ho scritto na ca...ta) alla view e quindi con l'indice i tempi per "ritrovare i record" sono minori...ricordo anche che usare dati deterministici è meglio (dare 2013 anziche year(getdate()) è meglio)...
insomma tutto quello che ricordo ...non mi serve a molto

SELECT CASE line WHEN A THEN '1' WHEN B THEN '2' WHEN C THEN '3' ...ELSE 'X' END AS linea, SUM(CASE WHEN docume LIKE 'N%' THEN - valor ELSE valor END) AS fatt_netto, SUM(CASE WHEN docume LIKE 'N%' THEN - qta ELSE qta END) AS quantita, anno, articolo, collezione... FROM TAB INNER JOIN TAB1 INNER JOIN ... = ... ...INNER JOIN... ...INNER JOIN... ...INNER JOIN... ...INNER JOIN... ...LEFT OUTER JOIN... ...LEFT OUTER JOIN... ...LEFT OUTER JOIN... ...RIGHT OUTER JOIN... .... WHERE (TAB1.docume <> 'XX') AND (TAB1.docume <> 'YY') GROUP BY line, anno, ............. HAVING (TAB1.line <> '7') AND (TAB1.line <> '8')

Non so se ti è utile ma nella sostanza è questa

alx_81 Profilo | Guru

>ricordo che inserendo un indice clust da "fisicità" (oddio spero
>non ho scritto na ca...ta) alla view e quindi con l'indice i
>tempi per "ritrovare i record" sono minori...ricordo anche che
>usare dati deterministici è meglio (dare 2013 anziche year(getdate())
>è meglio)...
una vista, in quanto "tabella virtuale" non è di per sé una tabella. Quindi se applichi un clustered index ed uno schemabinding, crei, di fatto una vista persistita con tanto di dati.
Poi è chiaro che essendo tale, è manutenuta e quindi la lettura costa meno di una "query al volo".

>Non so se ti è utile ma nella sostanza è questa
in base alla query, vedo che utilizzi funzioni di aggregazione, raggruppamenti e filtri su raggruppamenti.
Per prima cosa io lancerei la query che va lenta vedendo che piano di esecuzione viene utilizzato.
Poi in base a quello noterai che ci sono problemi e, addirittura, già indici consigliati.
Hai provato a controllare il piano?
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

jjchuck Profilo | Senior Member

si ora ho incluso il piano di esecuzione e ineffetti in corrispondenza di alcuni passaggi ci sono costi di esecuzione elevati:
scansione delle due tabelle principali (testate,righe) e poi in hash match aggregate...
questi i principali
però non ho trovato consigli sugli indici...

debbo imparare a leggere bene il piano...almeno credo

alx_81 Profilo | Guru

>debbo imparare a leggere bene il piano...almeno credo
facciamo così, posta comando e relativo piano.


Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

jjchuck Profilo | Senior Member

lo farei volentieri ma come faccio: coi dati sensibili intendo?

alx_81 Profilo | Guru

>lo farei volentieri ma come faccio: coi dati sensibili intendo?
I nomi delle tabelle e degli indici intendi?
puoi anonimizzare il piano con:
http://www.sqlsentry.net/plan-explorer/sql-server-query-view.asp#features


Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

jjchuck Profilo | Senior Member

si un pò tutto...uno come te una volta letti i primi tre caratteri di un campo già lo associa al produttore...come io una volta sentita una battuta suonata da Weckl...so subito che è lui

cmq già mi avresti aiutato...nell'altro post (view indicizzata) hai praticamente risolto

scusa ho visto solo ora il link...

provo un camuffamento fatto in casa: ho provato ad installare ma nel test di connessione dava errore percui non ho continuato l'installazione

jjchuck Profilo | Senior Member

/*
Dettagli indice mancanti in Vista.sql - SERVER.db (jonata (95))
Query Processor stima che l'implementazione del seguente indice potrebbe migliorare il costo della query di 68.1226%.
*/

/*
USE [db]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[TABRIGHEFATT] ([Anno])
INCLUDE ([Campo Chiave1],[Campo Chiave2],[Campo Chiave2],[articolo],[Quantita],[Importo])
GO
*/
bastava clik dx "Dettagli indici manacanti" ....mi vergogno...

quindi che faccio

jjchuck Profilo | Senior Member

non sono riuscito ad installare il programma suggerito...dava errore nel test di connessione percui ho desistito

però SONO RIUSCITO A FARE LA MIA PRIMA VIEW INDICIZZATA

quanta sincerità: ha sempre ragione lui...ho seguito tutti gli errori e alla fine me la fatta

ho tolto gli outer join...le viste ...ho usato isnull per i campi valore...ho tolto l'espressione su un campo che veniva raggruppato
...insomma ho seguito tutti gli errori con pazienza e come mi dicesti tu una volta ...APPROFONDISCI
sono troppo frettoloso
cmq ora inizio a muovermi...il prox passo sarà la mia prima SP...

ciao

alx_81 Profilo | Guru

>dicesti tu una volta ...APPROFONDISCI
grande!

>cmq ora inizio a muovermi...il prox passo sarà la mia prima SP...
e questo vedrai che è più semplice, è programmabilità..
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5