<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>David Barbarin &#187; columnstore</title>
	<atom:link href="https://blog.developpez.com/mikedavem/ptag/columnstore/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/mikedavem</link>
	<description>MVP DataPlatform - MCM SQL Server</description>
	<lastBuildDate>Thu, 09 Sep 2021 21:19:50 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Interesting use case of using dummy columnstore indexes and temp tables</title>
		<link>https://blog.developpez.com/mikedavem/p13202/sql-server-vnext/interesting-use-case-of-using-dummy-columnstore-indexes-and-temp-tables</link>
		<comments>https://blog.developpez.com/mikedavem/p13202/sql-server-vnext/interesting-use-case-of-using-dummy-columnstore-indexes-and-temp-tables#comments</comments>
		<pubDate>Fri, 20 Nov 2020 17:06:06 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[SQL Server 2017]]></category>
		<category><![CDATA[SQL Server 2019]]></category>
		<category><![CDATA[batch mode]]></category>
		<category><![CDATA[columnstore]]></category>
		<category><![CDATA[inline index]]></category>
		<category><![CDATA[operation analytics]]></category>
		<category><![CDATA[reporting]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1710</guid>
		<description><![CDATA[Columnstore indexes are a very nice feature and well-suited for analytics queries. Using them for our datawarehouse helped to accelerate some big ETL processing and to reduce resource footprint such as CPU, IO and memory as well. In addition, SQL &#8230; <a href="https://blog.developpez.com/mikedavem/p13202/sql-server-vnext/interesting-use-case-of-using-dummy-columnstore-indexes-and-temp-tables">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Columnstore indexes are a very nice feature and well-suited for analytics queries. Using them for our datawarehouse helped to accelerate some big ETL processing and to reduce resource footprint such as CPU, IO and memory as well. In addition, SQL Server 2016 takes columnstore index to a new level and allows a fully updateable non-clustered columnstore index on a rowstore table making possible operational and analytics workloads. Non-clustered columnstore index are a different beast to manage with OLTP workload and we got both good and bad experiences on it. In this blog post, let’s talk about good effects and an interesting case where we use them for reducing CPU consumption of a big reporting query.</p>
<p><span id="more-1710"></span></p>
<p>In fact, the concerned query follows a common T-SQL anti-pattern for performance: A complex layer of nested views and CTEs which are an interesting mix to getting chances to prevent a cleaned-up execution plan. The SQL optimizer gets tricked easily in this case. So, for illustration let’s start with the following query pattern:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;height:450px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">;WITH CTE1 AS (<br />
&nbsp; &nbsp; SELECT col ..., SUM(col2), ...<br />
&nbsp; &nbsp; FROM [VIEW]<br />
&nbsp; &nbsp; GROUP BY col ...<br />
),<br />
CTE2 AS (<br />
&nbsp; &nbsp; SELECT col ..., ROW_NUMBER() <br />
&nbsp; &nbsp; FROM (<br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT col ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; JOIN CTE1 ON ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; JOIN [VIEW2] ON ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; JOIN [TABLE] ON ...<br />
&nbsp; &nbsp; ) AS VT <br />
),<br />
CTE3 A (<br />
&nbsp; &nbsp; SELECT col ...<br />
&nbsp; &nbsp; FROM [VIEW]<br />
&nbsp; &nbsp; JOIN [VIEW4] ON ...<br />
)<br />
...<br />
SELECT col ...<br />
FROM (<br />
&nbsp; &nbsp; SELECT <br />
&nbsp; &nbsp; &nbsp; &nbsp; col,<br />
&nbsp; &nbsp; &nbsp; &nbsp; STUFF((SELECT '', '' + col <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM CTE2 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WHERE CTE2.ID = CTE1.ID<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FOR XML PATH('''')), 1, 1, '''') AS colconcat, &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; FROM (<br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT col ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; FROM CTE1<br />
&nbsp; &nbsp; &nbsp; &nbsp; LEFT JOIN CTE2 ON ... &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; LEFT JOIN (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT col <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM CTE3<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GROUP BY col<br />
&nbsp; &nbsp; &nbsp; &nbsp; ) AS T1 ON ...<br />
&nbsp; &nbsp; ) AS T2 <br />
&nbsp; &nbsp; GROUP BY col ...<br />
)</div></div>
<p>Sometimes splitting the big query into small pieces and storing pre-aggregation within temporary tables may help. This is what it has been done and led to some good effects with a global reduction of the query execution time.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;height:450px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE #T1 ...<br />
CREATE TABLE #T2 ...<br />
CREATE TABLE #T3 ...<br />
<br />
<br />
;WITH CTE1 AS (<br />
&nbsp; &nbsp; SELECT col ..., SUM(col2), ...<br />
&nbsp; &nbsp; FROM [VIEW]<br />
&nbsp; &nbsp; GROUP BY col ...<br />
)<br />
INSERT INTO #T1 ...<br />
SELECT col FROM CTE1 ...<br />
;<br />
<br />
WITH CTE2 AS (<br />
&nbsp; &nbsp; SELECT col ..., ROW_NUMBER() <br />
&nbsp; &nbsp; FROM (<br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT col ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; JOIN #T1 ON ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; JOIN [VIEW2] ON ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; JOIN [TABLE] ON ...<br />
&nbsp; &nbsp; ) AS VT <br />
)<br />
INSERT INTO #T2 ...<br />
SELECT col FROM CTE2 ...<br />
;<br />
<br />
WITH CTE3 A (<br />
&nbsp; &nbsp; SELECT col ...<br />
&nbsp; &nbsp; FROM [VIEW]<br />
&nbsp; &nbsp; JOIN [VIEW4] ON ...<br />
)<br />
INSERT INTO #T3 ...<br />
SELECT col FROM CTE3 ...<br />
;<br />
<br />
<br />
SELECT col ...<br />
FROM (<br />
&nbsp; &nbsp; SELECT <br />
&nbsp; &nbsp; &nbsp; &nbsp; col,<br />
&nbsp; &nbsp; &nbsp; &nbsp; STUFF((SELECT '', '' + col <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM CTE2 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WHERE CTE2.ID = CTE1.ID<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FOR XML PATH('''')), 1, 1, '''') AS colconcat, &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; FROM (<br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT col ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; FROM #T1<br />
&nbsp; &nbsp; &nbsp; &nbsp; LEFT JOIN #T2 ON ... &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; LEFT JOIN (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT col <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM #T3<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GROUP BY col<br />
&nbsp; &nbsp; &nbsp; &nbsp; ) AS T1 ON ...<br />
&nbsp; &nbsp; ) AS T2 <br />
&nbsp; &nbsp; GROUP BY col ...<br />
)</div></div>
<p>However, it was not enough, and the query continued to consume a lot of CPU time as shown below:</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-1-profiler-performance-current-e1605891229645.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-1-profiler-performance-current-e1605891229645.jpg" alt="169 - 1 - profiler performance current" width="800" height="65" class="alignnone size-full wp-image-1711" /></a></p>
<p>CPU time was around 20s per execution. CPU time is greater than duration time due to parallelization. Regarding the environment you are, you would say having such CPU time can be common for reporting queries and you’re probably right. But let’s say in my context where all reporting queries are offloaded in a secondary availability group replica (SQL Server 2017), we wanted to keep the read only CPU footprint as low as possible to guarantee a safety margin of CPU resources to address scenarios where all the traffic (including both R/W and R/O queries) is redirected to the primary replica (maintenance, failure and so on).  The concerned report is executed on-demand by users and mostly contribute to create high CPU spikes among other reporting queries as shown below:</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-2-grafana-CPU-current.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-2-grafana-CPU-current.jpg" alt="169 - 2 - grafana CPU current" width="406" height="204" class="alignnone size-full wp-image-1712" /></a></p>
<p>Testing this query on DEV environment gave following statistic execution outcomes:</p>
<p>SQL Server Execution Times:<br />
   <strong>CPU time = 12988 ms,  elapsed time = 6084 ms.</strong><br />
SQL Server parse and compile time:<br />
   CPU time = 0 ms, elapsed time = 0 ms.</p>
<p>… with the related execution plan (not estimated). In fact, I put only the final SELECT step because it was the main culprit of high CPU consumption for this query – (plan was anonymized by SQL Sentry Plan Explorer):</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-3-query-execution-plan-current.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-3-query-execution-plan-current-1024x149.jpg" alt="169 - 3 - query execution plan current" width="584" height="85" class="alignnone size-large wp-image-1713" /></a></p>
<p>Real content of the query doesn’t matter for this write-up, but you probably have noticed I put explicitly concatenation stuff with XML PATH construct previously and I identified the execution path in the query plan above. This point will be important in the last section of this write-up. </p>
<p>First, because CPU is my main concern, I only selected CPU cost and you may notice top consumers are repartition streams and hash match operators followed by Lazy spool used with XML PATH and correlated subquery. </p>
<p>Then rewriting the query could be a good option but we first tried to find out some quick wins to avoid engaging too much time for refactoring stuff. Focusing on the different branches of this query plan and operators engaged from the right to the left, we make assumption that experimenting <a href="https://techcommunity.microsoft.com/t5/sql-server/columnstore-index-performance-batchmode-execution/ba-p/385054" rel="noopener" target="_blank">batch mode</a> could help reducing the overall CPU time on the highlighted branch. But because we are not dealing with billion of rows within temporary tables, we didn’t want to get extra overhead of maintaining compressed columnstore index structure. I remembered reading an very interesting <a href="https://www.itprotoday.com/sql-server/what-you-need-know-about-batch-mode-window-aggregate-operator-sql-server-2016-part-1" rel="noopener" target="_blank">article</a> in 2016 about the creation of dummy non-clustered columnstore indexes (NCCI) with filter capabilities to enable batch mode and it seemed perfectly fit with our scenario. In parallel, we went through inline index creation capabilities to neither trigger recompilation of the batch statement nor to prevent temp table caching. The target is to save CPU time <img src="https://blog.developpez.com/mikedavem/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>So, the temp table and inline non-clustered columnstore  index DDL was as follows:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE #T1 ( col ..., INDEX CCI_IDX_T1 NONCLUSTERED COLUMNSTORE (col) ) WHERE col &amp;lt; 1<br />
CREATE TABLE #T2 ( col ..., INDEX CCI_IDX_T2 NONCLUSTERED COLUMNSTORE (col) ) WHERE col &amp;lt; 1<br />
CREATE TABLE #T3 ( col ..., INDEX CCI_IDX_T3 NONCLUSTERED COLUMNSTORE (col) ) WHERE col &amp;lt; 1<br />
…</div></div>
<p>Note the WHERE clause here with an out-of-range value to create an empty NCCI. </p>
<p>After applying the changes here, the new statistic execution metrics we got:</p>
<p>SQL Server Execution Times:<br />
   <strong>CPU time = 2842 ms,  elapsed time = 6536 ms.</strong><br />
SQL Server parse and compile time:<br />
   CPU time = 0 ms, elapsed time = 0 ms.</p>
<p>&#8230; and the related execution plan:</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-4-query-execution-plan-first-optimization.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-4-query-execution-plan-first-optimization-1024x277.jpg" alt="169 - 4 - query execution plan first optimization" width="584" height="158" class="alignnone size-large wp-image-1715" /></a></p>
<p>A drop of CPU time consumption (2.8s vs 12s) per execution when the batch mode kicked-in. A good news for sure but something continued to draw my attention because even if batch mode came into play here, it was not propagated to the left and seem to stop at the level of XML PATH execution. After reading my <a href="http://www.nikoport.com/2018/10/12/batch-mode-part-4-some-of-the-limitations/" rel="noopener" target="_blank">preferred reference</a> on this topic (thank you Niko), I was able to confirm my suspicion of unsupported XML operation with batch mode. Unfortunately, I was out of luck to confirm with <strong>column_store_expression_filter_apply</strong> extended event that seem to not work for me. </p>
<p>Well, to allow the propagation of batch mode to the left side of the execution plan, it was necessary to write and move the correlated subquery with XML path to a simple JOIN and STRING_AGG() function – available since SQL Server 2016:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;height:450px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-- Concat with XML PATH<br />
SELECT <br />
&nbsp; &nbsp; col,<br />
&nbsp; &nbsp; STUFF((SELECT '', '' + col <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM CTE2 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE CTE2.col = CTE1.col<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FOR XML PATH('''')), 1, 1, '''') AS colconcat,<br />
&nbsp; &nbsp; ...<br />
FROM [TABLE]<br />
<br />
-- Concat with STRING_AGG<br />
SELECT <br />
&nbsp; &nbsp; col,<br />
&nbsp; &nbsp; V.colconcat,<br />
&nbsp; &nbsp; ...<br />
FROM [TABLE] AS T<br />
JOIN (<br />
&nbsp; &nbsp; SELECT <br />
&nbsp; &nbsp; &nbsp; &nbsp; col,<br />
&nbsp; &nbsp; &nbsp; &nbsp; STRING_AGG(col2, ', ') AS colconcat<br />
&nbsp; &nbsp; FROM #T2 <br />
&nbsp; &nbsp; GROUP BY col<br />
) AS V ON V.col = T.col</div></div>
<p>The new change gave this following outcome:</p>
<p>SQL Server Execution Times:<br />
   <strong>CPU time = 2109 ms,  elapsed time = 1872 ms</strong>.</p>
<p>and new execution plan:</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-5-query-execution-plan-2n-optimization.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-5-query-execution-plan-2n-optimization-1024x189.jpg" alt="169 - 5 - query execution plan 2n optimization" width="584" height="108" class="alignnone size-large wp-image-1719" /></a></p>
<p>First, batch mode is now propagated from the right to the left of the query execution plan because we eliminated all inhibitors including XML construct.  We got not real CPU reduction this time, but we managed to reduce global execution time. The hash match aggregate operator is the main CPU consumer and it is the main candidate to benefit from batch mode. All remaining operators on the left side process few rows and my guess is that batch mode may appear less efficient than with the main consumer in this case. But anyway, note we also got rid of the Lazy Spool operator with the refactoring of the XML path and correlated subquery by STRING_AGG() and JOIN construct.</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-6-profiler-performance-optimization-e1605891681487.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-6-profiler-performance-optimization-1024x59.jpg" alt="169 - 6 - profiler performance optimization" width="584" height="34" class="alignnone size-large wp-image-1716" /></a></p>
<p>The new result is better by far compared to the initial scenario (New CPU time: 3s vs Old CPU Time: 20s). It also had good effect of the overall workload on the AG read only replica:</p>
<p><a href="http://blog.developpez.com/mikedavem/files/2020/11/169-7-grafana-CPU-optimization-e1605891720209.jpg"><img src="http://blog.developpez.com/mikedavem/files/2020/11/169-7-grafana-CPU-optimization-1024x199.jpg" alt="169 - 7 - grafana CPU optimization" width="584" height="113" class="alignnone size-large wp-image-1717" /></a></p>
<p>Not so bad for a quick win!<br />
See you</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Les 24 heures du PASS (24HOP) – édition francophone</title>
		<link>https://blog.developpez.com/mikedavem/p13110/sql-server-2005/les-24-heures-du-pass-24hop-edition-francophone</link>
		<comments>https://blog.developpez.com/mikedavem/p13110/sql-server-2005/les-24-heures-du-pass-24hop-edition-francophone#comments</comments>
		<pubDate>Sat, 24 Sep 2016 06:25:00 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[Evénements]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2008 R2]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[24HOP]]></category>
		<category><![CDATA[columnstore]]></category>
		<category><![CDATA[Pass]]></category>
		<category><![CDATA[PowerBI]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[tempdb]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1268</guid>
		<description><![CDATA[Cette année a eu lieu la première édition francophone des 24h du PASS (les 20 et 21 septembre 2016). L’idée était plutôt simple: proposer une série de 24 webinaires gratuits de 10h jusqu’à 22h (heure française) pendant 2 jours. C’était &#8230; <a href="https://blog.developpez.com/mikedavem/p13110/sql-server-2005/les-24-heures-du-pass-24hop-edition-francophone">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.developpez.com/mikedavem/files/2016/09/24hour_pass.jpg"><img src="http://blog.developpez.com/mikedavem/files/2016/09/24hour_pass.jpg" alt="24hour_pass" width="600" height="360" class="alignnone size-full wp-image-1269" /></a></p>
<p>Cette année a eu lieu la première édition francophone des <a href="http://www.sqlpass.org/24hours/2016/french/About.aspx" target="_blank">24h du PASS</a>  (les 20 et 21 septembre 2016). L’idée était plutôt simple: proposer une série de 24 webinaires gratuits de 10h jusqu’à 22h (heure française)  pendant 2 jours. C’était l’occasion de recevoir et d’échanger les dernières informations autour de l’administration et du développement des bases de données, des nouvelles tendances côté Business Intelligence et du Cloud.</p>
<p>Pour ma part, c’est avec plaisir que j&rsquo;ai eu l&rsquo;occasion d&rsquo;échanger avec vous autour de 2 sujets: <a href="http://www.sqlpass.org/24hours/2016/french/Sessions/Details.aspx?sid=53479" target="_blank">tempdb et bonnes pratiques</a> ainsi que des <a href="http://www.sqlpass.org/24hours/2016/french/Sessions/Details.aspx?sid=53225" target="_blank">columnstore et leur implication dans les nouvelles tendances d’architecture BI</a> avec Thoi Dung TSP Microsoft Switzerland.</p>
<p>C&rsquo;est encore l’occasion de remercier les <a href="http://www.sqlpass.org/24hours/2016/french/Sponsors.aspx" target="_blank">sponsors</a> et <a href="https://thesqlgrrrl.wordpress.com/" target="_blank">Isabelle</a> sans qui ce type d’événement n’aurait certainement pas eu lieu.</p>
<p>Les slides et démos devraient arriver sous peu!</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exécution de procédures stockées peuvent échouer avec les index columnstore non cluster</title>
		<link>https://blog.developpez.com/mikedavem/p13070/sql-server-2012/execution-de-procedures-stockees-peuvent-echouer-avec-les-index-columnstore-non-cluster</link>
		<comments>https://blog.developpez.com/mikedavem/p13070/sql-server-2012/execution-de-procedures-stockees-peuvent-echouer-avec-les-index-columnstore-non-cluster#comments</comments>
		<pubDate>Sat, 09 Jul 2016 07:46:55 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[columnstore]]></category>
		<category><![CDATA[compilation]]></category>
		<category><![CDATA[procédure stockée]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1227</guid>
		<description><![CDATA[Dans ce billet, je voudrais parler d&#8217;une autre situation un peu étrange au premier coup d&#8217;œil avec les index columnstore non cluster. Précisions que je suis dans le même contexte que dans ce billet précédant. Pour rappel, il était question &#8230; <a href="https://blog.developpez.com/mikedavem/p13070/sql-server-2012/execution-de-procedures-stockees-peuvent-echouer-avec-les-index-columnstore-non-cluster">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans ce billet, je voudrais parler d&rsquo;une autre situation un peu étrange au premier coup d&rsquo;œil avec les index columnstore non cluster. Précisions que je suis dans le même contexte que dans ce billet précédant. Pour rappel, il était question de profiter des index columnstore après avoir installé SQL Server 2012 chez un de mes clients. Comme démontré dans le précédant billet, ce type d&rsquo;implémentation peut engendrer d&rsquo;autres problématiques and c&rsquo;est ce que je voudrais vous montrer ici &#8230;</p>
<p>&gt; <a href="http://blog.dbi-services.com/stored-procedure-execution-may-fail-with-nonclustered-columnstore-indexes/" target="_blank">Lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Columnstore index rebuild cannot start</title>
		<link>https://blog.developpez.com/mikedavem/p13068/sql-server-2012/columnstore-index-rebuild-cannot-start</link>
		<comments>https://blog.developpez.com/mikedavem/p13068/sql-server-2012/columnstore-index-rebuild-cannot-start#comments</comments>
		<pubDate>Sat, 09 Jul 2016 07:31:30 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[columnstore]]></category>
		<category><![CDATA[datawarehouse]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1220</guid>
		<description><![CDATA[Il y a quelques semaines,j&#8217;étais en charge de migrer une infrastructure Datawarehouse sur une version plus récente de SQL Server (passage de 2005 à 2012). Après discussion avec le client nous avons décidé de profiter des nouvelles fonctionnalités offertes par &#8230; <a href="https://blog.developpez.com/mikedavem/p13068/sql-server-2012/columnstore-index-rebuild-cannot-start">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il y a quelques semaines,j&rsquo;étais en charge de migrer une infrastructure Datawarehouse sur une version plus récente de SQL Server (passage de 2005 à 2012). Après discussion avec le client nous avons décidé de profiter des nouvelles fonctionnalités offertes par 2012 et en particulier des index columnstore qui pouvaient potentiellement améliorer les performances de Reporting dans le contexte présent &#8230;</p>
<p>&gt; <a href="http://blog.dbi-services.com/columnstore-index-rebuild-cannot-start/" target="_blank">Lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Index cluster columnstore et gestion de la mémoire</title>
		<link>https://blog.developpez.com/mikedavem/p12933/sql-server-2012/index-cluster-columnstore-et-gestion-de-la-memoire</link>
		<comments>https://blog.developpez.com/mikedavem/p12933/sql-server-2012/index-cluster-columnstore-et-gestion-de-la-memoire#comments</comments>
		<pubDate>Sun, 01 Nov 2015 13:50:21 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[columnstore]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1077</guid>
		<description><![CDATA[Il ya quelques semaines, j&#8217;ai eu l&#8217;occasion de donner une session sur la fonction d&#8217;index cluster columnstore (CCI) lors de notre événement In-Memory dédié aux technologies Microsoft SQL Server, Oracle et SAP HANA. Au cours de notre session, j&#8217;ai expliqué &#8230; <a href="https://blog.developpez.com/mikedavem/p12933/sql-server-2012/index-cluster-columnstore-et-gestion-de-la-memoire">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il ya quelques semaines, j&rsquo;ai eu l&rsquo;occasion de donner une session sur la fonction d&rsquo;index cluster columnstore (CCI) lors de notre <a href="http://www.dbi-services.com/newsroom/events/" target="_blank">événement</a> In-Memory dédié aux technologies Microsoft SQL Server, Oracle et SAP HANA. Au cours de notre session, j&rsquo;ai expliqué les améliorations apportées par Microsoft sur SQL Server 2014, avec l&rsquo;introduction du nouvel index cluster columnstore (CCI).</p>
<p>Le CCI comprend une nouvelle structure qui permet des opérations de mise à jour: le fameux deltastore. En effet, les opérations d&rsquo;insertion vont directement dans ce magasin. La suppression de données est purement logique et va être également répertorié dans une partie du deltastore appelée deleted bitmap. Enfin la mise à jour de données va se transformer en 2 opérations élémentaires INSERT et DELETE. En réalité, j&rsquo;étais très intéressé de savoir comment s&rsquo;articulait ces deux structures spécifiques (deltastore et columnstore) et comment SQL Server gérait la mémoire la mémoire dans ces différents scénarios. Ce blog est simplement le résultat de mes études et concerne probablement ceux qui aiment regarder sous le capot de SQL Server. Pour être tout à fait honnête, l&rsquo;idée m&rsquo;est venue lorsque je discutais avec un de mes amis &laquo;&nbsp;Oraclien&nbsp;&raquo; et qui me posaient des questions intéressantes sur la gestion du CCI.</p>
<p>&gt; <a href="http://blog.dbi-services.com/clustered-columnstore-index-and-memory-management/" target="_blank">Lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server 2016 : groupes de disponibilités AlwaysOn et support des index columnstore sur les secondaires</title>
		<link>https://blog.developpez.com/mikedavem/p12931/sql-server-2016/sql-server-2016-groupes-de-disponibilites-alwayson-et-support-des-index-columnstore-sur-les-secondaires</link>
		<comments>https://blog.developpez.com/mikedavem/p12931/sql-server-2016/sql-server-2016-groupes-de-disponibilites-alwayson-et-support-des-index-columnstore-sur-les-secondaires#comments</comments>
		<pubDate>Sun, 01 Nov 2015 13:24:46 +0000</pubDate>
		<dc:creator><![CDATA[mikedavem]]></dc:creator>
				<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[AlwaysOn]]></category>
		<category><![CDATA[columnstore]]></category>
		<category><![CDATA[Groupes de disponibilités]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/mikedavem/?p=1070</guid>
		<description><![CDATA[Après avoir fait le tour des quelques améliorations du côté de la fonction d&#8217;index columnstore, j&#8217;ai été étonné de voir la section suivante &#62; Lire la suite (en anglais) David Barbarin MVP &#38; MCM SQL Server]]></description>
				<content:encoded><![CDATA[<p>Après avoir fait le tour  des quelques améliorations du côté de la fonction d&rsquo;index columnstore, j&rsquo;ai été étonné de voir la section suivante</p>
<p>&gt; <a href="http://blog.dbi-services.com/sql-server-2016-availability-groups-and-the-new-clustered-columnstore-index-support/" target="_blank">Lire la suite</a> (en anglais)</p>
<p>David Barbarin<br />
MVP &amp; MCM SQL Server</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
