2011-01-12 13 views
15

¿Es posible dividir una tabla utilizando 2 columnas en lugar de solo 1 para la función de partición?Particionamiento de tabla con 2 columnas

considere una tabla con 3 columnas

 
    ID (int, primary key, 
    Date (datetime), 
    Num (int) 

Quiero particionar esta tabla por 2 columnas: Date y Num.

Esto es lo que hago para particionar una tabla usando la columna 1 (fecha):

create PARTITION FUNCTION PFN_MonthRange (datetime) 
AS 
RANGE left FOR VALUES ('2009-11-30 23:59:59:997', 
         '2009-12-31 23:59:59:997', 
         '2010-01-31 23:59:59:997', 
         '2010-28-02 23:59:59:997', 
         '2010-03-31 23:59:59:997') 
go 

Respuesta

34

malas noticias: la función La partición tiene que definirse en una sola columna.

Buenas noticias: Esa única columna podría ser una persisted computed column que es una combinación de las dos columnas por las que intenta dividir.

+5

No estoy seguro de que su "Malas noticias" es correcta. No tengo problemas para especificar una partición en varias columnas, p. 'SELECT ROW_NUMBER() OVER (PARTICIÓN POR a.c1, b.c2, a.c3 ORDER BY a.c1, b.c2, a.c3, a.c4) FROM ...', y http: // msdn .microsoft.com/en-us/library/ms189461% 28v = sql.105% 29.aspx muestra claramente que puede especificar expresiones de valores múltiples para la partición. ¿Me estoy perdiendo de algo? – Nathan

+4

@ Nathan: La pregunta original era sobre [particionamiento de tabla] (http://msdn.microsoft.com/en-us/library/ms190787.aspx), no sobre funciones de ventana. –

+2

¡ah! Mirando la otra respuesta votada, ¡supongo que no soy el único que cometió ese error! – Nathan

2

Nativamente, no puede dividir por dos columnas en SQL Server.

Hay algunas cosas que podrías hacer, tener una tabla de búsqueda que usas para extraer el entero arbitario (partición) en el que se encuentra cada valor, pero solo tienes 1000 particiones como máximo, por lo que van a empezar a ocupar el mismo espacio. El enfoque de la columna calculada sufre el mismo problema, tiene un límite de partición de 1k, es probable que lo arruine.

Probablemente me limito a una partición de fecha, y el rango el primer día del mes, en lugar de ir a la izquierda en la última parte del mes.

¿Qué piensa obtener del segundo valor de partición?

18

Me pareció que era una solución más fácil

select ROW_NUMBER() over (partition by CHECKSUM(value,ID) order by SortOrder) as Row From your_table 
+0

¡Esto funciona maravillosamente! ¡Gracias! –

+8

Checksum puede producir el mismo valor de salida a partir de diferentes valores de entrada, (básicamente una colisión hash). Por lo tanto, este método no es 100% confiable. Entonces, si su partición debe ser correcta, no use este método. Si puede tolerar una partición incorrecta rara, entonces esto está bien. – Nathan

Cuestiones relacionadas