Indici

giovedì 23 dicembre 2010 - 18.53
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows XP  |  Visual Studio 2008  |  SQL Server 2005

Zagor60 Profilo | Junior Member

Salve ,

come potrei migliorare l'indicizzazione delle seguenti tabelle :

tabella A tabella B tabella C tabella D
IDAutovettura (PK - int) idviaggio (PK -int) iddati (PK-int) IDrifornimento (PK-int)
AutoNome numeratoreviaggi int IDAutoautovettura (PK -int) idviaggio (pk-int)
anno smallint IdViaggio(pk-int) idautovettura (pk-int)
datapartenza (datetime)

Specifico:
Un'auto (targa ...) fa un viaggio (per es. (01/10) e più rifornimenti durante il viaggio.
Tabella A e tabella B sono uno a uno (un auto , un viaggio)
tabella C e tabella D uno a molti (un auto , molti rifornimenti)
Sono giuti l'indici o errati, o se migliorabili)?

alx_81 Profilo | Guru

>Salve ,
Ciao

potresti mandarci la struttura con la create, o comunque indentata? Non si capisce molto.. e non vorrei fare errori di valutazione.
Detto questo, per la scelta degli indici, di solito, si fa una indagine mirata in base alle query che fai sulle tabelle in termini di operazioni/aggregazioni/ordinamenti/filtri/joins.. ecc..
Insomma, dipende molto dalle specifiche funzionali che ti richiede il business..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Zagor60 Profilo | Junior Member

tabella A
IDAutovettura (PK - int)
AutoNome

tabella B
idviaggio (PK -int)
numeratoreviaggi int
anno smallint

tabella C
iddati (PK-int)
IdViaggio(pk-int)
idautovettura (pk-int)
datapartenza (datetime)
....

tabella D
IDrifornimento (PK-int)
IDAutoautovettura (PK -int)
idviaggio (pk-int)


Specifico:
Un'auto (targa ...) fa un viaggio (per es. (01/10) e più rifornimenti durante il viaggio.
Tabella A e tabella B sono uno a uno (un auto , un viaggio)
tabella C e tabella D uno a molti (un auto , molti rifornimenti)

alx_81 Profilo | Guru

>Specifico:
>Un'auto (targa ...) fa un viaggio (per es. (01/10) e più rifornimenti
>durante il viaggio.
>Tabella A e tabella B sono uno a uno (un auto , un viaggio)
>tabella C e tabella D uno a molti (un auto , molti rifornimenti)
al di là dell'analisi che non posso conoscere (ad esempio un'auto => un viaggio non è un po' restrittivo?) direi che sei tempestato di campi sulla primary key.
Di default sql server crea un indice clustered per le pk, quindi sei copertissimo per tanti casi.
Però, e torno a ripetere quanto ti dicevo nel primo post, è importante capire quali tipi di interrogazioni fai su questi dati.
Ad esempio, quali sono le query che usa la tua applicazione per fare ricerche mirate e/o report?
L'indice dovrebbe essere una struttura di supporto che velocizza l'accesso al dato alleggerendo le operazioni di I/O di conseguenza..
Senza sapere il requisito di business è difficile capire come fare tuning delle strutture.
Probabilmente avrai bisogno di indici nonclustered ad esempio sulle date, affinchè tu possa velocizzare ricerche basate sul range dei periodi. Ma sto dicendo cose generiche.
Studiare gli indici corretti è un task che richiede tempo, analisi di situazioni reali e conoscenza di tutti i software che utilizzeranno la base dati..

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

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Zagor60 Profilo | Junior Member

Grazie,

il programma è un pò complesso da spiegare l'avevo sintetizzato con esempio. Era solo capire come impostare gli indici, nel senso che quale deve essere primary e quale foreign. cmq grazie , mi hai fatto capire un po il funzionamento.

alx_81 Profilo | Guru

>il programma è un pò complesso da spiegare l'avevo sintetizzato
>con esempio. Era solo capire come impostare gli indici, nel senso
>che quale deve essere primary e quale foreign. cmq grazie , mi
>hai fatto capire un po il funzionamento.
Mi piacerebbe esserti più di aiuto, spero tu capisca che per dimensionare indici c'è bisogno di un livello di conoscenza del sistema un po' più approfondito..

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

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Zagor60 Profilo | Junior Member

Ciao,
hai ragione non è semplice con due frasi gestire il tutto, ma siccome il tutto è un pò complesso perchè sono molte tabelle, molte query ecc. quindi diventa laborioso inserire il tutto.
Le tabelle che avevo fatto come esempio era una forma semplicistica del funzionamento per cui si puo riassumere cosi
un auto , esegue un viaggio 01/2011 e durante il tragitto fa dei rifornimenti,, quindi l'auto con i riferimenti sarà uno a molti . Tutto qui.

cmq ti ringrazio e Approfitto di farti gli auguri di un buon natale.

Ciao

alx_81 Profilo | Guru

>Ciao,
Ciao

>Le tabelle che avevo fatto come esempio era una forma semplicistica
>del funzionamento per cui si puo riassumere cosi
>un auto , esegue un viaggio 01/2011 e durante il tragitto fa
>dei rifornimenti,, quindi l'auto con i riferimenti sarà uno a
>molti . Tutto qui.
Ti do solo un consiglio, guarda le where soprattutto, e fai gli indici anche in base a quelle. Perchè è molto importante fare i filtri su insiemi ordinati.


>cmq ti ringrazio e Approfitto di farti gli auguri di un buon natale.
Auguri anche a te!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Zagor60 Profilo | Junior Member

Ciao,

puoi farmi per piace un esempio di:

uno a uno
e
uno a molti

Grazie

alx_81 Profilo | Guru

un esempio di relazione? di foreign key?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Zagor60 Profilo | Junior Member

Salve,
si esempio con primary key, foreign key, anche perchè in quanto in sql server certe volte durante la relazione tra due tabelle mi dà l'avviso che esse non hanno relazioni unique.

Su gli indici nelle query (where) , si l'avevo già impostate in modo da effettuare ciò che volevo .


Ciao

alx_81 Profilo | Guru

>Salve,
>si esempio con primary key, foreign key, anche perchè in quanto
>in sql server certe volte durante la relazione tra due tabelle
>mi dà l'avviso che esse non hanno relazioni unique.
sì, perchè una primary key o una unique key devono esistere per stabilire la relazione..
Comunque eccoti un esempio di 1:1 e 1:N:

USE tempdb; GO -- creazione di una ipotetica tabella utenti. -- In essa viene definita la PK su un codice progressivo IDUtente. -- La chiave parte da 1 e incrementa, ad ogni inserimento, di 1. -- Il campo IDProvincia è il legame verso la tabella province sotto definita. CREATE TABLE dbo.Utenti ( IDUtente int IDENTITY(1, 1) NOT NULL , Nome varchar(30) NOT NULL , Cognome varchar(30) NOT NULL , IndirizzoResidenza varchar(30) NOT NULL , IDProvincia int NOT NULL , CONSTRAINT PK_dboUtenti PRIMARY KEY CLUSTERED ( IDUtente ) ) -- creazione tabella province CREATE TABLE dbo.Province ( IDProvincia int NOT NULL , Nome varchar(30) NOT NULL , CONSTRAINT PK_dboProvince PRIMARY KEY CLUSTERED ( IDProvincia ) ) -- creazione tabella UtentiEstesa CREATE TABLE dbo.UtentiEstesa ( IDUtente int NOT NULL , Note varchar(MAX) NOT NULL , CONSTRAINT PK_dboUtentiEstesa PRIMARY KEY CLUSTERED ( IDUtente ) ) -- relazione 1:N (1 Provincia, N Utenti) ALTER TABLE dbo.Utenti ADD CONSTRAINT FK_dboUtenti_dboProvince FOREIGN KEY (IDProvincia) REFERENCES dbo.Province(IDProvincia) GO -- relazione 1:1 (1 Utente, 1 UtentiEstesa) ALTER TABLE dbo.UtentiEstesa ADD CONSTRAINT FK_dboUtentiEstesa_dboUtenti FOREIGN KEY (IDUtente) REFERENCES dbo.Utenti(IDUtente) GO -- pulizia DROP TABLE dbo.UtentiEstesa DROP TABLE dbo.Utenti DROP TABLE dbo.Province GO


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

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5