{"id":333,"date":"2017-02-09T13:24:43","date_gmt":"2017-02-09T13:24:43","guid":{"rendered":"https:\/\/sqldoubleg.live-website.com\/?p=333"},"modified":"2017-11-21T21:21:19","modified_gmt":"2017-11-21T21:21:19","slug":"statistics-and-data-types-what-can-go-wrong","status":"publish","type":"post","link":"https:\/\/www.sqldoubleg.com\/es\/2017\/02\/09\/statistics-and-data-types-what-can-go-wrong\/","title":{"rendered":"Estad\u00edsticas y Tipos de Datos, Qu\u00e9 Podr\u00eda Salir Mal?"},"content":{"rendered":"<p>One of the most interesting things in SQL Server are Statistics. Today I want to write about the creation and update.&nbsp;Una de las cosas m\u00e1s interesantes en SQL Server desde mi punto de vista son las estad\u00edsticas y c\u00f3mo el optimizador las interpreta para producir planes de consulta \u00f3ptimos. Pero hoy quiero escribir sobre algo que me acaba de ocurrir y hacer pensar. Esto se refiere a la primera etapa del proceso, la creaci\u00f3n.<\/p>\n<p>Si no hemos cambiado nada en nuestras bases de datos (o model), <strong><em>auto create statistics<\/em><\/strong> deber\u00eda estar <strong><em>activado<\/em><\/strong> por defecto, lo que significa que SQL Server crear\u00e1 estad\u00edsticas autom\u00e1ticamente cuando crea que esa informaci\u00f3n ser\u00eda beneficiosa para generar un plan de ejecuci\u00f3n.<\/p>\n<p>Esto suena como un regalo, \u00bfverdad? Claro, es bueno no tener que pensar qu\u00e9 estad\u00edsticas tenemos que crear y dem\u00e1s, pero como todo, puede tener un lado oscuro.<\/p>\n<p>&nbsp;<br \/>\n<strong>Antecedentes<\/strong><\/p>\n<p>Tal vez voy a echar a perder toda la historia, pero as\u00ed es como sucedieron las cosas.<\/p>\n<p>Estaba revisando los registros del \u00faltimo mantenimiento de la base de datos que incluye, por supuesto, actualizar las estad\u00edsticas. Luego vi que hab\u00eda una estad\u00edstica espec\u00edfica que tard\u00f3 m\u00e1s de 10 horas en actualizarse, lo que me hizo sospechar. As\u00ed que trat\u00e9 de averiguar por qu\u00e9.<\/p>\n<p>B\u00e1sicamente todo estaba correcto, y las razones por las que tard\u00f3 tanto eran<\/p>\n<ul>\n<li>La tabla tiene 41 millones de filas<\/li>\n<li>Los actualiz\u00f3 usando FULLSCAN<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nNo especifiqu\u00e9 FULLSCAN, pero al usar RESAMPLE se usa la \u00faltima muestra, si esta es FULLSCAN &#8230; ah\u00ed lo tienes.<\/p>\n<p>OK, entonces tenemos esta estad\u00edstica llamada _WA_xxxxxxx, por lo tanto, creada autom\u00e1ticamente, en una columna de mi tabla. Y esta columna era (redobles) NVARCHAR (MAX) (badum ts)<\/p>\n<p>Mi tabla contiene documentos xml almacenados en el tipo de datos NVARCHAR (MAX), por lo que mis estad\u00edsticas se ve\u00edan as\u00ed<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/10\/01_DBCC_SHOW_STATISTICS.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/10\/01_DBCC_SHOW_STATISTICS.png\" alt=\"01_dbcc_show_statistics\" width=\"991\" height=\"521\" class=\"aligncenter size-full wp-image-351\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/10\/01_DBCC_SHOW_STATISTICS.png 991w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/10\/01_DBCC_SHOW_STATISTICS-300x158.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/10\/01_DBCC_SHOW_STATISTICS-150x79.png 150w\" sizes=\"(max-width: 991px) 100vw, 991px\" \/><\/a><\/p>\n<p>Vea c\u00f3mo [Rows Sampled] es lo mismo que [Rows], por lo que FULLSCAN se realiz\u00f3. Y el n\u00famero no es peque\u00f1o en absoluto.<\/p>\n<p>Pero la peor parte es la que se supone que es m\u00e1s \u00fatil y donde el optimizador de consultas recopila informaci\u00f3n de los datos para producir buenos planes de ejecuci\u00f3n, el Histograma. En este caso, no parece muy \u00fatil, \u00bfverdad?<\/p>\n<p>Adem\u00e1s, debe saber que las estad\u00edsticas de las columnas [N]VARCHAR() tienen un m\u00e1ximo de 200 caracteres en RANGE_HI_KEY, por lo que para un tipo de datos MAX como este no tiene sentido<\/p>\n<p>&nbsp;<br \/>\n<strong>Estad\u00edsticas autom\u00e1ticas y tipos de datos<\/strong> <\/p>\n<p>Despu\u00e9s de ver esto, me preocup\u00e9 un poco y me pregunt\u00e9 si todos los otros tipos de datos crear\u00e1n estad\u00edsticas autom\u00e1ticamente. \u00a1As\u00ed que decid\u00ed crear una tabla con todos los tipos de datos para comprobarlo!<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nUSE master\r\nGO\r\nCREATE DATABASE stats_sample\r\nGO\r\n\r\nUSE stats_sample\r\nGO\r\nCREATE TABLE stats_sample (c_bigint bigint NULL  DEFAULT CONVERT(bigint, '1')\r\n, c_binary binary NULL  DEFAULT CONVERT(binary, '1')\r\n, c_bit bit NULL  DEFAULT CONVERT(bit, '1')\r\n, c_char char NULL  DEFAULT CONVERT(char, '0')\r\n, c_date date NULL  DEFAULT GETDATE()\r\n, c_datetime datetime NULL  DEFAULT GETDATE()\r\n, c_datetime2 datetime2 NULL  DEFAULT GETDATE()\r\n, c_datetimeoffset datetimeoffset NULL  DEFAULT GETDATE()\r\n, c_decimal decimal NULL  DEFAULT CONVERT(decimal, '1')\r\n, c_float float NULL  DEFAULT CONVERT(float, '1')\r\n, c_geography geography NULL  DEFAULT 'CURVEPOLYGON(CIRCULARSTRING(-1 1, -1 1, -1 1, -1 1, -1 1))'\r\n, c_geometry geometry NULL  DEFAULT geometry::Parse('POINT(1 1 NULL NULL)')\r\n, c_hierarchyid hierarchyid NULL  DEFAULT '\/'\r\n, c_image image NULL  DEFAULT CONVERT(image, '1')\r\n, c_int int NULL  DEFAULT CONVERT(int, '1')\r\n, c_money money NULL  DEFAULT CONVERT(money, '1')\r\n, c_nchar nchar NULL  DEFAULT CONVERT(nchar, '0')\r\n, c_ntext ntext NULL  DEFAULT CONVERT(ntext, '0')\r\n, c_numeric numeric NULL  DEFAULT CONVERT(numeric, '1')\r\n, c_nvarchar nvarchar NULL  DEFAULT CONVERT(nvarchar, '0')\r\n, c_real real NULL  DEFAULT CONVERT(real, '1')\r\n, c_smalldatetime smalldatetime NULL  DEFAULT GETDATE()\r\n, c_smallint smallint NULL  DEFAULT CONVERT(smallint, '1')\r\n, c_smallmoney smallmoney NULL  DEFAULT CONVERT(smallmoney, '1')\r\n, c_sql_variant sql_variant NULL  DEFAULT CONVERT(sql_variant, '1')\r\n, c_sysname sysname NULL  DEFAULT CONVERT(sysname, '0')\r\n, c_text text NULL  DEFAULT CONVERT(text, '0')\r\n, c_time time NULL  DEFAULT GETDATE()\r\n, c_timestamp timestamp NULL \r\n, c_tinyint tinyint NULL  DEFAULT CONVERT(tinyint, '1')\r\n, c_uniqueidentifier uniqueidentifier NULL  DEFAULT NEWID()\r\n, c_varbinary varbinary NULL  DEFAULT CONVERT(varbinary, '1')\r\n, c_varchar varchar NULL  DEFAULT CONVERT(varchar, '0')\r\n, c_xml xml NULL  DEFAULT CONVERT(xml, '1'))\r\nGO\r\n\r\nINSERT INTO dbo.stats_sample DEFAULT VALUES\r\nGO 1000\r\n<\/pre>\n<p>Tened en cuenta que he tenido que crear un valor predeterminado ficticio para poder generar algunas estad\u00edsticas.<\/p>\n<p>Una vez que mi tabla est\u00e9 en su sitio y cargada, las estad\u00edsticas autom\u00e1ticas se activar\u00e1n si el optimizador de consultas cree que ser\u00eda bueno tenerlas para obtener estimaciones y generar un mejor plan de ejecuci\u00f3n, as\u00ed que ah\u00ed vamos<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nSELECT * FROM stats_sample WHERE c_bigint IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_binary IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_bit IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_char IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_date IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_datetime IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_datetime2 IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_datetimeoffset IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_decimal IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_float IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_geography IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_geometry IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_hierarchyid IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_image IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_int IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_money IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_nchar IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_ntext IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_numeric IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_nvarchar IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_real IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_smalldatetime IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_smallint IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_smallmoney IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_sql_variant IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_sysname IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_text IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_time IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_timestamp IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_tinyint IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_uniqueidentifier IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_varbinary IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_varchar IS NOT NULL\r\nSELECT * FROM stats_sample WHERE c_xml IS NOT NULL\r\nGO\r\n<\/pre>\n<p>Genial, eso deber\u00eda ser suficiente. Veamos si tenemos estad\u00edsticas en nuestra tabla o no.<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nSELECT OBJECT_NAME(stc.object_id) AS object_name, st.auto_created, st.name AS stats_name, c.name, t.name\r\n    FROM sys.stats_columns AS stc\r\n        INNER JOIN sys.stats AS st\r\n            ON st.object_id = stc.object_id\r\n                AND st.stats_id = stc.stats_id\r\n        INNER JOIN sys.columns AS c\r\n            ON c.object_id = stc.object_id\r\n                AND c.column_id = stc.column_id \r\n        INNER JOIN sys.types AS t\r\n            ON t.user_type_id = c.user_type_id  \r\n    WHERE stc.object_id = OBJECT_ID('dbo.stats_sample')\r\n<\/pre>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/11\/02_auto_created_stats.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/11\/02_auto_created_stats.png\" alt=\"02_auto_created_stats\" width=\"869\" height=\"375\" class=\"aligncenter size-full wp-image-367\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/11\/02_auto_created_stats.png 869w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/11\/02_auto_created_stats-300x129.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/11\/02_auto_created_stats-150x65.png 150w\" sizes=\"(max-width: 869px) 100vw, 869px\" \/><\/a><\/p>\n<p>S\u00ed, ah\u00ed est\u00e1n, todas estas _WA_Sys_ estad\u00edsticas me dicen que se han creado autom\u00e1ticamente (hay una bandera en sys.stats si no me crees) pero puedo ver que solo hay 31, donde cre\u00e9 34 columnas.<\/p>\n<p>Es gracioso, veamos qu\u00e9 tipos de datos obtuvieron estad\u00edsticas.<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nSELECT * \r\n\tFROM sys.types AS t\r\n\t\tLEFT JOIN (SELECT c.user_type_id\r\n\t\t\t\t\t\tFROM sys.stats_columns AS stc\r\n\t\t\t\t\t\t\tINNER JOIN sys.columns AS c\r\n\t\t\t\t\t\t\t\tON c.object_id = stc.object_id\r\n\t\t\t\t\t\t\t\t\tAND c.column_id = stc.column_id \r\n\t\t\t\t\t\tWHERE stc.object_id = OBJECT_ID('dbo.stats_sample')) AS st\r\n\t\t\tON st.user_type_id = t.user_type_id\r\n\tWHERE st.user_type_id IS NULL\r\n\r\n<\/pre>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/02\/03_data_types_without_statistics.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/02\/03_data_types_without_statistics.png\" alt=\"03_data_types_without_statistics\" width=\"1060\" height=\"193\" class=\"aligncenter size-full wp-image-394\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/03_data_types_without_statistics.png 1060w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/03_data_types_without_statistics-300x55.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/03_data_types_without_statistics-1024x186.png 1024w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/03_data_types_without_statistics-150x27.png 150w\" sizes=\"(max-width: 1060px) 100vw, 1060px\" \/><\/a><\/p>\n<p>&nbsp;<br \/>\nAll\u00ed est\u00e1n. Los tipos de datos XML y CLR (<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/cc280487.aspx\" target=\"_blank\">geometry<\/a> y <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/cc280766.aspx\" target=\"_blank\">geography<\/a> son CLR) no tienen estad\u00edsticas, lo que significa que tampoco puede crearlas manualmente.<\/p>\n<p>Solo por el gusto de comprobarlo.<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nCREATE STATISTICS st_stats_sample_geometry\t\tON dbo.stats_sample (c_geometry)\r\nGO\r\nCREATE STATISTICS st_stats_sample_geography\t\tON dbo.stats_sample (c_geography)\r\nGO\r\nCREATE STATISTICS st_stats_sample_xml\t\t\tON dbo.stats_sample (c_xml)\r\nGO\r\n<\/pre>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/02\/04_create_stats_error.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/02\/04_create_stats_error.png\" alt=\"04_create_stats_error\" width=\"1063\" height=\"183\" class=\"aligncenter size-full wp-image-395\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/04_create_stats_error.png 1063w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/04_create_stats_error-300x52.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/04_create_stats_error-1024x176.png 1024w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/02\/04_create_stats_error-150x26.png 150w\" sizes=\"(max-width: 1063px) 100vw, 1063px\" \/><\/a><\/p>\n<p>&nbsp;<br \/>\nAs\u00ed que aparte de estos tipos de datos especiales, el resto acaba de crear las estad\u00edsticas sin ninguna pregunta, para bien o para mal.<\/p>\n<p>&nbsp;<br \/>\n<strong>La parte buena<\/strong> <\/p>\n<p>Bastante obvio, las estad\u00edsticas son muy importantes para el optimizador de consultas, por lo que el hecho de sacarlas de la estanter\u00eda (es el comportamiento predeterminado) es una gran ganancia.<\/p>\n<p>&nbsp;<br \/>\n<strong>La parte mala<\/strong> <\/p>\n<p>A veces, las estad\u00edsticas no son tan \u00fatiles como nos gustar\u00eda, y si lo mezclamos con algunas otras malas pr\u00e1cticas, como no usar \u00edndices de texto completo para [N]VARCHAR(MAX) y consultas como cualquier otra columna, lo que activar\u00e1 autom\u00e1ticamente -crear estad\u00edsticas, el resultado puede ser un desastre.<\/p>\n<p>&nbsp;<br \/>\n<strong>\u00bfY qu\u00e9 hacemos?<\/strong> <\/p>\n<p>\u00bfEs hora de entrar en p\u00e1nico y correr en c\u00edrculos? Tampoco es para tanto.<\/p>\n<p>Compruebad vuestro mantenimiento y sus estad\u00edsticas en general, si est\u00e1is en SQL 2008R2 SP2, SQL 2012 SP1 o superior, puede usar DMV dm_db_stats_properties, lo cual es genial, pero para versiones anteriores puede que teng\u00e1is que escribir algo vosotros mismos usando <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms174384.aspx\" target=\"_blank\">DBCC SHOW_STATISTICS<\/a><\/p>\n<p>Alguna consulta para comenzar podr\u00eda ser algo as\u00ed<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nSELECT OBJECT_NAME(st.object_id) AS [object_name]\r\n\t\t, st.name AS stats_name\r\n\t\t, st.object_id\r\n\t\t, st.stats_id\r\n\t\t, stp.last_updated\r\n\t\t, stp.rows\r\n\t\t, stp.rows_sampled\r\n\t\t, stp.modification_counter\r\n\t\t-- , *\r\n\tFROM sys.stats AS st\r\n\t\tCROSS APPLY sys.dm_db_stats_properties(st.object_id, st.stats_id) AS stp\r\n\tWHERE OBJECTPROPERTYEX(st.object_id, 'IsMSShipped') = 0\r\n<\/pre>\n<p>Si detect\u00e1is algo sospechoso, todav\u00eda hay algunas cosas que podemos hacer al respecto. Este post se est\u00e1 alargando bastante, pero ya total&#8230; vamos a sumergirnos en una ligera charla te\u00f3rica. <\/p>\n<p>&nbsp;<br \/>\n<strong>Auto Update Stats<\/strong> <\/p>\n<p>Probablemente us\u00e9is vuestros propios scripts o los de Ola Hallengren para mantener \u00edndices y estad\u00edsticas, pero si no lo hac\u00e9is, SQL Server a\u00fan quiere que teng\u00e1is las estad\u00edsticas actualizadas, por lo que activar\u00e1 autom\u00e1ticamente las estad\u00edsticas de actualizaci\u00f3n cuando est\u00e9n desactualizadas.<\/p>\n<p>Entonces, \u00bfcuando caducan las estad\u00edsticas? En pocas palabras, m\u00e1s o menos cuando hay una relaci\u00f3n del 20% entre filas y el contador de modificaciones en dm_db_stats_properties, y esto es importante porque <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms190397.aspx\" target=\"_blank\">BOL<\/a> indica<\/p>\n<ul>\n<li>SQL Server (2014 y anterior) usa un umbral basado en el porcentaje de filas modificadas. Esto es independientemente del n\u00famero de filas en la tabla.<\/li>\n<li>SQL Server (comenzando en 2016 y bajo el nivel de compatibilidad 130) usa un umbral que se ajusta seg\u00fan el n\u00famero de filas en la tabla. Con este cambio, las estad\u00edsticas en tablas grandes se actualizar\u00e1n m\u00e1s a menudo.<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nVed c\u00f3mo se habla sobre <strong>el porcentaje de filas cambiadas<\/strong>. Y eso es enga\u00f1oso, al menos para m\u00ed, ya que cada modificaci\u00f3n en esa columna cuenta, por lo que si modificas la misma fila una y otra vez, el contador seguir\u00e1 aumentando, y mientras el resto de la tabla no se modifique, actualiza autom\u00e1ticamente las estad\u00edsticas ( o incluso vuestros scripts) creer\u00e1n que es hora de actualizar.<\/p>\n<p>Y de nuevo en BOL, eso suceder\u00e1 <strong>antes<\/strong> de que se ejecute la consulta que queremos ejecutar, a menos que <strong>AUTO_UPDATE_STATISTICS_ASYNC<\/strong> est\u00e9 activado, y la actualizaci\u00f3n se retrase a otro momento.<\/p>\n<p>Ahora imag\u00ednaos si la actualizaci\u00f3n de mis estad\u00edsticas de 10 horas se<br \/>\n se activan porque alguien ejecuta una consulta en vez de durante una ventana de mantenimiento &#8230; cosa fea.<\/p>\n<p>Todav\u00eda podemos hacer algunos trucos, como actualizar las estad\u00edsticas manualmente sin filas y <strong>NORECOMPUTE<\/strong>, y eso matar\u00e1 sus estad\u00edsticas hasta que se revierta, pero tened cuidado y no salte\u00eds corriendo a hacerlo antes de evaluar todas las consecuencias.<\/p>\n<p>&nbsp;<br \/>\n<strong>Conclusi\u00f3n<\/strong> <\/p>\n<p>Como la mayor\u00eda de las veces, no hay una soluci\u00f3n \u00fanica que se adapte a todas las situaciones, por lo tanto, a medida que tengamos una mejor comprensi\u00f3n de los aspectos internos, podremos realizar una mejor elecci\u00f3n y predecir las consecuencias de nuestra elecci\u00f3n.<\/p>\n<p>Algunos enlaces \u00fatiled como referencia<\/p>\n<ul>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms187348.aspx\" target=\"_blank\">UPDATE STATISTICS<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/dd535534.aspx\" target=\"_blank\">Statistics 2008 Whitepaper<\/a><\/li>\n<li><a href=\"http:\/\/www.sqlskills.com\/blogs\/erin\/understanding-when-statistics-will-automatically-update\/\" target=\"_blank\">Understanding When Statistics Will Automatically Update<\/a><\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nGracias por leer y si ten\u00e9is alguna pregunta, por favor usad los comentarios a continuaci\u00f3n.<\/p>\n<p>&nbsp;<br \/>\n<\/p>","protected":false},"excerpt":{"rendered":"<p>One of the most interesting things in SQL Server are Statistics. Today I want to write about the creation and update.&nbsp;Una de las cosas m\u00e1s interesantes en SQL Server desde mi punto&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[5,12,26],"_links":{"self":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/333"}],"collection":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/comments?post=333"}],"version-history":[{"count":1,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/333\/revisions"}],"predecessor-version":[{"id":396,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/333\/revisions\/396"}],"wp:attachment":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/media?parent=333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/categories?post=333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/tags?post=333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}