Creazione indici

venerdì 19 gennaio 2007 - 12.00

trinity Profilo | Guru

scusate un attimo, in una tabella di sql server express dopo aver creato la chiave primaria ti permette di gestire gli indici, se io volessi che + di una colonna del tabella fosse indicizzata devo fare n indici in base a n colonne oppure in una sola creazione dell'indice posso dire quali campi volgio indicizzare?

vede immagine in allegato ho fatto un indice con dentro due campi, oppure dovevo fare due indici per due campi?

Ciao

1280x1024 131Kb

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alx_81 Profilo | Guru

>scusate un attimo, in una tabella di sql server express dopo
>aver creato la chiave primaria ti permette di gestire gli indici,
>se io volessi che + di una colonna del tabella fosse indicizzata
>devo fare n indici in base a n colonne oppure in una sola creazione
>dell'indice posso dire quali campi volgio indicizzare?
ciao!
tu puoi creare indici relativi a una o più colonne. Dipende sempre l'uso che ne devi fare..
Ad esempio, se sai che su di una determinata tabella userai la where o il criterio di una join su di un campo, puoi pensare di fare l'indice solo su quel campo. Viceversa, se ne usi due, puoi pensare di scriverne uno per due campi..
Ma sai, la mia definizione è un po' aleatoria, poichè oltretutto non esistono solo GLI INDICI, ma possono essere CLUSTERED O NONCLUSTERED, UNIQUE, ecc.. E anche qui si apre un mondo..
Inizia a leggerti la documentazione sugli indici sui BOL..

dipende molto da come hai scritto il db e da che operazioni devi fare su di esso, e soprattutto dipende anche dal modo con cui devi effettuare tali operazioni..

Comunque sia, controllati lo statement CREATE INDEX sui Books on line..
(non riesco a passarti il link poichè MSDN non mi ritorna alcuna pagina, mah..)

>Ciao
>Cirillo Fabio
>www.wondernet.biz
>fabio@wondernet.biz
>http://blogs.dotnethell.it/fabiocirillo/

Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

ma fondamentalmente devo fare delle where e delle join ma solo su un determinato campo quindi a questo punto posso tranquillamente creare tutti gli indici che voglio in base alle ricerche che devo fare.

per esempio una piccola curiosità

io ho due tabelle nella quale devo effettuare delle join tra loro allora ti illustro le due tabelle:

tabella anagrafica

vari campi che non elenco....

codstatonascita
codcittadinanza
codstatoresidenza


tabella nazioni

descrizione
codice

ecco con la join devo prendere il codice nazione che scrivo nella tabella anagrafica e ricercarlo nella tabella nazioni da cui devo prelevare la descrizione corrispondente. questo non c'è problema ma in questo esempio nella tabella anagrafica devo indicizzare singolarmente i campi: "codstatonascita", "codcittadinanza", "codstatoresidenza" oppure posso fare un solo indice ed inserire questi campi visto che dovranno essere in collegamento con il campo "codice" della tabella nazioni il quale è a sua volta indicizzato?

ecco un classico esempio in cui mi sono imbattuto.


ti faccio un'altro esempio, sempre nella tabella anagrafica ho due campi, dataarrivo e datapartenza

questi due campi serviranno per delle where tramite delle between oppure delle where utilizzando singolarmente o a dataarrivo o la datapartenza a questo punto potrei creare un solo indice che raggruppa entrambi i campi, giusto? invece di creare due indici per due campi, questo è il dilemma che mi sono posto
Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

lbenaglia Profilo | Guru

>ecco con la join devo prendere il codice nazione che scrivo nella
>tabella anagrafica e ricercarlo nella tabella nazioni da cui
>devo prelevare la descrizione corrispondente. questo non c'è
>problema ma in questo esempio nella tabella anagrafica devo indicizzare
>singolarmente i campi: "codstatonascita", "codcittadinanza",
>"codstatoresidenza" oppure posso fare un solo indice ed inserire
>questi campi visto che dovranno essere in collegamento con il
>campo "codice" della tabella nazioni il quale è a sua volta indicizzato?

Ciao Fabio,

esistono tomi immensi sull'argomento, ma che possono solo delineare delle linee guida sull'utilizzo degli indici.
Studiati la differenza tra indici clustered e non clustered, quando è oppurtuno utilizzare gli uni e gli altri, quando è il caso di scrivere "query coperte" (covered query), quando configurare il fill factor ed il pad index e via dicendo.

Dopo aver digerito la teoria inizia a sperimentare. Esegui una serie di test con diverse tipologie di indici (ovviamente scartando le combinazioni palesemente errate) ed analizza attentamente i piani di esecuzione, scegliendo la configurazione che offre le migliori prestazioni.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Fondamentalmente il significato di clustered e nn clustered lo so la mia domanda era se se dovessi avere 2 o 3 campi in una tabella che con un join devo collegarsi(uso questo termine perchè ora nn mi viene la parola giusta) con una tabella che ha lo stesso tipo campo dei campi della precedente tabella, ecco a questo punto io indicizzo i campi rendendoli non clustered ma in sql server 2005 quando creo gli indici in cascata mi permette di selezionare + di un campo della tabella sotto un unico come di indice. Non cambia nulla se metto sotto un unico indice + campi di una tabella, i quali verranno utilizzati per un join? oppure devo fare n indici per n campi? Questo era quello che volevo capire, solo la funzionalità a livello di sql server e non la gestione degli indici, forse è stata colpa mia che ho spiegato male.

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

lbenaglia Profilo | Guru

>Fondamentalmente il significato di clustered e nn clustered lo
>so
E sai anche quando andrebbe utilizzato l'uno o l'altro?

>ecco a questo
>punto io indicizzo i campi rendendoli non clustered
Perché? C'è un motivo particolare?

>ma in sql
>server 2005 quando creo gli indici in cascata mi permette di
>selezionare + di un campo della tabella sotto un unico come di
>indice.
Anche SQL Server 6.5 lo permetteva

>Non cambia nulla se metto sotto un unico indice + campi
>di una tabella, i quali verranno utilizzati per un join?
>oppure devo fare n indici per n campi?
Creare un undice su due o più colonne è completamente differente rispetto ad avere un altro indice sulle stesse colonne ma in ordine diverso, oppure avere un undice su una colonna ed includere altre colonne non chiave nel leaf level di un indice nonclustered, o ancora avere 1 indice per ogni colonna.
Qual è la soluzione più efficiente?
Dipende, ogni caso è a sè stante. Kalen Delaney suggerisce sempre di sperimentare, ovvero implementa diverse tipologie di indici e scegli quella che ti offre le prestazioni migliori.

>Questo era quello che volevo
>capire, solo la funzionalità a livello di sql server e non la
>gestione degli indici, forse è stata colpa mia che ho spiegato
>male.
No, ti sei spiegato benissimo, ma la risposta la devi trovare da solo visto che la base dati l'hai tu e conosci il modo in cui verrà interrogata.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

per esempio sto facendo delle prove su una winform con e senza un indice di tipo non clustered e non univoco perchè non è chiave primaria, solo che utilizzando prima della query un now per determinare il tempo e dopo
non esce differenza in quanto massimo si arriva a vedere i secondi e non i decimi. c'è un modo per vedere la velocità

e poi la differenza di clustered e non clustered è che il primo ordina i record per esempio in ordine alfabetico in base al campo indicizzato mentre il secondo fa la ricerca senza ordine, giusto?


cmq secondo me se ho + campi che devo essere utilizzati come join su un'unica altra tabella, potrei anche creare un solo indice e inserirci dentro i campi da indicizzare, senza fare tanti indici per quanti campi mi servono, tanto devono puntare alla stessa tabella

almeno penso io


ciao

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

lbenaglia Profilo | Guru

>per esempio sto facendo delle prove su una winform con e senza
>un indice di tipo non clustered e non univoco perchè non è chiave
>primaria, solo che utilizzando prima della query un now per determinare
>il tempo e dopo
>non esce differenza in quanto massimo si arriva a vedere i secondi
>e non i decimi. c'è un modo per vedere la velocità
Le prove di performance devono essere eseguite con tabelle contenenti milioni di righe aventi una distribuzione il più possibile randomica.
Come client puoi utilizzare sqlcmd oppure SSMSE.
Per stabilire il tempo di esecuzione di una query puoi impostare a ON SET STATISTICS TIME:
http://msdn2.microsoft.com/en-us/ms190287.aspx

>e poi la differenza di clustered e non clustered è che il primo
>ordina i record per esempio in ordine alfabetico in base al campo
>indicizzato mentre il secondo fa la ricerca senza ordine, giusto?
Quello che hai scritto è privo di senso.
Leggi bene i Books Online e prenditi tutto il tempo necessario a digerire questi concetti.

>cmq secondo me se ho + campi che devo essere utilizzati come
>join su un'unica altra tabella, potrei anche creare un solo indice
>e inserirci dentro i campi da indicizzare, senza fare tanti indici
>per quanti campi mi servono, tanto devono puntare alla stessa
>tabella
Dimostralo

>almeno penso io
Guarda, io penso che è inutile sparare soluzioni senza dimostrarle, solo al termine di test seri ed approfonditi ha senso asserire qualcosa.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

>per esempio sto facendo delle prove su una winform con e senza
>un indice di tipo non clustered e non univoco perchè non è chiave
>primaria,
Non è detto che un indice non possa essere unique se non chiave primaria, potresti averne comunque uno ed una pk basata su di una chiave surrogata.

>solo che utilizzando prima della query un now per determinare
>il tempo e dopo
>non esce differenza in quanto massimo si arriva a vedere i secondi
>e non i decimi. c'è un modo per vedere la velocità
Credo di non aver capito quello che chiedi..
>
>e poi la differenza di clustered e non clustered è che il primo
>ordina i record per esempio in ordine alfabetico in base al campo
>indicizzato mentre il secondo fa la ricerca senza ordine, giusto?
Credo tu debba riguardarti la teoria per benino sugli indici.. come ti ha detto Lorenzo.. c'è veramente un mondo ed un mondo di possibilità.. gli indici sono quelle cose per cui le best practices sono ricavate da te, in base alla tua struttura dati.
guardati gli ndici sui BOL, credimi, e studiati per bene tutto quello che c'è :

>
>
>cmq secondo me se ho + campi che devo essere utilizzati come
>join su un'unica altra tabella, potrei anche creare un solo indice
>e inserirci dentro i campi da indicizzare, senza fare tanti indici
>per quanti campi mi servono, tanto devono puntare alla stessa
>tabella
potrebbe essere corretto.. ma la via dello sperimentare è la migliore da seguire.. anche perchè devi anche ragionare sul fatto che a quella tabella, su quei campi potrebbero esserci (e facilmente sarà così) altre relazioni.. oltretutto non necessariamente implicanti tutte le colonne.. quindi analizza bene la situazione, e vai di piani di esecuzione..
>
>almeno penso io
>
>
>ciao
Ciao!
>
>Cirillo Fabio
>www.wondernet.biz
>fabio@wondernet.biz
>http://blogs.dotnethell.it/fabiocirillo/

Alx81 =)

http://blogs.dotnethell.it/suxstellino
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5