Um dos recursos que eu gosto no SQL 2008 é como algumas pessoas dizem Datacompression, mas o recurso que eu mais gosto é o índice filtrado.
Com esse recurso, você pode criar índices de cobertura em um pequeno subconjunto de dados para consultas especializadas. Isso melhorará muito o desempenho das consultas que usarão o índice filtrado.
Digamos que você tenha uma tabela como essa
CREATE TABLE [DWH].[contract](
[ID] int IDENTITY(100000000,1) NOT NULL,
[reportDate] [datetime] NOT NULL,
[contractnumber] [varchar](15) NOT NULL,
[_instrument_ID] [int] NULL,
[_package_ID] [int] NULL,
[_portfolio_ID] [int] NULL,
[_counterpart_ID] [int] NULL,
[ValueX] [datetime] NULL,
[ValueY] [datetime] NULL,
[ValueZ] [varchar](20) NULL,
[Status] int not null,
CONSTRAINT [PK_contract] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_contract_1] ON [DWH].[contract]
(
[reportDate] ASC
)
INCLUDE ( [ValueX],[ValueY],[ValueZ]
)
WHERE STATUS=10
GO
Quando você usa a seguinte consulta, o mecanismo não precisa fazer uma pesquisa de índice e uma pesquisa de índice em cluster:
SELECT ValueX, ValueY, ValueZ FROM dwh.contract WHERE reportdate=GETDATE() AND Status=10
O SQL resolverá a consulta apenas com uma busca de índice, já que todos os dados necessários para a consulta existem no índice. E, além disso, o índice contém apenas registros com Status = 10, isso afetará o desempenho de INSERT / UPDATE / DELETE.
/ Håkan Winther