SQL - SQL Server 2016 - NonCluster Column Store Index

 
Vista:
sin imagen de perfil
Val: 5
Ha disminuido su posición en 83 puestos en SQL (en relación al último mes)
Gráfica de SQL

SQL Server 2016 - NonCluster Column Store Index

Publicado por Cesar Guillen (5 intervenciones) el 10/06/2016 00:31:58
Hola tengo unas dudas con este tema, estoy intentando usar NonClustered ColumnStore Index en Sql Server 2016, tengo entendido que ahora el Column Store es actuaizable por medio del OLTP.

El punto es que unas consultas me duraban mucho tiempo 6-8mins, apliqué el columnStore y el tiempo se redujo a aproximadamente unos 30segundos, lo cual es muy bueno, pero agregé un registro en el detalle y las mismas consultas pasron a durar más de 7minutos. Despues me he enfocado solo en los datos historicos SIN ACTUALIZAR NINGUNA TABLA.

Mi escenario es el siguiente:

Tengo 4 tablas (EncVtas con 9millones de registros, DetVtas con 39 Millones de Registros, Productos con 3.500 registros y Restaurantes con 60 Registros)

DESEO Saber y entender porque no obtengo buen rendimiento en mis consultas y como poder optimizarlas.

Hice pruebas con mis consultas cambiando: ,SUM(DetVtas.PreVta * DetVtas.UniVen) AS Total por SUM(DetVtas.PreVta) * sum(DetVtas.UniVen) AS Total , y el rendimiento fue igual.

Los column store generados fueron en EncVtas los campos Descuento y SubTotal, adicional luego agregue NumFactura para el Count()
En DetVtas el Column Store contiene los campos: PreVta y UniVen

Las estructuras de mis tablas son las siguientes:

CREATE TABLE [dbo].[Restaurantes](
[CodRestaurante] [char](2) NOT NULL,
[NomRestaurante] [varchar](30) NULL,
[CodProvincia] [smallint] NULL,
[CodCanton] [smallint] NULL,
CONSTRAINT [PK_Restaurantes] PRIMARY KEY CLUSTERED
(
[CodRestaurante] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[EncVtas](
[CodRest] [char](2) NOT NULL,
[NumFactura] [numeric](10, 0) NOT NULL,
[TipoFactura] [char](2) NULL,
[NumOrden] [varchar](6) NULL,
[CodCliente] [varchar](12) NULL,
[NomCliente] [varchar](30) NULL,
[NumAdicional] [varchar](5) NULL,
[TipoCliente] [char](1) NULL,
[CodCaja] [char](2) NULL,
[CodCajero] [char](2) NULL,
[CodSalonero] [char](2) NULL,
[CodSupervisor] [char](2) NULL,
[FecFactura] [datetime] NOT NULL,
[SubTotal] [money] NOT NULL,
[Descuento] [money] NULL,
[ImptoServicio] [money] NULL,
[ImptoVentas] [money] NULL,
[ImptoVta] [real] NULL,
[Anulada] [int] NULL,
[MotivoAnulacion] [varchar](100) NULL,
[NumCierre] [int] NULL,

CONSTRAINT [PK_EncVtas] PRIMARY KEY CLUSTERED
(
[CodRest] ASC,
[NumFactura] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[DetVtas](
[CodRest] [char](2) NOT NULL,
[NumFactura] [numeric](10, 0) NOT NULL,
[NumLin] [numeric](5, 0) NOT NULL,
[CodPro] [char](5) NULL,
[NomPro] [varchar](50) NULL,
[PreVta] [money] NULL,
[PorDescto] [real] NULL,
[UniVen] [float] NULL,
[Anulada] [int] NULL,
[TipoServicio] [char](1) NULL,
[ImptoVta] [float] NULL,
[Impreso] [bit] NULL,
[CostoPro] [money] NULL,

CONSTRAINT [PK_DetVtas] PRIMARY KEY CLUSTERED
(
[CodRest] ASC,
[NumFactura] ASC,
[NumLin] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Productos](
[CodPro] [char](5) NOT NULL,
[CodCla] [char](2) NOT NULL,
[NomPro] [varchar](50) NOT NULL,
[PreVta] [money] NOT NULL,
[CostoAnt] [money] NULL,
[CostoPro] [money] NULL,
[Exento] [bit] NULL,
CONSTRAINT [PK_ProductosTMP] PRIMARY KEY CLUSTERED
(
[CodPro] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


/* ---------------------------------- */
****
**** Estas son unas de mis consultas que duran mucho ****
**** Repito, solo 1 vez antes de incluir registros en DetVtas, obtuve buen rendimiento, Recupere un Backup, volvi a generar los indices, y mi rendimiento en las consultas es pesimo ***

Consultas usadas.

Declare @FechaInicial date;
Declare @FechaFinal date;

Set @FechaInicial = '01/01/2016';
Set @FechaFinal = '01/04/2016';


/*Ventas por Tipo Servicios, Esta s funciona rapido */
Select top 10 TipoFactura,count(NumFactura) as Transacciones,sum(Subtotal)-sum(Descuento) as Total
from EncVtas INNER JOIN Restaurantes ON EncVtas.CodRest = Restaurantes.CodRestaurante
Where
FecFactura >= @FechaInicial
and FecFactura <= @FechaFinal
and
EncVtas.Anulada=0
group by tipofactura

/*Ventas por 10 Productos Mas Venta esta funciona muy lento */
SELECT TOP (10) Productos.NomPro,SUM(DetVtas.PreVta) * sum(DetVtas.UniVen) AS Total -- SUM(DetVtas.PreVta * DetVtas.UniVen) AS Total
FROM DetVtas INNER JOIN Productos ON DetVtas.CodPro = Productos.CodPro
INNER JOIN EncVtas ON DetVtas.CodRest = EncVtas.CodRest AND DetVtas.NumFactura = EncVtas.NumFactura
INNER JOIN Restaurantes ON EncVtas.CodRest = Restaurantes.CodRestaurante
Where
FecFactura >= @FechaInicial
and FecFactura <= @FechaFinal
and EncVtas.Anulada=0
GROUP BY Productos.NomPro
ORDER BY Total DESC

--Ticket Promedio Ventas
Select TipoFactura, (sum(Subtotal)-sum(Descuento)) / COUNT(NumFactura) as Total
from EncVtas INNER JOIN Restaurantes ON EncVtas.CodRest = Restaurantes.CodRestaurante
Where
FecFactura >= @FechaInicial
and FecFactura <= @FechaFinal
and EncVtas.Anulada=0
group by TipoFactura



** Gracias por cualquier ayuda que me puedan brindar ***

Saludos!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SQL Server 2016 - NonCluster Column Store Index

Publicado por Isaias (1921 intervenciones) el 10/06/2016 18:48:03
Tuve la suerte de ir a la presentacion de SQL Server 2016 e hice la pregunta, que creo, todos nos hacemos.

"Column Store Index, ya esta preparado para bases OLTP", la respuesta el expositor, fue tajante, "No, solo se ofrece para procesos de Datawaharehouse"

Entonces, teniendo esto, ¿no ha pensado en PARTICIONAR su tabla de 39 millones de registros?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar