Qual é a sua abordagem para otimizar tabelas grandes (+ 1 milhão de linhas) no SQL Server?

Estou importando dados do mercado de ações brasileiro para um banco de dados SQL Server. No momento, tenho uma tabela com informações de preços de três tipos de ativos: ações, opções e forwards. Ainda estou com dados de 2006 e a tabela possui mais de meio milhão de registros. Como tenho mais 12 anos para importar, a tabela excederá um milhão de registros, com certeza.

Agora, minha primeira abordagem para otimização foi manter os dados em um tamanho mínimo, então reduzi o tamanho da linha para uma média de 60 bytes, com as seguintes colunas:

[Stock] [int] NOT NULL
[Date] [smalldatetime] NOT NULL
[Open] [smallmoney] NOT NULL
[High] [smallmoney] NOT NULL
[Low] [smallmoney] NOT NULL
[Close] [smallmoney] NOT NULL
[Trades] [int] NOT NULL
[Quantity] [bigint] NOT NULL
[Volume] [money] NOT NULL

Agora, a segunda abordagem para otimização era criar um índice em cluster. Na verdade, o índice primário é limpo automaticamente e eu o tornei um índice composto com os campos Estoque e Data. Isso é único, não posso ter dois dados de cotação para o mesmo estoque no mesmo dia.

O índice com clareza garante que as cotações da mesma ação fiquem juntas eprovavelmente ordenado por data. Esta segunda informação é verdadeira?

Neste momento, com meio milhão de registros, está demorando200ms selecionar700 cotações de um ativo específico. Acredito que esse número aumentará conforme a tabela crescer.

Agora, para uma terceira abordagem, estou pensando em talvez dividir a mesa em três tabelas, cada uma para um mercado específico (ações, opções e forwards). Provavelmente, isso reduzirá o tamanho da tabela em 1/3. Agora, essa abordagem ajudará ou não importa muito? No momento, a tabela tem 50mb de tamanho, para que possa caber inteiramente na RAM sem muitos problemas.

Outra abordagem seria usar o recurso de partição do SQL Server. Não sei muito sobre isso, mas acho que é normalmente usado quando as tabelas são grandes e você pode se estender por vários discos para reduzir a latência de E / S, certo? O particionamento seria útil neste caso? Acredito que posso particionar os valores mais recentes (anos recentes) e os valores mais antigos em tabelas diferentes. A probabilidade de procurar dados mais recentes é maior e, com uma pequena partição, provavelmente será mais rápida, certo?

Quais seriam outras boas abordagens para tornar isso o mais rápido possível? O uso principalmente selecionado da tabela será para buscar um intervalo específico de registros de um ativo específico, como os últimos 3 meses do ativo X. Haverá outros usos, mas este será o mais comum, sendo possível ser executado por mais de 3k usuários simultaneamente.

questionAnswers(9)

yourAnswerToTheQuestion