none
particion mediante indice cluster

    Pregunta

  • Hola!

    necesito hacer una particion de una tabla bastante grande de sql server 2005, quiero hacerlo mediante un indice cluster.

    ya hice mi funcion y mi esquema así 

    CREATE PARTITION FUNCTION [pfglDistribution] (smalldatetime)
    AS RANGE RIGHT FOR VALUES
    ('20120101');
    GO
    
    CREATE PARTITION SCHEME [psglDistribution] 
    AS PARTITION pfglDistribution TO ('PRIMARY', 'SECONDARY');

    y luego creando el indice cluster, aquí es donde tengo la duda si está correcto el paso

    IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[gl_distribution_b]') AND name = N'XPKgl_distribution_b')
    ALTER TABLE [dbo].[gl_distribution_b] ADD  CONSTRAINT [XPKgl_distribution_b] PRIMARY KEY CLUSTERED 
    (
    	[jrnlsrc_id] ASC,
    	[batch_no] ASC,
    	[journal_no] ASC,
    	[journal_seqno] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON psglDistribution(tran_date)
    GO
    

    leí varios articulos e incluso algunos post de este mismo foro pero no quisiera tener que recrear la tabla y en este link encontré que es posible particionar sin tener que hacerlo, ¿lo estoy interpretando y escribiendo correctamente?

    http://www.mssqltips.com/sqlservertip/1914/sql-server-database-partitioning-myths-and-truths/

    lunes, 21 de mayo de 2012 16:45

Respuestas

  • No, no lo estas haciendo bien. Los indices se crean usando la sentencia CREATE INDEX, no ALTER TABLE.

    Una la sentencia CREATE INDEX, y adiciona la opcion WITH (DROP_EXISTING = ON). Esta opcion ayudara a no tener que recrear los indices nonclustered. La columna usada para particionar la tabla debe formar parte de la clave del indice, si este es unico.

    Mi pregunta, este indice clustered existe debido a la existencia de una clave primaria?

    Si es asi y la columna [tran_date] no es parte de la clave primaria, entonces tendras que pensar en la estrategia a usar, puesto que al adicionar la columna [tran_date] a esa clave, se puede perder la unicidad.

    Una opcion es eliminar los indices nonclustered, eliminar la restriccion de clave primaria, crear el indice clustered usando [tran_date], adicionar la clave primaria especificando que se use un indice nonclustered, y adicionar los indices nonclustered preferiblemente alineados a la particion. Claro esta, que si existe alguna restriccion de clave foranea que referencia esta clave primaria, entonces tendras que eliminarla, antes de eliminar la restriccion de clave primaria, y luego adicionarlas al final.


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta Ozkr2c martes, 22 de mayo de 2012 4:30
    lunes, 21 de mayo de 2012 17:56

Todas las respuestas

  • No, no lo estas haciendo bien. Los indices se crean usando la sentencia CREATE INDEX, no ALTER TABLE.

    Una la sentencia CREATE INDEX, y adiciona la opcion WITH (DROP_EXISTING = ON). Esta opcion ayudara a no tener que recrear los indices nonclustered. La columna usada para particionar la tabla debe formar parte de la clave del indice, si este es unico.

    Mi pregunta, este indice clustered existe debido a la existencia de una clave primaria?

    Si es asi y la columna [tran_date] no es parte de la clave primaria, entonces tendras que pensar en la estrategia a usar, puesto que al adicionar la columna [tran_date] a esa clave, se puede perder la unicidad.

    Una opcion es eliminar los indices nonclustered, eliminar la restriccion de clave primaria, crear el indice clustered usando [tran_date], adicionar la clave primaria especificando que se use un indice nonclustered, y adicionar los indices nonclustered preferiblemente alineados a la particion. Claro esta, que si existe alguna restriccion de clave foranea que referencia esta clave primaria, entonces tendras que eliminarla, antes de eliminar la restriccion de clave primaria, y luego adicionarlas al final.


    AMB

    Some guidelines for posting questions...

    • Marcado como respuesta Ozkr2c martes, 22 de mayo de 2012 4:30
    lunes, 21 de mayo de 2012 17:56
  • tienes razón me equivoqué, si seria con el create index y si es una llave unica, no puedo cambiarla, actualmente tengo ese indice no-custered que seria remplazado por el clustered.

    pues he ahi mi duda, el particionado no será atraves de la clave primaria, el indice cluster es como lo pongo, pero la particion de la tabla seria atraves de la columna tran_date de tipo fecha.



    lunes, 21 de mayo de 2012 18:58
  • el indice seria así

    CREATE CLUSTERED INDEX idx ON tblPartitioned(
            [jrnlsrc_id] ASC,
    	[batch_no] ASC,
    	[journal_no] ASC,
    	[journal_seqno] ASC
    ) 
    WITH (DROP_EXISTING = ON, ONLINE = ON)
    ON psglDistribution(tran_date)

    pero efectivamente el campo por el que quiero particionar no está en el indice, está bien si lo hago asi de todas formas?

    saludos.

    lunes, 21 de mayo de 2012 21:20

  • bueno, asi quedó finalmente y al parecer funcionó, solo tengo que comprobarlo, no pudo ser por la fecha

    saludos.

    CREATE PARTITION FUNCTION [pfglD] (int)
    AS RANGE RIGHT FOR VALUES
    ('600000');
    GO
    
    CREATE PARTITION SCHEME [psglD] 
    AS PARTITION pfglD TO ('PRIMARY', 'SECONDARY');
    
    USE [ADT]
    GO
    create UNIQUE CLUSTERED INDEX [XPKgl] ON [dbo].[gld] 
    (
    	[jrnlsrc_id] ASC,
    	[batch_no] ASC,
    	[journal_no] ASC,
    	[journal_seqno] ASC
    )WITH (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 [psglD]([journal_seqno])
    GO
    

    martes, 22 de mayo de 2012 4:30
  • Pregunta, hay alguna recomendación, sugerencia, regla o que se yo, respecto a usar clustered o nonclustered como indice para partición? porque yo vi en todos los tutoriales que usan el clustered para la partición, sin embargo yo preferiría usar un nonclustered.

    Roy Sillerico

    jueves, 17 de mayo de 2018 18:47