{"id":2302,"date":"2020-11-11T22:15:48","date_gmt":"2020-11-11T22:15:48","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=2302"},"modified":"2023-12-05T23:40:18","modified_gmt":"2023-12-05T23:40:18","slug":"columnstore-index-en-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=2302","title":{"rendered":"ColumnStore index en SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"260\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex__D.png\" alt=\"\" class=\"wp-image-2303\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">ColumnStore index en SQL Server<\/h2>\n\n\n\n<p>La importancia de los \u00edndices en las consultas radica en que estos van a permitir optimizar la obtenci\u00f3n del conjunto de resultados.<br>Los \u00edndices son estructuras que ordenan los registros de una tabla o vista por uno o m\u00e1s campos de manera ascendente o descendente.<br>Los \u00edndices en una tabla o vista guardan todas las columnas del registro, si es necesario buscar un campo de un registro espec\u00edfico lo que hace la consulta es leer toda la fila y luego extraer el dato que se requiere. Los Column Store Index almacenan los datos en columnas, esto mejora la compresi\u00f3n de datos, reduce considerablemente los datos de E\/S ya que se leer\u00e1n solamente las columnas necesarias y mejora el desempe\u00f1o. En este art\u00edculo se va a explicar el uso de los Column Store index.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p style=\"font-size:18px\"><strong>Para mayor informaci\u00f3n ver<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\"><a href=\"https:\/\/manualsqlserver.com\/?p=158\" target=\"_blank\" rel=\"noreferrer noopener\">Indices en SQL Server<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=1673\" target=\"_blank\" rel=\"noreferrer noopener\">Indices en vistas en SQL Server<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=1743\" target=\"_blank\" rel=\"noreferrer noopener\">FileStream en SQL Server<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=225\" target=\"_blank\" rel=\"noreferrer noopener\">Agrupamientos en SQL Server<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Beneficios de los ColumnStore index<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Proporciona un nivel de compresi\u00f3n mas alto, aproximadamente 10 veces.<\/li>\n\n\n\n<li>Mejor rendimiento de los \u00edndices B-Tree.<\/li>\n\n\n\n<li>Se pueden hacer filtros en \u00edndices desde SQL Server 2016.<\/li>\n\n\n\n<li>\u00d3ptimo formato de almacenamiento para Datawarehouse y Analytics.<\/li>\n\n\n\n<li>Usan menos memoria debido a la alta tasa de compresi\u00f3n<\/li>\n\n\n\n<li>Reduce el IO total al leer solamente las columnas necesarias en la consulta.<\/li>\n\n\n\n<li>A partir de SQL Server 2014 se incorpora un Clusteres columnstore index que es actualizable.<\/li>\n\n\n\n<li>Es posible usarlos en ambientes AlwaysOn.<\/li>\n\n\n\n<li>Mejora el rendimiento en agrupamientos<\/li>\n\n\n\n<li>A partir de SQL Server 2016 se puede modificar los datos de la tabla que tiene el \u00edndice ColumnStore sin tener que eliminar el \u00edndice y luego de los cambios volver a crearlo.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Consideraciones<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No se permiten tipos de datos ntex, text, image, varchar(max), nvarchar(max), jer\u00e1rquicos ni espaciales.<\/li>\n\n\n\n<li>En SQL Server 2014 s\u00f3lo estaba disponible para la versi\u00f3n Enterprise.<\/li>\n\n\n\n<li>No se permiten tablas con fileStream<\/li>\n\n\n\n<li>Necesita un espacio adicional para almacenar las columnas elegidas.<\/li>\n<\/ul>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicios<\/strong><\/p>\n\n\n\n<p>Usando la base de datos Northwind<br><strong>use northwind<br>go<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p><strong>Crear una tabla Prueba e insertar registros, en este ejercicio se explica como crear un \u00edndice ColumnStore no agrupado.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Drop table if exists dbo.Prueba\ngo\nCreate table Prueba\n\t(\n\tCodigo int,\n\tFecha Date,\n\tDato1 nvarchar(30),\n\tDato2 nvarchar(30),\n\tDato3 nvarchar(30),\n\tDato4 nvarchar(30),\n\tValor1 int,\n\tValor2 int,\n\tValor3 int,\n\tValor4 int,\n\tValor5 int\n\t)\ngo<\/code><\/pre>\n\n\n\n<p><strong>Insertar 3 millones de registros. Puede probar con menos registros, esta inserci\u00f3n puede llevar algo mas de 20 minutos, dependiendo de la velocidad y memoria de su equipo.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set dateformat dmy\nSet nocount on\nDeclare @Valor int = 1\nWhile @Valor &lt;= 3000000\n\tBegin\n\tInsert into dbo.Prueba \n\t\t(&#91;Codigo], &#91;Fecha], &#91;Dato1], &#91;Dato2], &#91;Dato3], &#91;Dato4], \n\t\t&#91;Valor1], &#91;Valor2], &#91;Valor3], &#91;Valor4], &#91;Valor5])\n\t\tvalues\n\t\t(\n\t\t@Valor,\n\t\tDateAdd(d,@Valor,'01\/01\/1920'),  -- A\u00f1adir un d\u00eda al siguiente registro\n\t\t'Dato texto ' + Cast(Round(Rand()*100,0) As nvarchar), \n\t\t'Dato texto ' + Cast(Round(Rand()*100,0) As nvarchar),\t\n\t\t'Dato texto ' + Cast(Round(Rand()*100,0) As nvarchar), \n\t\t'Dato texto ' + Cast(Round(Rand()*100,0) As nvarchar),\n\t\tRound(Rand()*200000,0), Round(Rand()*200000,0),\n\t\tRound(Rand()*200000,0), Round(Rand()*200000,0),\n\t\tRound(Rand()*200000,0)\n\t\t)\n\tSet @Valor += 1\n\tEnd\ngo<\/code><\/pre>\n\n\n\n<p><strong>El listado de los registros de la tabla prueba<br><\/strong>select * from dbo.prueba<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"730\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_01-1024x730.png\" alt=\"\" class=\"wp-image-2304\" style=\"width:785px;height:559px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_01-1024x730.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_01-300x214.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_01-768x547.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_01-795x567.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_01.png 1111w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Creando \u00edndices no agrupados<\/strong><\/p>\n\n\n\n<p><strong>El \u00edndice B-Tree no agrupado.<\/strong><br><strong>Create nonclustered index PruebaDato1Valor1IDX  on Prueba (Dato1, Valor1)<br>go<\/strong><\/p>\n\n\n\n<p><strong>El \u00edndice ColumnStore no agrupado.<br><\/strong>Create nonclustered columnstore index PruebaDato1Valor1ColumnStoreIDX on Prueba (Dato1, Valor1)<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Gobernador de recursos Resource Governor<\/strong><\/p>\n\n\n\n<p>El regulador de recursos de SQL Server es una funci\u00f3n que puede utilizar para administrar la carga de trabajo de SQL Server y el consumo de  recursos del sistema. Resource Governor le permite especificar l\u00edmites en la cantidad de CPU, E \/ S f\u00edsicas y memoria que pueden usar las solicitudes de  aplicaciones entrantes.<\/p>\n\n\n\n<p>El Gobernador de recursos en SQL Server (Resource Governor) es una funcionalidad que permite administrar el uso de recursos que tiene la instancia para diferentes aplicaciones y usuarios. El Resource Governor se activa en tiempo real al establecer los l\u00edmites de memoria y CPU, esta opci\u00f3n ayudar a prevenir que una transacci\u00f3n o proceso consuma todos los recursos del sistema.<\/p>\n\n\n\n<p><strong>Modifica la cantidad de memoria m\u00e1xima a 75% al grupo de cargas de trabajo por defecto.<\/strong><br>Alter workload group [default] with<br>(request_max_memory_grant_percent = 75)<br>go<br>Alter resource governor reconfigure<br>go<\/p>\n\n\n\n<p><strong>Visualizar los valores de los grupos de cargas de trabajo<br><\/strong>Select name, request_max_memory_grant_percent<br>from sys.dm_resource_governor_workload_groups<br>go<br><strong>El resultado se muestra en la siguiente imagen.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"423\" height=\"146\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_02.png\" alt=\"\" class=\"wp-image-2305\" style=\"width:574px;height:198px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_02.png 423w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_02-300x104.png 300w\" sizes=\"auto, (max-width: 423px) 100vw, 423px\" \/><\/figure>\n\n\n\n<p>Realizando consultas de la tabla Prueba, una de las cuales es usando el columnstore index y la otra con el \u00edndice agrupado, ambos con las mismas columnas de indexaci\u00f3n.<\/p>\n\n\n\n<p><strong>Consulta que usa el ColumnStore index<\/strong><br>Select Dato1, Avg(Cast((Valor1) as float)) As &#8216;Promedio&#8217;<br>from Prueba<br>group by Dato1<br>go<br>El resultado se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"511\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_03.png\" alt=\"\" class=\"wp-image-2306\" style=\"width:530px;height:744px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_03.png 364w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_03-214x300.png 214w\" sizes=\"auto, (max-width: 364px) 100vw, 364px\" \/><\/figure>\n\n\n\n<p>El Plan de ejecuci\u00f3n estimado de la consulta se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"540\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_04-1024x540.png\" alt=\"\" class=\"wp-image-2307\" style=\"width:700px;height:368px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_04-1024x540.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_04-300x158.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_04-768x405.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_04-795x419.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_04.png 1088w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">ColumnStore index Scan &#8211; \u00edndice no agrupado.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"399\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_05.png\" alt=\"\" class=\"wp-image-2308\" style=\"width:676px;height:315px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_05.png 857w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_05-300x140.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_05-768x358.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_05-795x370.png 795w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><figcaption class=\"wp-element-caption\">Costo estimado de sub\u00e1rbol usando el ColumnStore index<\/figcaption><\/figure>\n\n\n\n<p><strong>Consulta que usa el indice B-Tree<\/strong><br>Select Dato1, Avg(Cast((Valor1) as float)) As &#8216;Promedio&#8217;<br>from Prueba<br>group by Dato1<br>option (table hint(Prueba, index (PruebaDato1Valor1IDX)))<br>go<br>El resultado se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"371\" height=\"509\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_06.png\" alt=\"\" class=\"wp-image-2309\" style=\"width:537px;height:737px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_06.png 371w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_06-219x300.png 219w\" sizes=\"auto, (max-width: 371px) 100vw, 371px\" \/><\/figure>\n\n\n\n<p>El Plan de ejecuci\u00f3n estimado de la consulta se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"425\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_07-1024x425.png\" alt=\"\" class=\"wp-image-2310\" style=\"width:722px;height:299px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_07-1024x425.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_07-300x125.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_07-768x319.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_07-795x330.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_07.png 1331w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Index Scan &#8211; El listado usando el \u00edndice B-Tree<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"371\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_08-1024x371.png\" alt=\"\" class=\"wp-image-2311\" style=\"width:713px;height:258px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_08-1024x371.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_08-300x109.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_08-768x278.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_08-795x288.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_08.png 1179w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Costo estimado de sub\u00e1rbol usando el \u00edndice B-Tree<\/figcaption><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>IMPORTANTE:<\/strong><\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background has-normal-font-size\"><strong>Note la diferencia entre los valores del costo estimado de sub\u00e1rbol.<br>Valor del costo estimado de sub\u00e1rbol con el Column Store index: 2.5667<br>Valor del costo estimado de sub\u00e1rbol con el B-Tree index: 15.6488<br>Obviamente hay una diferencia muy notoria lo que hace muy recomendable usar listado con los \u00edndices de tipo Column Store index.<\/strong><\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p><strong>Usando la tabla Order Details de Northwind.<\/strong><\/p>\n\n\n\n<p>La estructura de la tabla muestra los \u00edndices<br>sp_help [Order Details]<br>go<br>El resultado se muestra en la siguiente imagen.<br>Note que existe el \u00edndice para el campo ProductID<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"770\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_09-1024x770.png\" alt=\"\" class=\"wp-image-2312\" style=\"width:722px;height:543px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_09-1024x770.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_09-300x226.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_09-768x577.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_09-795x598.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_09.png 1237w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Mostrar las unidades vendidas por producto. Se obtendr\u00e1 el resultado usando un \u00edndice B-Tree versus el uso de un ColumnStore index.<\/strong><br>select<br>D.ProductID As &#8216;C\u00f3digo&#8217;,<br>Sum(D.Quantity) As &#8216;Cantidad&#8217;<br>from [Order Details] As D<br>group by D.ProductID<br>Order by D.ProductID<br>go<\/p>\n\n\n\n<p>El resultado se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"224\" height=\"533\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_10.png\" alt=\"\" class=\"wp-image-2313\" style=\"width:395px;height:940px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_10.png 224w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_10-126x300.png 126w\" sizes=\"auto, (max-width: 224px) 100vw, 224px\" \/><\/figure>\n\n\n\n<p><br>El resultado del plan de ejecuci\u00f3n estimado y el costo estimado de sub\u00e1rbol se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"368\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_11-1024x368.png\" alt=\"\" class=\"wp-image-2314\" style=\"width:838px;height:301px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_11-1024x368.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_11-300x108.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_11-768x276.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_11-795x286.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_11.png 1085w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Crear el columnstore index para el campo ProductId<\/strong><br>Create nonclustered columnstore index DetalleCodigoProductoIDXColumnStore<br>on <a href=\"ProductID\">Order Details<\/a><br>go<\/p>\n\n\n\n<p><strong>En la vista indexes se puede visualizar el \u00edndice creado<\/strong><br>select * from sys.indexes<br>where name like &#8216;Detalle%&#8217;<br>go<\/p>\n\n\n\n<p><strong>Al visualizar nuevamente la estructura de la tabla<\/strong><br>sp_help [Order Details]<br>go<br>El resultado se muestra en la siguiente imagen.<br>Note que ahora existe adem\u00e1s de todos los \u00edndices un ColumnStore Index.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"720\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_12-1024x720.png\" alt=\"\" class=\"wp-image-2315\" style=\"width:733px;height:516px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_12-1024x720.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_12-300x211.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_12-768x540.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_12-795x559.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_12.png 1241w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Listar nuevamente los productos y las unidades vendidas.<\/strong><br>select<br>D.ProductID As &#8216;C\u00f3digo&#8217;,<br>Sum(D.Quantity) As &#8216;Cantidad&#8217;<br>from [Order Details] As D<br>group by D.ProductID<br>Order by D.ProductID<br>go<br>El resultado del plan de ejecuci\u00f3n estimado y el costo estimado de sub\u00e1rbol se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"387\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_13-1024x387.png\" alt=\"\" class=\"wp-image-2316\" style=\"width:755px;height:285px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_13-1024x387.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_13-300x113.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_13-768x290.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_13-795x301.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_13.png 1087w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Note la diferencia:<\/strong><br><strong>Sin el ColumnStore index el costo de sub\u00e1rbol estimado es de: 0.0523268<br>Con el ColumnStore index el costo de sub\u00e1rbol estimado es de: 0.0192329<\/strong><\/p>\n\n\n\n<p>Eliminar el column store index.<br>Drop index DetalleCodigoProductoIDXColumnStore on [Order Details]<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Convertir un \u00edndice B-Tree en ColumnStore index<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 3<\/strong><\/p>\n\n\n\n<p><strong>Crear una tabla, luego crear el \u00edndice agrupado B-Tree y luego convertirlo en un ColumnStore index.<\/strong><\/p>\n\n\n\n<p>CREATE TABLE MiTabla<br>(<br>MiTablaCodigo nchar(4) not null,<br>MiTablaFecha Date,<br>MiTablaCantidad Numeric(9,2),<br>MiTablaDescripcion nvarchar(50)<br>)<br>go<\/p>\n\n\n\n<p><strong>Crear el \u00edndice agrupado<\/strong><br>Create CLUSTERED INDEX MiTablaPK ON MiTabla (MiTablaCodigo)<br>go<\/p>\n\n\n\n<p><strong>Convertirlo a column store index<br>Note que se especifica el mismo nombre del \u00edndice<br>y se adiciona la palabra ColumnStore. Adicionalmente como el \u00edndice existe se incluye la opci\u00f3n DROP_EXISTING = ON.<br><\/strong>Create CLUSTERED columnstore INDEX MiTablaPK ON MiTabla<br>WITH (DROP_EXISTING = ON)<br>go<\/p>\n\n\n\n<p><strong>Creando un NonClustered columnStore index<\/strong><br><strong>Primero convertir el Clustered columnStore index en B-Tree index.<\/strong><br>Create CLUSTERED INDEX MiTablaPK ON MiTabla (MiTablaCodigo)<br>WITH (DROP_EXISTING = ON)<br>go<\/p>\n\n\n\n<p><strong>Crear el Nonclustered columnStore index<\/strong><br>if exists<br>(select name from sys.indexes<br>where name = &#8216;MiTablaIDXColumnStore&#8217;)<br>Begin<br>Create NonCLUSTERED columnstore INDEX MiTablaIDXColumnStore<br>ON MiTabla (MiTablaFecha, MiTablaCantidad)<br>with (Drop_existing = on)<br>End<br>Else<br>Begin<br>Create NonCLUSTERED columnstore INDEX MiTablaIDXColumnStore<br>ON MiTabla (MiTablaFecha, MiTablaCantidad)<br>End<br>go<\/p>\n\n\n\n<p>Para mostrar la estructura de la tabla MiTabla<br>sp_help MiTabla<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"589\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_14-1024x589.png\" alt=\"\" class=\"wp-image-2317\" style=\"width:755px;height:434px\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_14-1024x589.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_14-300x173.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_14-768x442.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_14-795x457.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ColumnStoreIndex_14.png 1156w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>ColumnStore index en SQL Server La importancia de los \u00edndices en las consultas radica en que estos van a permitir optimizar la obtenci\u00f3n del conjunto de resultados.Los \u00edndices son estructuras que ordenan los registros de una tabla o vista por uno o m\u00e1s campos de manera ascendente o descendente.Los \u00edndices en una tabla o vista &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=2302\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2303,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,7],"tags":[266,105,177],"class_list":["post-2302","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultasdedatos","category-indices","tag-columnstore-index","tag-create-index","tag-index","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2302"}],"version-history":[{"count":2,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2302\/revisions"}],"predecessor-version":[{"id":2858,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2302\/revisions\/2858"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/2303"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}