none
Particionamento Tabela Fato RRS feed

  • Pergunta

  • Boa Noite Srs,

    Tenho a seguinte tabela fato:

    CREATE TABLE [dbo].[FactVendas](
    [CodSKCliente] [int] NOT NULL,
    [CodSKRegiao] [int] NOT NULL,
    [CodSKProduto] [int] NOT NULL,
    [CodSKTempo] [int] NOT NULL,
    [ValorProduto] [numeric](18, 2) NULL,
    [QuantidadeVendido] [int] NULL,
     CONSTRAINT [PK_ResultadoFinanceiro] PRIMARY KEY CLUSTERED 
    (
    [CodSKCliente] ASC,
    [CodSKRegiao] ASC,
    [CodSKProduto] ASC,
    [CodSKTempo] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    )
    GO

    Desejo particionar a coluna CodSkTempo, desde então fiz o seguinte:


    ALTER DATABASE DBSQL
       ADD FILEGROUP FG1
    GO

    ALTER DATABASE DBSQL
    ADD FILE (
        NAME = N'FG1File', 
        FILENAME = N'C:\pasta\FG1.ndf',
        SIZE = 1024KB,
        MAXSIZE = 10485760KB,
        FILEGROWTH = 1024KB
    )
    TO FILEGROUP FG1
    GO

    -- OS VALORES ABAIXO CORRESPONDE AS DATAS DE 2010, 2012 E 2014

    CREATE PARTITION FUNCTION
      MyPartitionFunctionLeft
      (int)
      AS RANGE LEFT
      FOR VALUES (11157,11887,12618)
    GO

    CREATE PARTITION SCHEME myRangePS1
    AS PARTITION MyPartitionFunctionLeft
    TO (FG1,FG1,FG1,FG1);

    O que preciso? Particionar apenas a coluna CodSkTempo, porém a mesma fica dentro de um indice composto por outros, sendo assim, não tenho como colocar apenas esse indice dentro de um filegroup e particionar, pois fora o CodSkTempo indice, existem outros tambem...

    ao executar a consulta:


    select p.index_id, p.partition_number,
    pc.leaf_null_bit,
    coalesce(cx.name, c.name) as column_name,
    pc.partition_column_id,
    pc.max_inrow_length,
    pc.max_length,
    pc.key_ordinal,
    pc.leaf_offset,
    pc.is_nullable,
    pc.is_dropped,
    pc.is_uniqueifier,
    pc.is_sparse,
    pc.is_anti_matter
    from sys.system_internals_partitions p
    join sys.system_internals_partition_columns pc
    on p.partition_id = pc.partition_id
    left join sys.index_columns ic
    on p.object_id = ic.object_id
    and ic.index_id = p.index_id
    and ic.index_column_id = pc.partition_column_id
    left join sys.columns c
    on p.object_id = c.object_id
    and ic.column_id = c.column_id
    left join sys.columns cx
    on p.object_id = cx.object_id
    and p.index_id in (0,1)
    and pc.partition_column_id = cx.column_id
    where p.object_id = object_id('FactVendas')
    order by index_id, partition_number;

    obtive:

    index_id partition_number leaf_null_bit column_name partition_column_id
    1 1 1 CodSKCliente 1
    1 1 2 CodSKRegiao 2

    ....

    index_id partition_number leaf_null_bit column_name partition_column_id
    1 2 1 CodSKCliente 1
    1 2 2 CodSKRegiao 2

    Sendo que na verdade o seria seria 1 partição para todos, exceto CodSkTempo...

    Espero que tenham me entendido...

    Obrigado

    sábado, 26 de julho de 2014 23:46

Todas as Respostas

  • SqlServerDatabaseUser,

    Então mesmo este campo fazendo parte de uma chave primária composta você pode criar e utilizer o mesmo em um índice nonclustered.

    Mas esse não é o seu problema, como você quer particionar esta coluna não terá a possibilidade pois já existe um índice que esta coluna participa.

    Uma pergunta:

    - Não seria o caso de criar uma outra coluna que recebe o mesmo valor que CodSkTempo e fazer o particionamento nesta coluna?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    sexta-feira, 1 de agosto de 2014 18:43