none
Creazione di un indice un po particolare RRS feed

  • Domanda

  • Salve ragazzi sono ancora a chiedervi un parere sulla creazione di un particolare indice.

    mi spiego meglio .Per prima cosa ho 2 tabelle fatte in questo modo.

    CREATE TABLE [dbo].[Term](
     [IdTerm] [bigint] IDENTITY(1,1) NOT NULL,
     [IdTermType] [int] NULL,
     [IdSite] [int] NULL,
     [IdComType] [smallint] NOT NULL,
     [Address1] [smallint] NOT NULL,
     [Address2] [varchar](30) NULL,
     [TermDesc] [varchar](50) NULL,
     [Enabled] [smallint] NOT NULL,
     [TimeZone] [smallint] NULL,
     [ComNumber] [smallint] NULL,
     [Baud] [int] NULL,
     [ModemName] [varchar](50) NULL,
     [TcpAddress] [varchar](15) NULL,
     [TcpPort] [smallint] NULL,
     [Network] [varchar](20) NULL,
     [Interface] [varchar](20) NULL,
     [NetTimer] [smallint] NULL,
     [IsOnLine] [bit] NULL,
     CONSTRAINT [PK_Term] PRIMARY KEY CLUSTERED
    (
     [IdTerm] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

     

    CREATE TABLE [dbo].[IdeMitt](
     [IdIdeMitt] [bigint] IDENTITY(1,1) NOT NULL,
     [IdTerm] [bigint] NOT NULL,
     [IdIdeMittType] [smallint] NOT NULL,
     [IdeNum] [smallint] NOT NULL,
     [IdFascia] [int] NULL,
     [IdTecno] [int] NULL,
     [IdAreaIn] [smallint] NULL,
     [IdAreaOut] [smallint] NULL,
     [IdGroup] [smallint] NULL,
     [IdeMittDesc] [varchar](30) NOT NULL,
     [Enabled] [bit] NOT NULL,
     [InsDisAll] [smallint] NULL,
     [GlobalNum] [smallint] NULL,
     CONSTRAINT [PK_IdeMitt] PRIMARY KEY CLUSTERED
    (
     [IdIdeMitt] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]


    CREATE UNIQUE NONCLUSTERED INDEX [IX_IdeMitt] ON [dbo].[IdeMitt]
    (
     [IdTerm] ASC,
     [IdeNum] ASC,
     [IdIdeMittType] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO

    Per spiegarmi meglio

    La tabella Term rappresenta gli apparecchi
    dove idtermtype è il tipo di apparecchio

    la tabella IdeMitt rappresenta gli accessori che sono collegati all'apparecchio.

    fino a poco tempo fa esistevano x numero di apparecchi di x tipi ma che comunque ognuno di questi poteva possedere
    soltanto 2 accessori(IdeMitt) di tipo IdIdemittType identificati con numero IdeNum.

    Per questo su IdeMitt esisteva un indice aggiuntivo "pippo" con i campi IdTerm+IdeNum
    il campo IdIdeMittType rappresenta il tipo di accessorio

    Fin Qui tutto ok.
    Adesso con l'introduzione di un nuovo apparecchio di tipo idtermtype sono nate alcune diverse regole
    Esempio

    Gli apparecchi di tipo idtermtype compreso nell'intervallo 1-19 dovrebbero seguire le regole fin qui descritte
    1 apparecchi max 2 accessori (il corretto indice nella tabelle IdeMitt  sarebbe IdTerm+IdeNum)

    gli apparecchi di tipo idtermtype >19 (20 x la precisione) dovrebbero seguire altre regole
    infatti ognuno di questi puo avere più tipi di accessori(IdIdemittType) e ognuno di questi accessori
    avere una sua numerazione(IdeNum) per cui l'idice corretto sarebbe IdTerm + IdeNum + IdIdeMittType

    Cosi facendo però soddisfo una condizione ma non l'altra.

    Sperando di essermi spiegato correttamente dico
    A parte tutti i controlli che uno puo fare per le select e gli insert
    possibile secondo voi soddifare tutte e due le condizioni nella tabella IdeMitt cioe
    avere un indice IdTerm+IdeNum x tutti i Term di Tipo idtermtype (1-19)
    e IdTerm + IdeNum + IdIdeMittType x tutti i Term di Tipo idtermtype (20)


    Secondo me no devo stare cosi ma non si sa mai ed è per questo che chiedo

    Saluti

    GianPiero

    Ps Se ho scritto qualche sciocchezza ditemelo

    martedì 16 novembre 2010 09:09

Risposte

  • Ciao GianPiero

    Sì, è possibile creare indici filtrati ma solo in SQL 2008, ma nel tuo caso si cerca di filtrare i campi idtermtype
    che non appartiene a tabella IdeMitt.
    in questo caso vi consiglio di creare 2 vista con le condizioni proposte da voi.

    In allegato è una esempio di come creare 2 indici filtrati :

    CREATE TABLE test(
    [codice1] int,
    [codice2] int,
    [nome] [nchar](50)
    ) ON [PRIMARY]
    GO
    CREATE NONCLUSTERED INDEX INDtest1 ON test(codice1) WHERE codice1 < 20
    CREATE NONCLUSTERED INDEX INDtest2 ON test(codice1,codice2) WHERE codice1 >= 20
    GO
    

     

    Vantaggi di indici filtrati
    Gli indici filtrati è uno dei più grandi miglioramento delle prestazioni introdotte in SQL Server 2008. Un indice filtrato ci permette di creare un filtro per indicizzare gli righe di una tabella. cioè, gli sviluppatori o amministratori di database possono creare gli indici cluster con una clausola WHERE.

     


    Best regards
    • Contrassegnato come risposta brggpr mercoledì 17 novembre 2010 14:06
    • Contrassegno come risposta annullato brggpr mercoledì 17 novembre 2010 14:13
    • Contrassegnato come risposta Andrea MontanariModerator mercoledì 17 novembre 2010 16:26
    mercoledì 17 novembre 2010 07:07

Tutte le risposte

  • Ciao GianPiero

    Sì, è possibile creare indici filtrati ma solo in SQL 2008, ma nel tuo caso si cerca di filtrare i campi idtermtype
    che non appartiene a tabella IdeMitt.
    in questo caso vi consiglio di creare 2 vista con le condizioni proposte da voi.

    In allegato è una esempio di come creare 2 indici filtrati :

    CREATE TABLE test(
    [codice1] int,
    [codice2] int,
    [nome] [nchar](50)
    ) ON [PRIMARY]
    GO
    CREATE NONCLUSTERED INDEX INDtest1 ON test(codice1) WHERE codice1 < 20
    CREATE NONCLUSTERED INDEX INDtest2 ON test(codice1,codice2) WHERE codice1 >= 20
    GO
    

     

    Vantaggi di indici filtrati
    Gli indici filtrati è uno dei più grandi miglioramento delle prestazioni introdotte in SQL Server 2008. Un indice filtrato ci permette di creare un filtro per indicizzare gli righe di una tabella. cioè, gli sviluppatori o amministratori di database possono creare gli indici cluster con una clausola WHERE.

     


    Best regards
    • Contrassegnato come risposta brggpr mercoledì 17 novembre 2010 14:06
    • Contrassegno come risposta annullato brggpr mercoledì 17 novembre 2010 14:13
    • Contrassegnato come risposta Andrea MontanariModerator mercoledì 17 novembre 2010 16:26
    mercoledì 17 novembre 2010 07:07
  • Questa notizia è veramente interessante grazie Badii.

    Adesso ti pongo un'altra domanda.

    Se potessi usare un capo di IdeMitt ad esmpio GlobalNum per replicare il valore di Term.IdTermType la cosa sarebbe possibile?

    Oppure in fase di inserimento i controlli sull'indice vengono eseguiti prima della scrittura definitiva?

    cioe se in un insert in IdeMitt io pongo il valore di IdeMitt.GlobalNum = Term.IdTermType

    secondo te potrei creare questi 2 indici in base a IdeMitt.GlobalNum?

    Comunque vada grazie?

     

     

    • Contrassegnato come risposta brggpr mercoledì 17 novembre 2010 14:12
    • Contrassegno come risposta annullato Andrea MontanariModerator mercoledì 17 novembre 2010 16:26
    mercoledì 17 novembre 2010 14:12
  • Sì, è possibile, è anche possibile utilizzare il trigger (INSERT) per aggiornare il valore di campo IdeMitt.GlobalNum con Term.IdTermType .
    In questo caso è possibile utilizzare i seguenti indici:

    CREATE NONCLUSTERED INDEX INDEX1 ON IdeMitt(IdTerm,IdeNum) WHERE GlobalNum<20
    CREATE NONCLUSTERED INDEX INDEX2 ON IdeMitt(IdTerm,IdeNum,IdIdeMittType) WHERE GlobalNum>=20
    GO
    

     

     


    Best regards
    mercoledì 17 novembre 2010 15:20