<?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>Azure - dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/category/azure/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/category/azure/</link>
	<description></description>
	<lastBuildDate>Mon, 26 Oct 2026 17:27:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/05/cropped-favicon_512x512px-min-32x32.png</url>
	<title>Azure - dbi Blog</title>
	<link>https://www.dbi-services.com/blog/category/azure/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Azure SQL Database: does automatic index compaction fix the UUIDv7 density problem?</title>
		<link>https://www.dbi-services.com/blog/azure-sql-database-does-automatic-index-compaction-fix-the-uuidv7-density-problem/</link>
					<comments>https://www.dbi-services.com/blog/azure-sql-database-does-automatic-index-compaction-fix-the-uuidv7-density-problem/#respond</comments>
		
		<dc:creator><![CDATA[Louis Tochon]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Development & Performance]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Azure SQL Database]]></category>
		<category><![CDATA[UUIDv7]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47986</guid>

					<description><![CDATA[<p>Does Azure SQL automatic index compaction fix UUIDv7 page density? Yes after a load, but with continuous inserts it needs a fill factor below 100.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/azure-sql-database-does-automatic-index-compaction-fix-the-uuidv7-density-problem/">Azure SQL Database: does automatic index compaction fix the UUIDv7 density problem?</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="h-where-part-1-left-off" class="wp-block-heading">Where part 1 left off</h2>



<p class="wp-block-paragraph">In <a href="https://www.dbi-services.com/blog/why-uuidv7-does-not-reduce-fragmentation-in-sql-server/" target="_blank" rel="noopener">part 1</a>, UUIDv7 did not fix the page density of a GUID clustered index in SQL Server. SQL Server sorts <code>uniqueidentifier</code> values starting from the last six bytes, which are random in a UUIDv7, so new rows land anywhere in the index. After 25,000 single-row inserts, the UUIDv7 and <code>NEWID()</code> indexes were both ~68 % full, close to the <a href="https://arxiv.org/html/2603.12211v1" data-type="link" data-id="https://arxiv.org/html/2603.12211v1">69 % expected for random inserts into a B-tree</a>, against ~98 % for <code>NEWSEQUENTIALID()</code>.</p>



<p class="wp-block-paragraph">Since then, <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">automatic index compaction</a> has become generally available in Azure SQL Database. This post checks whether it closes that gap.</p>



<p class="wp-block-paragraph"><strong><span style="text-decoration: underline">This is deliberately an unfavorable case for the feature.</span></strong> A random clustering key on a small table under steady inserts is close to the worst workload for page density. It is also a case that is spreading in production, as more applications generate GUID or UUIDv7 keys on their side. </p>



<h2 id="h-automatic-index-compaction-in-short" class="wp-block-heading">Automatic index compaction in short</h2>



<p class="wp-block-paragraph">My colleague <a href="https://www.linkedin.com/in/amine-haloui-76968056/" data-type="link" data-id="https://www.linkedin.com/in/amine-haloui-76968056/">Amine Haloui</a> covered the feature in two posts: <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-preview-part-1/" target="_blank" rel="noopener">part 1</a> explains the difference between page density and fragmentation, <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/" target="_blank" rel="noopener">part 2</a> shows how compaction works with a demo. The short version:</p>



<p class="wp-block-paragraph">Automatic index compaction runs inside the persistent version store cleaner of Accelerated Database Recovery. It visits recently modified pages, moves rows from the next page into a page that has free space, and deallocates the pages that end up empty. You enable it per database with <code>ALTER DATABASE ... SET AUTOMATIC_INDEX_COMPACTION = ON</code>, without a restart.</p>



<p class="wp-block-paragraph">It only acts <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">on pages modified after it was enabled</a>, does not move rows into the space reserved by the fill factor (nor free it once inserts have used it), <strong>does not reduce fragmentation and does not update statistics</strong>.</p>



<p class="wp-block-paragraph">It has been generally available since September 2026 on Azure SQL Database, Azure SQL Managed Instance with the always-up-to-date update policy, and SQL database in Fabric. It is not in SQL Server 2025 on-premises, so all the tests below run on Azure SQL Database.</p>



<p class="wp-block-paragraph">In short: <strong>when inserts pause, it closes most of the gap. While they keep coming, it cannot fix the underlying problem, a key that sends inserts to random positions. At the default fill factor the index even ends up larger than without compaction, and a lower fill factor limits the effect. Measuring page splits shows why: each compaction pass is followed by a wave of splits.</strong></p>



<h2 id="h-what-has-already-been-shown" class="wp-block-heading">What has already been shown</h2>



<p class="wp-block-paragraph">I found two representative public tests. In both the clustering key is ordered (Microsoft&#8217;s test table has a <code>NEWID()</code> column, but not in the key) and the empty space comes from deletes or from a workload that then stops:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Author</th><th>Clustering key</th><th>Workload</th><th>Result</th></tr><tr><td><a href="https://techcommunity.microsoft.com/blog/azuresqlblog/stop-defragmenting-and-start-living-introducing-auto-index-compaction/4500089" target="_blank" rel="noopener">Microsoft, announcement post</a></td><td>Sequence</td><td>Sequential inserts; updates and deletes at random positions</td><td>Page density 52.7 % after the workload, 96.1 % after compaction; logical reads 1,610 → 35</td></tr><tr><td><a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/" target="_blank" rel="noopener">Amine Haloui (dbi services)</a></td><td><code>int IDENTITY</code></td><td>Delete 2 rows out of 3</td><td>Fullness 31.6 % after the delete, 94.6 % after compaction</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Sources: <a href="https://techcommunity.microsoft.com/blog/azuresqlblog/stop-defragmenting-and-start-living-introducing-auto-index-compaction/4500089" data-type="link" data-id="https://techcommunity.microsoft.com/blog/azuresqlblog/stop-defragmenting-and-start-living-introducing-auto-index-compaction/4500089">Microsoft announcement post</a>, <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/" data-type="link" data-id="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/">Amine Haloui part 2</a>.</p>



<p class="wp-block-paragraph">In both cases, compaction brings page density back to about 95 % with no maintenance job. This post looks at the case these tests leave out: a random key under steady inserts.</p>



<h2 id="h-lab-setup" class="wp-block-heading">Lab setup</h2>



<p class="wp-block-paragraph">Two Azure SQL databases on the same server, General Purpose serverless, 2 vCores: <code>GuidLab_On</code> with compaction, <code>GuidLab_Off</code> as the control. Every test runs in both at the same time. The tables are those of part 1: a <code>uniqueidentifier</code> clustered primary key filled by <code>NEWID()</code>, a UUIDv7 (RFC 9562) or <code>NEWSEQUENTIALID()</code>, plus a <code>char(100)</code> payload, with rows inserted one per statement.</p>



<p class="wp-block-paragraph">Each run preloads 5,000 rows per table. The occasional-insert run then measures every 10 seconds for 3 minutes. The continuous-insert runs wait 2 minutes, insert a burst every 10 seconds for 3 minutes, then measure one more minute without inserts. Two parameters vary: the fill factor (100, 90 or 80) and the burst size, 300 rows (6 % of the table) or 50 rows (1 %). Pages and fullness come from <code><a href="https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-objects/sys-dm-db-index-physical-stats-transact-sql?view=sql-server-ver17" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-objects/sys-dm-db-index-physical-stats-transact-sql?view=sql-server-ver17">sys.dm_db_index_physical_stats</a></code> in <code>DETAILED</code> mode, rows moved from the <code>compaction_row_move_count</code> column of <code><a href="https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-objects/sys-dm-db-index-operational-stats-transact-sql?view=sql-server-ver17" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-objects/sys-dm-db-index-operational-stats-transact-sql?view=sql-server-ver17">sys.dm_db_index_operational_stats</a></code>. </p>



<h2 id="h-occasional-inserts-compaction-does-the-job" class="wp-block-heading">Occasional inserts: compaction does the job</h2>



<p class="wp-block-paragraph">5,000 rows inserted, then no more writes, as when inserts come in batches with quiet periods between them.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="546" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-87-1024x546.png" alt="" class="wp-image-48104" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-87-1024x546.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-87-300x160.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-87-767x409.png 767w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-87-1536x819.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-87.png 1800w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Without compaction, the index stays at 123 to 128 pages, 67 to 70 % full. With it, it drops to 92 to 94 pages, 91 to 93 % full, in under two minutes, close to the 87 pages of the sequential key. Most of the drop happens in a single pass.</p>



<p class="wp-block-paragraph">Compaction also moves some rows more than once: 6,345 and 8,991 moves for 5,000 rows.</p>



<h2 id="h-continuous-inserts-6-of-the-table-every-10-seconds" class="wp-block-heading">Continuous inserts, 6 % of the table every 10 seconds</h2>



<p class="wp-block-paragraph">Now 300 rows per table every 10 seconds, 6 % of the table per burst, for three minutes, then one minute without inserts. Each configuration ran at least twice; the figures below cover all runs and both random keys. The chart shows the first run, for UUIDv7.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="471" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-88-1024x471.png" alt="" class="wp-image-48105" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-88-1024x471.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-88-767x353.png 767w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-88-1536x707.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-88-300x138.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-88.png 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>At fill factor 100, compaction cannot keep up with this pattern.</strong> In the first run, the first burst takes the compacted index from 93 to 172 pages. At the end of the inserts it holds 326 to 334 pages, against 253 to 271 without compaction, and average fullness during the inserts is 56 %, against 68 to 70 %. Over the run, compaction moved more than 51,000 rows for a table of 10,400.</p>



<p class="wp-block-paragraph">The explanation is that an index nobody compacts keeps about 31 % (100 minus 69) free space, which absorbs part of the next inserts. At fill factor 100, compaction moves rows into a page <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">as long as they fit</a>, so most pages are left with little room, and the next random insert splits them. Each split also writes far more log than a plain insert, <a href="https://www.sqlskills.com/blogs/paul/how-expensive-are-page-splits-in-terms-of-transaction-log/" data-type="link" data-id="https://www.sqlskills.com/blogs/paul/how-expensive-are-page-splits-in-terms-of-transaction-log/">about 18 times more for rows of similar size in Paul Randal&#8217;s test</a>.</p>



<p class="wp-block-paragraph"><strong>A lower fill factor helps.</strong> When pages split again soon after compaction, <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">the documentation suggests</a> <em>a fill factor of 70 to 95 %, while noting that most workloads do best at 100</em>, and the index maintenance guidance gives nonsequential GUID keys <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes?view=sql-server-ver17" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes?view=sql-server-ver17">as its example</a>. At 80, compaction leaves 20 % of each page free, at 90 only 10 %. That free space lets a page absorb a few random inserts before it splits.</p>



<p class="wp-block-paragraph">At 80, average fullness during the inserts is 76 % in all three runs, against 68 to 70 % without compaction, and one minute after the inserts the index holds 223 to 230 pages, against 253 to 271. The gain is real but modest at this rate. At 90, the margin is too thin: average fullness is 66 to 69 %, and one run ended the inserts with 324 pages, more than without compaction.</p>



<p class="wp-block-paragraph">Once the inserts stop, fill factor 100 catches up in one pass and ends the smallest: 202 to 207 pages.</p>



<h2 id="h-page-splits-at-fill-factor-100" class="wp-block-heading"><strong>Page splits at fill factor 100</strong></h2>



<p class="wp-block-paragraph">To check the explanation above, I ran the 6 % test twice more at fill factor 100 and also recorded two counters from <code>sys.dm_db_index_operational_stats</code>: <code>leaf_allocation_count</code>, the number of leaf pages allocated, and <code>compaction_page_deallocation_count</code>, the number of pages compaction freed. Compaction only moves rows into pages that have room and frees the pages that end up empty, so the allocations come from the inserts. With a random key, new rows land anywhere in the index, so almost every allocation is a page split in the middle of it; with <code>NEWSEQUENTIALID()</code>, rows always go to the end, so every allocation is a new page there.</p>



<p class="wp-block-paragraph">Without compaction, the 5,400 inserts split about 130 pages. With compaction, about 460: 3.5 times more.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="799" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-89-1024x799.png" alt="" class="wp-image-48106" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-89-1024x799.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-89-300x234.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-89-768x599.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-89-1536x1198.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-89.png 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">The chart shows where they come from. Compaction ran about once a minute, and each time, the next burst split 78 to 133 pages. The bursts in between split 0 to 21, because the pages split by the previous wave were still half full and could take the new rows. The four bursts that followed a pass account for 90 % of the splits, and the page count follows the same steps.</p>



<p class="wp-block-paragraph">From the first burst to the end of the run, compaction moved 46,000 to 47,600 rows to free about 350 pages, about 130 rows per page freed. The counters add up: in the first run of this test (UUIDv7), 94 pages at the start, plus 461 allocations, minus 224 pages freed during the inserts, gives the 331 pages measured at the end of the inserts.</p>



<h2 id="h-continuous-inserts-1-of-the-table-every-10-seconds" class="wp-block-heading">Continuous inserts, 1 % of the table every 10 seconds</h2>



<p class="wp-block-paragraph">The same test at 50 rows per burst, 1 % of the table, also run at least twice. The chart shows the first run, for UUIDv7.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="471" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-90-1024x471.png" alt="" class="wp-image-48107" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-90-1024x471.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-90-300x138.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-90-767x353.png 767w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-90-1536x707.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-90.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Fill factor 100 still degrades.</strong> In the first run, the first 50 inserts turned 95 pages into 128: <strong>about two inserts in three split a page</strong>. The index ends the inserts at 176 to 194 pages, against 143 to 153 without compaction. The lower rate only slows the degradation.</p>



<p class="wp-block-paragraph"><strong>At 90 and 80, compaction helps throughout.</strong> Average fullness stays at 81 to 85 %, against 66 to 70 % without compaction, and the index ends at 115 to 121 pages, about 20 % fewer. Fullness never drops below 77 % at 90 and 74 % at 80. The two fill factors end at the same size.</p>



<p class="wp-block-paragraph">At fill factor 80, the inserts slowly fill the 20 % that compaction leaves free: fullness rose from 73-76 % before the first burst to about 85 % in three minutes. <strong>Compaction does not give that space back</strong>. <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">As the documentation puts it</a>, “if that reserved space is already filled by the previous data modifications, then compaction doesn’t currently free it up”. Only a rebuild restores the margin.</p>



<h2 id="h-all-results" class="wp-block-heading">All results</h2>



<p class="wp-block-paragraph">Each cell gives the range over all runs and both random keys (<code>NEWID()</code> and UUIDv7). The occasional-insert case ran once; its cells read <code>NEWID()</code> / UUIDv7.</p>



<p class="wp-block-paragraph"><strong>Occasional inserts (5,000 rows, then 3 minutes without writes)</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Configuration</th><th class="has-text-align-right" data-align="right">Pages at the start</th><th class="has-text-align-right" data-align="right">Pages after 3 min</th><th class="has-text-align-right" data-align="right">Fullness after 3 min</th><th class="has-text-align-right" data-align="right">Rows moved</th></tr><tr><td>No compaction</td><td class="has-text-align-right" data-align="right">128 / 123</td><td class="has-text-align-right" data-align="right">128 / 123</td><td class="has-text-align-right" data-align="right">67.1 / 69.8 %</td><td class="has-text-align-right" data-align="right">0 / 0</td></tr><tr><td>Compaction, FF 100</td><td class="has-text-align-right" data-align="right">123 / 126</td><td class="has-text-align-right" data-align="right">92 / 94</td><td class="has-text-align-right" data-align="right">93.3 / 91.3 %</td><td class="has-text-align-right" data-align="right">6,345 / 8,991</td></tr><tr><td><code>NEWSEQUENTIALID()</code>, FF 100</td><td class="has-text-align-right" data-align="right">87</td><td class="has-text-align-right" data-align="right">87</td><td class="has-text-align-right" data-align="right">98.7 %</td><td class="has-text-align-right" data-align="right">0</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Continuous inserts, 6 % per burst (300 rows every 10 s, 10,400 rows at the end)</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Configuration</th><th>Average fullness during the inserts</th><th>Pages at the end of the inserts</th><th>Pages 1 min later</th><th>Rows moved</th></tr></thead><tbody><tr><td>No compaction</td><td>68.2-69.7 %</td><td>253-271</td><td>unchanged</td><td>0</td></tr><tr><td>Compaction, FF 100</td><td>55.5-56.2 %</td><td>326-334</td><td>202-207</td><td>51,181-51,955</td></tr><tr><td>Compaction, FF 90</td><td>66.0-69.1 %</td><td>239-324</td><td>215-218</td><td>37,702-46,097</td></tr><tr><td>Compaction, FF 80</td><td>75.9-76.4 %</td><td>226-261</td><td>223-230</td><td>22,357-26,708</td></tr><tr><td><code>NEWSEQUENTIALID()</code>, FF 100</td><td>99.2 %</td><td>180</td><td>180</td><td>0</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Continuous inserts, 1 % per burst (50 rows every 10 s, 5,900 rows at the end)</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Configuration</th><th>Average fullness during the inserts</th><th>Pages at the end of the inserts</th><th>Pages 1 min later</th><th>Rows moved</th></tr></thead><tbody><tr><td>No compaction</td><td>66.3-70.3 %</td><td>143-153</td><td>unchanged</td><td>0</td></tr><tr><td>Compaction, FF 100</td><td>56.1-58.0 %</td><td>176-194</td><td>107-118</td><td>36,203-40,628</td></tr><tr><td>Compaction, FF 90</td><td>84.3-85.2 %</td><td>115-121</td><td>114-117</td><td>12,543-16,108</td></tr><tr><td>Compaction, FF 80</td><td>81.2-82.3 %</td><td>117-120</td><td>117-120</td><td>5,799-11,418</td></tr><tr><td><code>NEWSEQUENTIALID()</code>, FF 100</td><td>99.1 %</td><td>102</td><td>102</td><td>0</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">“Rows moved” counts every row compaction moved during the run: after the preload, during the inserts and in the final pass after them. “Pages at the end of the inserts” is a snapshot that depends on when the last compaction pass ran, so average fullness is the more stable measure. <code>NEWSEQUENTIALID()</code> gives the same figures with and without compaction: there is nothing to compact.</p>



<h2 id="h-what-i-expected-and-what-held" class="wp-block-heading">What I expected, and what held</h2>



<ol class="wp-block-list">
<li><strong>Once the inserts stop, compaction brings the random keys well above 68 %.</strong> Held: 91 to 93 % within two minutes.</li>



<li><strong>Under continuous inserts, fullness drops after each burst and recovers between them, averaging somewhere in between.</strong> Wrong at the default fill factor: it averages below the uncompacted index, not above it.</li>



<li><strong><code>NEWID()</code> and UUIDv7 behave the same.</strong> Held for pages and fullness: the averages stay within three points. Rows moved differ by up to 50 % between the two keys, in no consistent direction; probably because the rows moved depend on how free space is spread across the index, which is random.</li>



<li><strong>Compaction finds nothing to do on <code>NEWSEQUENTIALID()</code>.</strong> Held: zero rows moved in every run.</li>
</ol>



<h2 id="h-so-should-you-rely-on-it" class="wp-block-heading">So, should you rely on it?</h2>



<p class="wp-block-paragraph">For a random clustering key, automatic index compaction <strong>is worth enabling</strong>, but it does not address the root cause: inserts that land at random positions. The fill factor decides how much it can help.</p>



<ul class="wp-block-list">
<li><strong>Inserts in batches with quiet periods:</strong> the default fill factor of 100 works. Compaction catches up within a minute or two and gives the densest random-key index. Each new batch still splits many of the freshly compacted pages.</li>



<li><strong>A steady stream of inserts:</strong> at the default fill factor, compaction makes the index larger than doing nothing. A fill factor of 80 helped at both rates tested; 90 helped only at the gentler one.</li>



<li><strong>Existing indexes:</strong> <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">compaction ignores pages not modified since you enabled it</a>, so rebuild once first. The rebuild is also where you set the fill factor.</li>



<li><strong>Watch page fullness and log volume, not fragmentation</strong>, <a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb" data-type="link" data-id="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">which can go up with compaction</a>.</li>



<li><strong>The key choice from part 1 still stands:</strong> the sequential key stayed the smallest in every run, and compaction never fully closed the gap. These results emphasize how much the application side matters. The clustering key is usually chosen by developers, often for good reasons, so it is a decision worth taking together with whoever runs the database, early, before the table holds millions of rows. </li>



<li>And on-premises nothing changes for now, since the feature is not in SQL Server 2025.</li>
</ul>



<h2 id="h-limits-of-these-tests" class="wp-block-heading">Limits of these tests</h2>



<ul class="wp-block-list">
<li><strong>Small tables, few runs per configuration.</strong> 5,000 to 10,400 rows. Control runs of the same setup differ by up to 18 pages.</li>



<li><strong>Intense rates.</strong> 1 % and 6 % of the table every 10 seconds. On a large table, the same inserts per second touch a far smaller share of its pages; how that changes the outcome was not tested.</li>



<li><strong>Short runs.</strong> Three minutes of inserts; how the index behaves at 80 or 90 over hours was not measured.</li>



<li><strong>An unfavorable case by design. </strong>These results say nothing about how the feature behaves on other workloads.</li>



<li><strong>One platform.</strong> Azure SQL Database, General Purpose serverless, 2 vCores, one inserting session.</li>
</ul>



<p class="wp-block-paragraph">If you want to reproduce these tests, feel free <a href="https://www.linkedin.com/in/louis-tochon-309343204/" data-type="link" data-id="https://www.linkedin.com/in/louis-tochon-309343204/">to contact me</a> and I will share the full scripts.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/azure-sql-database-does-automatic-index-compaction-fix-the-uuidv7-density-problem/">Azure SQL Database: does automatic index compaction fix the UUIDv7 density problem?</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/azure-sql-database-does-automatic-index-compaction-fix-the-uuidv7-density-problem/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server: Automatic index compaction in Azure (preview) – Part 2</title>
		<link>https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/</link>
					<comments>https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/#respond</comments>
		
		<dc:creator><![CDATA[Amine Haloui]]></dc:creator>
		<pubDate>Tue, 28 Jul 2026 23:48:17 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=45983</guid>

					<description><![CDATA[<p>Why does index fragmentation matter less than before ? Logical fragmentation was a problem on spinning disks: an ordered scan on a fragmented index broke the read-ahead into smaller I/Os and each jump cost a disk head movement. On SSD, NVMe and cloud storage, the penalty of non-sequential reads is marginal. And the &#8220;physical order&#8221; [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/">SQL Server: Automatic index compaction in Azure (preview) – Part 2</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Why does index fragmentation matter less than before ?</strong></p>



<p class="wp-block-paragraph">Logical fragmentation was a problem on spinning disks: an ordered scan on a fragmented index broke the read-ahead into smaller I/Os and each jump cost a disk head movement. On SSD, NVMe and cloud storage, the penalty of non-sequential reads is marginal. And the &#8220;physical order&#8221; we used to restore so carefully is only the order of the pages inside the data file: below it, the file system, the SSD controller and the storage layer place the blocks wherever they want anyway.</p>



<p class="wp-block-paragraph"><strong>Here is the mapping to remember</strong></p>



<ul class="wp-block-list">
<li>Internal fragmentation = page density = fixed by automatic index compaction</li>



<li>External fragmentation = page order = ignored by automatic index compaction (it can even increase and we will see it in the demo)</li>
</ul>



<h2 id="h-how-does-it-work" class="wp-block-heading">How does it work ?</h2>



<p class="wp-block-paragraph">Automatic index compaction is not a hidden maintenance job. It is an additional task performed by a background process that already exists: the PVS cleaner is a component of Accelerated Database Recovery (ADR).</p>



<p class="wp-block-paragraph"><strong>Here is the principle</strong></p>



<ul class="wp-block-list">
<li>The PVS cleaner periodically visits the pages that were recently modified (insert, update, delete) to remove obsolete row versions</li>



<li>When automatic index compaction is enabled the cleaner also checks if the visited page has free space excluding the space reserved by the fill factor</li>



<li>If so, it moves rows from the next page into the current page as long as they fit and repeats the operation on a few consecutive page pairs</li>



<li>A page that becomes empty is deallocated</li>
</ul>



<p class="wp-block-paragraph">The result: the number of pages decreases, the page density increases, and the storage space, I/O, CPU and buffer pool consumption decrease.</p>



<p class="wp-block-paragraph">The overhead is minimal because the process only considers recently modified pages, unlike a rebuild or a reorganize which process all the pages. Like a reorganize, the compaction acquires short-term exclusive page locks to move the rows. If a lock cannot be acquired immediately, the page is simply skipped and will be considered again later.</p>



<p class="wp-block-paragraph">One command per database, no restart, no exclusive access. The compaction starts within minutes:</p>



<pre class="wp-block-code"><code>-- Enable the feature
ALTER DATABASE &#091;SQL-DB-1] SET AUTOMATIC_INDEX_COMPACTION = ON;

-- Check if it's enabled
SELECT name, is_automatic_index_compaction_on FROM sys.databases;</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="619" height="189" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-27.png" alt="" class="wp-image-45984" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-27.png 619w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-27-300x92.png 300w" sizes="auto, (max-width: 619px) 100vw, 619px" /></figure>



<p class="wp-block-paragraph"><strong>One important point before you enable it</strong></p>



<p class="wp-block-paragraph">The compaction process only considers the pages modified after you enable the feature. If the page density of your indexes is already low, run a one-time reorganize or rebuild to fix the existing situation. From that point on, the automatic compaction keeps the indexes compact without any action on your side.</p>



<p class="wp-block-paragraph"><strong>Demo</strong></p>



<ul class="wp-block-list">
<li>We create a table with a clustered primary key and we insert 5 million rows</li>



<li>We measure the baseline: page count, page density, fragmentation</li>



<li>We delete 2 rows out of 3, scattered over the whole table, to simulate index bloat</li>



<li>We measure again and we let the engine work</li>
</ul>



<p class="wp-block-paragraph">We create the table and we insert 50K rows:</p>



<pre class="wp-block-code"><code>CREATE TABLE dbo.Demo (
    Id      int IDENTITY CONSTRAINT PK_Demo PRIMARY KEY CLUSTERED,
    Payload char(400) NOT NULL DEFAULT REPLICATE('X', 400)
);

INSERT INTO dbo.Demo (Payload)
SELECT TOP (50000) REPLICATE('X', 400)
FROM sys.all_columns a CROSS JOIN sys.all_columns b;</code></pre>



<p class="wp-block-paragraph">We measure the baseline:</p>



<pre class="wp-block-code"><code>SELECT index_level, page_count, avg_page_space_used_in_percent,
       avg_fragmentation_in_percent, record_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.Demo'),1, NULL, 'SAMPLED')
WHERE alloc_unit_type_desc = 'IN_ROW_DATA';</code></pre>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="561" height="187" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-28.png" alt="" class="wp-image-45985" style="width:561px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-28.png 561w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-28-300x100.png 300w" sizes="auto, (max-width: 561px) 100vw, 561px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="644" height="301" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-29.png" alt="" class="wp-image-45986" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-29.png 644w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-29-300x140.png 300w" sizes="auto, (max-width: 644px) 100vw, 644px" /></figure>



<p class="wp-block-paragraph">We measure the baseline:</p>



<pre class="wp-block-code"><code>SELECT index_level, page_count, avg_page_space_used_in_percent,
       avg_fragmentation_in_percent, record_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.Demo'),1, NULL, 'SAMPLED')
WHERE alloc_unit_type_desc = 'IN_ROW_DATA';</code></pre>



<p class="wp-block-paragraph">The internal fragmentation is low.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="600" height="48" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-30.png" alt="" class="wp-image-45987" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-30.png 600w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-30-300x24.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<p class="wp-block-paragraph">Here is what we have:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="609" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-33-1024x609.png" alt="" class="wp-image-45992" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-33-1024x609.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-33-300x178.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-33-768x457.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-33.png 1500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">However to observe the automatic index compaction in action we need to create the following situation:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="337" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-34-1024x337.png" alt="" class="wp-image-45991" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-34-1024x337.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-34-300x99.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-34-768x253.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-34.png 1500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Here is the baseline:</p>



<figure class="wp-block-table alignwide is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>page_count</strong></td><td><strong>avg_page_space_used_in_percent</strong></td><td><strong>avg_fragmentation_in_percent</strong></td><td><strong>record_count</strong></td></tr><tr><td>2778</td><td>94.9269335310106</td><td>0.0359971202303816</td><td>50000</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>We create the bloat</strong></p>



<p class="wp-block-paragraph">We delete 2 rows out of 3 scattered uniformly over the table. No page becomes empty. Every page keeps around one third of its rows. We change page density:</p>



<pre class="wp-block-code"><code>DELETE FROM dbo.Demo WHERE Id % 3 &lt;&gt; 0;</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="49" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-36.png" alt="" class="wp-image-45996" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-36.png 393w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-36-300x37.png 300w" sizes="auto, (max-width: 393px) 100vw, 393px" /></figure>



<p class="wp-block-paragraph">Without automatic index compaction, the expectation is simple: the page count stays at 277778 (deletes alone do not deallocate non-empty pages) and the density drops to around 31% (one third of 94.93%).</p>



<p class="wp-block-paragraph"><strong>We measure again</strong></p>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>page_count</strong></td><td><strong>avg_page_space_used_in_percent</strong></td><td><strong>avg_fragmentation_in_percent</strong></td><td><strong>record_count</strong></td></tr><tr><td>2778</td><td>31.6245737583395</td><td>0.0359971202303816</td><td>16666</td></tr></tbody></table></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="768" height="160" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-37.png" alt="" class="wp-image-45997" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-37.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-37-300x63.png 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<p class="wp-block-paragraph"><strong>We let the engine finish its job and we check again</strong></p>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>page_count</strong></td><td><strong>avg_page_space_used_in_percent</strong></td><td><strong>avg_fragmentation_in_percent</strong></td><td>re<strong>cord_count</strong></td></tr><tr><td>929</td><td>94.6165184086978</td><td>99.8923573735199</td><td>16666</td></tr></tbody></table></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="574" height="43" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-40.png" alt="" class="wp-image-46000" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-40.png 574w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-40-300x22.png 300w" sizes="auto, (max-width: 574px) 100vw, 574px" /></figure>



<p class="wp-block-paragraph">The engine did the work in the background while the database stayed fully available.</p>



<p class="wp-block-paragraph">This feature replaces the compaction part of your maintenance strategy not the whole strategy.</p>



<p class="wp-block-paragraph"><strong>A summary</strong>:</p>



<ul class="wp-block-list">
<li>It does not update the statistics. A rebuild updates them the automatic compaction does not. If you rely on your rebuild jobs to refresh the statistics, keep a statistics update job.</li>



<li>It does not reduce the logical fragmentation and it can even increase as we saw in the demo. For most workloads this has no measurable impact</li>



<li>It does not recreate the free space reserved by the fill factor. Only a rebuild does. Workloads that need a fill factor below 100 to reduce page splits can still benefit from an occasional rebuild</li>



<li>It does not shrink the data files. The used space decreases, the allocated size does not change</li>



<li>It only applies to the leaf level of B-tree indexes in IN_ROW_DATA allocation units. Heaps, LOB data, row-overflow data, compressed columnstore rowgroups and memory-optimized tables are not concerned</li>



<li>Indexes with page locks disabled (ALLOW_PAGE_LOCKS = OFF) are not eligible</li>
</ul>



<h2 id="h-reference" class="wp-block-heading">Reference</h2>



<p class="wp-block-paragraph"><a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">Automatic Index Compaction &#8211; SQL Server | Microsoft Learn</a></p>



<p class="wp-block-paragraph">Thank you. <a href="https://www.linkedin.com/in/amine-haloui-76968056/" data-type="link" data-id="https://www.linkedin.com/in/amine-haloui-76968056/">Amine Haloui</a></p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/">SQL Server: Automatic index compaction in Azure (preview) – Part 2</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-in-azure-preview-part-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server: Automatic index compaction in Azure (preview) – Part 1</title>
		<link>https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-preview-part-1/</link>
					<comments>https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-preview-part-1/#respond</comments>
		
		<dc:creator><![CDATA[Amine Haloui]]></dc:creator>
		<pubDate>Tue, 28 Jul 2026 23:46:39 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=45961</guid>

					<description><![CDATA[<p>For years, we have all scheduled the same thing on our SQL Server environments: a nightly or weekly index maintenance job. We check the fragmentation level, we run a REORGANIZE between 5% and 30%, a REBUILD above 30% and we hope the job finishes before the business day starts. Microsoft recently released a new feature [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-preview-part-1/">SQL Server: Automatic index compaction in Azure (preview) – Part 1</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">For years, we have all scheduled the same thing on our SQL Server environments: a nightly or weekly index maintenance job. We check the fragmentation level, we run a REORGANIZE between 5% and 30%, a REBUILD above 30% and we hope the job finishes before the business day starts.</p>



<p class="wp-block-paragraph">Microsoft recently released a new feature in public preview: automatic index compaction. The database engine takes care of compacting the indexes itself, in the background, while the data changes. No job, no maintenance window, no script to maintain.</p>



<p class="wp-block-paragraph">Here is what we will cover in this blog post</p>



<ul class="wp-block-list">
<li>Which problems this feature addresses</li>



<li>The requirements</li>



<li>The difference between page density and index fragmentation (and why it matters)</li>



<li>What the feature does not do</li>
</ul>



<p class="wp-block-paragraph">This is the first part of a series of two blog posts.</p>



<h2 id="h-which-problems-does-it-address" class="wp-block-heading">Which problems does it address?</h2>



<p class="wp-block-paragraph">Automatic index compaction is Microsoft&#8217;s answer to a routine operational task: index maintenance jobs.</p>



<p class="wp-block-paragraph">Here are the problems with these jobs</p>



<ul class="wp-block-list">
<li>They are expensive in CPU and I/O. A rebuild reads and rewrites the entire index</li>



<li>They take time to run, and maintenance windows keep shrinking</li>



<li>They generate a lot of transaction log, which impacts log backups and Always On replication</li>



<li>They can block applications. An offline rebuild locks the table and even an online rebuild needs a short exclusive lock at the beginning and at the end</li>



<li>Someone has to set them up, monitor them and fix them when they fail</li>
</ul>



<p class="wp-block-paragraph">There is also a less obvious problem: for years, these jobs have been optimizing the wrong metric. We will come back to this point in a moment.</p>



<h2 id="h-requirements" class="wp-block-heading">Requirements</h2>



<p class="wp-block-paragraph">The feature is currently in public preview and available on</p>



<ul class="wp-block-list">
<li>Azure SQL Database</li>



<li>Azure SQL Managed Instance, with the Always-up-to-date update policy</li>



<li>SQL database in Microsoft Fabric</li>
</ul>



<p class="wp-block-paragraph">It is not available on SQL Server on-premises, including SQL Server 2025.</p>



<p class="wp-block-paragraph">There is nothing to install. The feature relies on a background process that already runs on these platforms (the ADR cleaner, more on this below), and Accelerated Database Recovery is always enabled on Azure SQL Database, Azure SQL Managed Instance and SQL database in Fabric.</p>



<h2 id="h-internal-and-external-fragmentation" class="wp-block-heading">Internal and external fragmentation</h2>



<p class="wp-block-paragraph">When we talk about index fragmentation, we are actually talking about two different phenomena. They are measured by two different columns of sys.dm_db_index_physical_stats, they have different causes, and above all they have very different costs.</p>



<p class="wp-block-paragraph">Before we start: how is a data file organized ?</p>



<p class="wp-block-paragraph">To understand fragmentation, we need one prerequisite: how SQL Server sees its data files.</p>



<ul class="wp-block-list">
<li>For any program, a file is an array of bytes provided by the operating system. Byte 0, byte 1, byte 2, and so on. Reading means asking for a range: an offset and a length</li>
</ul>



<ul class="wp-block-list">
<li>SQL Server slices this array into pages of 8 KB. The page N is, by definition, the bytes N × 8192 to (N+1) × 8192 − 1. The page ID is not a label, it is an address in the file</li>
</ul>



<ul class="wp-block-list">
<li>Everything below the file (NTFS clusters, SSD, SAN volumes) is translated and hidden by the storage stack.</li>
</ul>



<p class="wp-block-paragraph">Every time we say &#8220;physical order&#8221; in the rest of this post, we mean the order of the pages inside the data file not their placement on the hardware.</p>



<p class="wp-block-paragraph"><strong>What does it look like?</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="960" height="740" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-26.png" alt="" class="wp-image-45980" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-26.png 960w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-26-300x231.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-26-768x592.png 768w" sizes="auto, (max-width: 960px) 100vw, 960px" /></figure>



<h2 id="h-internal-fragmentation-the-pages-are-not-full" class="wp-block-heading">Internal fragmentation: the pages are not full</h2>



<p class="wp-block-paragraph">Internal fragmentation means that the pages of an index contain free space. It is measured by avg_page_space_used_in_percent, also called page density.</p>



<p class="wp-block-paragraph"><strong>Where does it come from?</strong></p>



<ul class="wp-block-list">
<li>Deletes, especially scattered deletes: the rows disappear, the pages stay</li>



<li>Page splits: when a page is full, an insert in the middle of the key range or an update that makes a row grow moves half of the rows to a newly allocated page. Both pages end up around 50% full</li>



<li>Updates that shrink variable length columns</li>



<li>Large rows that do not pack well: a 5000 bytes row means one row per page, and around 38% of every page is lost mechanically</li>
</ul>



<p class="wp-block-paragraph">Note that some free space is normal, and even intentional: the space reserved by the fill factor is internal fragmentation on purpose to absorb future inserts without page splits.</p>



<p class="wp-block-paragraph"><strong>What does it look like?</strong></p>



<pre class="wp-block-code"><code>CREATE DATABASE DemoFrag
GO

ALTER DATABASE DemoFrag SET RECOVERY SIMPLE
GO

USE DemoFrag
GO

CREATE TABLE dbo.SplitDemo (
    Id      int NOT NULL CONSTRAINT PK_SplitDemo PRIMARY KEY CLUSTERED,
    Payload varchar(8000) NOT NULL
);

-- 2 lines about 4000 bytes per page
INSERT INTO dbo.SplitDemo VALUES
(1, REPLICATE('A', 4000)), (2, REPLICATE('B', 4000));</code></pre>



<p class="wp-block-paragraph">My page is almost full:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="865" height="43" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-25.png" alt="" class="wp-image-45976" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-25.png 865w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-25-300x15.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-25-768x38.png 768w" sizes="auto, (max-width: 865px) 100vw, 865px" /></figure>



<p class="wp-block-paragraph"><strong>Why does it cost ?</strong></p>



<p class="wp-block-paragraph">Because the same rows are spread over more pages than necessary and everything in SQL Server is done at the page level:</p>



<ul class="wp-block-list">
<li>The buffer pool caches pages, not rows. A page at 40% density wastes 60% of the memory it occupies</li>



<li>Every read, logical or physical, handles more pages for the same data</li>



<li>Backups are bigger, integrity checks are longer</li>
</ul>



<p class="wp-block-paragraph">This is the key point: internal fragmentation follows the data everywhere, including in RAM. It is a permanent tax on memory, I/O and CPU. However it&#8217;s not the case with external fragmentation.</p>



<h2 id="h-external-fragmentation-the-offsets-do-not-follow-the-logical-order" class="wp-block-heading">External fragmentation: the offsets do not follow the logical order</h2>



<p class="wp-block-paragraph">At the leaf level of a B-tree, the pages are chained together in the order of the index keys with two pointers stored in every page header (m_nextPage, m_prevPage). This chain is the logical order and it cannot be wrong: it is the order of the keys by definition.</p>



<p class="wp-block-paragraph">External fragmentation (also called logical fragmentation) means that following this chain no longer corresponds to reading the file sequentially. The pages are logically ordered, but their offsets in the file are not. It takes two forms:</p>



<ul class="wp-block-list">
<li><strong>Holes</strong>: the pages of the index are not at consecutive offsets. Pages of other objects, or free pages, sit in between</li>



<li><strong>Disorder</strong>: the pages are at consecutive offsets, but chained in a different order</li>
</ul>



<p class="wp-block-paragraph">avg_fragmentation_in_percent counts both forms without distinction. The columns fragment_count and avg_fragment_size_in_pages are closer to the real cost: they measure the length of the contiguous runs.</p>



<p class="wp-block-paragraph"><strong>Where does it come from?</strong></p>



<ul class="wp-block-list">
<li>Several objects growing at the same time: the engine allocates the extents in the order the requests arrive, so the objects interleave in the file. This is the normal life of a database</li>



<li>Page splits: the new page is allocated where free space is found, rarely next to the original page</li>



<li>Page deallocations: massive deletes, and the automatic index compaction itself</li>
</ul>



<p class="wp-block-paragraph"><strong>What does it look like?</strong></p>



<pre class="wp-block-code"><code>USE DemoFrag
GO

CREATE TABLE dbo.SplitDemo (
&nbsp;&nbsp;&nbsp; Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int NOT NULL CONSTRAINT PK_SplitDemo PRIMARY KEY CLUSTERED,
&nbsp;&nbsp;&nbsp; Payload varchar(8000) NOT NULL
);

-- 2 lines about 4000 bytes per page : lines 1 and 2 on 1 page, 3-4 on next page

INSERT INTO dbo.SplitDemo VALUES
(1, REPLICATE('A', 4000)), (2, REPLICATE('B', 4000)),
(3, REPLICATE('C', 4000)), (4, REPLICATE('D', 4000))

-- Lines location (file:page:slot)?
SELECT Id, sys.fn_PhysLocFormatter(%%physloc%%) AS physical_location
FROM dbo.SplitDemo;</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="163" height="122" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-21.png" alt="" class="wp-image-45969" /></figure>



<p class="wp-block-paragraph">My first 2 rows are located on page 376 and the last 2 rows on page 378.</p>



<p class="wp-block-paragraph">What does page 377 contain? I thought the pages were contiguous?</p>



<p class="wp-block-paragraph">Since my table has a clustered index on Id it is stored as a B-tree. Can we see it?</p>



<pre class="wp-block-code"><code>SELECT allocated_page_page_id, page_type_desc, page_level, previous_page_page_id, next_page_page_id
FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('dbo.SplitDemo'),1, NULL, 'DETAILED');</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="540" height="196" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-16.png" alt="" class="wp-image-45966" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-16.png 540w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-16-300x109.png 300w" sizes="auto, (max-width: 540px) 100vw, 540px" /></figure>



<p class="wp-block-paragraph"><strong>What does it look like internally?</strong></p>



<pre class="wp-block-code"><code>SELECT * FROM sys.dm_db_page_info (10, 1, 376, DEFAULT);</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="931" height="44" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-19.png" alt="" class="wp-image-45971" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-19.png 931w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-19-300x14.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-19-768x36.png 768w" sizes="auto, (max-width: 931px) 100vw, 931px" /></figure>



<pre class="wp-block-code"><code>SELECT * FROM sys.dm_db_page_info (10, 1, 378, DEFAULT);</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="45" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-18-1024x45.png" alt="" class="wp-image-45968" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-18-1024x45.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-18-300x13.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-18-768x34.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-18.png 1051w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Page split to generate external fragmentation:</strong></p>



<pre class="wp-block-code"><code>-- Split happens
UPDATE dbo.SplitDemo SET Payload = REPLICATE('B', 4100) WHERE Id = 2;

-- Check page density
SELECT index_level, page_count, avg_page_space_used_in_percent,
avg_fragmentation_in_percent, record_count,
ghost_record_count, version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.SplitDemo'),1, NULL, 'SAMPLED')
WHERE alloc_unit_type_desc = 'IN_ROW_DATA';</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="569" height="46" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-17.png" alt="" class="wp-image-45967" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-17.png 569w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-17-300x24.png 300w" sizes="auto, (max-width: 569px) 100vw, 569px" /></figure>



<p class="wp-block-paragraph">After the page split:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="118" height="104" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-22.png" alt="" class="wp-image-45972" /></figure>



<p class="wp-block-paragraph">Line 1 is located at page 376</p>



<p class="wp-block-paragraph">Line 2 is located at page 379</p>



<p class="wp-block-paragraph">Line 3 is located at page 378</p>



<p class="wp-block-paragraph">Line 4 is located at page 378</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="824" height="360" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-20.png" alt="" class="wp-image-45970" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-20.png 824w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-20-300x131.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/07/image-20-768x336.png 768w" sizes="auto, (max-width: 824px) 100vw, 824px" /></figure>



<p class="wp-block-paragraph"><strong>Why does it cost so little today?</strong></p>



<p class="wp-block-paragraph">There is exactly one mechanism through which external fragmentation ever costed something: the read-ahead. During a scan, the engine prefetches pages with large I/Os and an I/O is a contiguous range of the file: one offset, one length, up to 512 KB. When the index is contiguous one I/O brings back 64 pages. When it is not the same pages arrive in several smaller I/Os.</p>



<p class="wp-block-paragraph">When do these smaller I/Os hurt ? Three conditions must be met at the same time:</p>



<ul class="wp-block-list">
<li>The data is cold: a page already in the buffer pool generates no physical I/O at all</li>



<li>The operation is a large scan: a seek navigates the B-tree by page ID and does not care about the order</li>



<li>Each additional I/O has a price</li>
</ul>



<p class="wp-block-paragraph">On SSD, NVMe and cloud storage, an additional I/O costs a few dozen microseconds and the physical placement below the file is arbitrary anyway (SSD controllers and SANs put the blocks wherever they want).</p>



<p class="wp-block-paragraph">External fragmentation survived its own usefulness for another reason: it was a good symptom. It increases because of page splits, and page splits destroy the page density and inflate the transaction log.</p>



<h2 id="h-reference" class="wp-block-heading">Reference</h2>



<p class="wp-block-paragraph"><a href="https://learn.microsoft.com/en-us/sql/relational-databases/indexes/automatic-index-compaction?view=fabric-sqldb">Automatic Index Compaction &#8211; SQL Server | Microsoft Learn</a></p>



<p class="wp-block-paragraph">Thank you. <a href="https://www.linkedin.com/in/amine-haloui-76968056/" data-type="link" data-id="https://www.linkedin.com/in/amine-haloui-76968056/">Amine Haloui</a></p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-preview-part-1/">SQL Server: Automatic index compaction in Azure (preview) – Part 1</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/sql-server-automatic-index-compaction-preview-part-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure Bootcamp Switzerland 2026 edition</title>
		<link>https://www.dbi-services.com/blog/azure-bootcamp-switzerland-2026-edition/</link>
					<comments>https://www.dbi-services.com/blog/azure-bootcamp-switzerland-2026-edition/#respond</comments>
		
		<dc:creator><![CDATA[Adrien Devaux]]></dc:creator>
		<pubDate>Thu, 21 May 2026 19:41:02 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=44740</guid>

					<description><![CDATA[<p>Today I attended the Azure Bootcamp Switzerland event in Bern. Here is a summary of what I saw and what I learned in the sessions. The opening keynote was about Azure Sovereign Architecture where the presenter gave us an update on the current Azure/Microsoft projects. We also had an explanation on how sovereignty works. Then [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/azure-bootcamp-switzerland-2026-edition/">Azure Bootcamp Switzerland 2026 edition</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Today I attended the Azure Bootcamp Switzerland event in Bern. Here is a summary of what I saw and what I learned in the sessions. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="473" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3184-1024x473.jpg" alt="" class="wp-image-44741" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3184-1024x473.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3184-300x139.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3184-768x355.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3184-1536x710.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3184-2048x946.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">The opening keynote was about Azure Sovereign Architecture where the presenter gave us an update on the current Azure/Microsoft projects. We also had an explanation on how sovereignty works. </p>



<p class="wp-block-paragraph">Then I joined a session titled &#8220;Time Bombs In Entra ID &#8211; How Well Are Your Entra ID Apps Managed?&#8221;. The speaker explained to us how Azure App registration and service principal really work. He also gave us some advice on best practices when using this kind of Azure/Entra resource.</p>



<p class="wp-block-paragraph">Before the lunch break I joined a session on how some architects resolved the &#8220;multiple teams needed to deploy something&#8221; problem. They automated the deployment with CI/CD and Terragrunt. They did a demo on how they use their code and how they make infrastructure changes with it.</p>



<p class="wp-block-paragraph">After the lunch, I chose to go in a more network oriented presentation. The topic was how to get rid of VPN by using an Azure service called Global Secure Access. Even though I&#8217;m not convinced that we can get rid of VPNs, this option could be something for highly Microsoft infrastructure as it uses the Microsoft backbone for all the network routing.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="487" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3185-1024x487.jpg" alt="" class="wp-image-44743" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3185-1024x487.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3185-300x143.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3185-768x365.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3185-1536x730.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3185-2048x973.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"> The last two sessions I attended sessions on Azure Policy. The topics were first using code to deploy Azure policies, as it&#8217;s a better way to have them identical in multiple environments and as it as also faster than using the Azure interface, which is slow. The second one was about using conditional access as safer alternative for securing Azure tenants with policies. This method is quite interesting but requires a paid version of Entra to be activated.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="654" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3186-1024x654.jpeg" alt="" class="wp-image-44744" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3186-1024x654.jpeg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3186-300x191.jpeg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3186-768x490.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3186-1536x980.jpeg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3186.jpeg 1722w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Finally, for the closing keynote, we had a presentation about an application developed by a Swiss company that helps emergency services coordinate. It&#8217;s allowing call centers to locate and contact closest to scene savers and organize their deployment.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="599" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3187-1024x599.jpeg" alt="" class="wp-image-44745" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3187-1024x599.jpeg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3187-300x176.jpeg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3187-768x449.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3187-1536x899.jpeg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/05/3187.jpeg 1818w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Once again, I&#8217;m glad that could attend this event. I learned quite a bunch of things and could also refresh my memory on some other topics. The sessions are long enough to detail a topic and the speakers are always performing well. </p>
<p>L’article <a href="https://www.dbi-services.com/blog/azure-bootcamp-switzerland-2026-edition/">Azure Bootcamp Switzerland 2026 edition</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/azure-bootcamp-switzerland-2026-edition/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend</title>
		<link>https://www.dbi-services.com/blog/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend/</link>
					<comments>https://www.dbi-services.com/blog/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend/#respond</comments>
		
		<dc:creator><![CDATA[Adrien Devaux]]></dc:creator>
		<pubDate>Tue, 03 Feb 2026 09:00:48 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[devops]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=42496</guid>

					<description><![CDATA[<p>Why this blog? While I was working for a customer, I was tasked to create an Azure infrastructure, using Terraform and Azure DevOps (ADO). I thought about doing it like I usually do with GitLab but it wasn&#8217;t possible with ADO as it doesn&#8217;t store the state file itself. Instead I have to use an [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend/">Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-why-this-blog">Why this blog? </h2>



<p class="wp-block-paragraph">While I was working for a customer, I was tasked to create an Azure infrastructure, using Terraform and Azure DevOps (ADO). I thought about doing it like I usually do with GitLab but it wasn&#8217;t possible with ADO as it doesn&#8217;t store the state file itself. Instead I have to use an Azure Storage Account. I configured it, blocked public network, and realized that my pipeline couldn&#8217;t push the state in the Storage Account</p>



<p class="wp-block-paragraph">In fact, ADO isn&#8217;t supported as a &#8220;Trusted Microsoft Service&#8221; and so it can&#8217;t bypass firewall rules using that option in Storage Accounts. For this to work, I had to create a self-hosted agent that run on Azure VM Scale Set and that will be the topic of this blog. </p>



<h2 class="wp-block-heading" id="h-azure-resources-creation">Azure resources creation</h2>



<h3 class="wp-block-heading" id="h-agent-creation">Agent Creation </h3>



<p class="wp-block-paragraph">First thing, we create a Azure VM Scale Set. I kept most parameters to their default values but it can be customized. I chose Linux as operating system as it was what I needed. One important thing is to set the &#8220;Orchestration mode&#8221; to &#8220;Uniform&#8221;, else ADO pipelines won&#8217;t work.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="467" height="221" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-13.png" alt="" class="wp-image-42519" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-13.png 467w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-13-300x142.png 300w" sizes="auto, (max-width: 467px) 100vw, 467px" /></figure>



<h3 class="wp-block-heading" id="h-storage-account">Storage account </h3>



<p class="wp-block-paragraph">For the storage account that will store our state, any storage account should work. Just note that you also need to create a <strong>container </strong>inside of it to fill your terraform provider. Also, for network preferences we will go with &#8220;Public access&#8221; and &#8220;Enable from selected networks&#8221;. This is will allow public access only from restricted networks. I do this to avoid creating a private endpoint to connect to a fully private storage account.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="487" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-15-1024x487.png" alt="" class="wp-image-42521" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-15-1024x487.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-15-300x143.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-15-768x365.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-15.png 1352w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading" id="h-entra-id-identity-for-the-pipeline">Entra ID identity for the pipeline</h3>



<p class="wp-block-paragraph">We also need to create an Entra ID Enterprise Application that we will provide to the pipeline. This identity must have <strong>Contributor</strong> (or any look alike) role over the scope you target. Also, it must have at least <strong>Storage Blob Data Contributor</strong> on the Storage Account to be able to write in it.</p>



<h2 class="wp-block-heading" id="h-azure-devops-setup">Azure DevOps setup</h2>



<h3 class="wp-block-heading" id="h-terraform-code">Terraform code</h3>



<p class="wp-block-paragraph">You can use any Terraform code you want, for my example I only use one which creates a Resource Group and a Virtual Network. Just note that your provider should look like this</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="483" height="322" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-16.png" alt="" class="wp-image-42522" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-16.png 483w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-16-300x200.png 300w" sizes="auto, (max-width: 483px) 100vw, 483px" /></figure>



<h3 class="wp-block-heading" id="h-pipeline-code">Pipeline code</h3>



<p class="wp-block-paragraph">I&#8217;m used to split my pipeline in two files, the plan.yml will be given to the ADO pipeline and it will call the template to run its code. The things done in the pipeline are pretty simple. It installs Terraform on the VM Scale Set instance, then run the Terraform commands. The block of code can be reused for the &#8220;apply&#8221;.</p>



<p class="wp-block-paragraph">Few things to note, in my plan.yml I set a Variable Group &#8220;Terraform_SPN&#8221; that I will show you just after. That&#8217;s where we will find the information about our previously created Entra Id Enterprise Application</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="697" height="441" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-19.png" alt="" class="wp-image-42525" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-19.png 697w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-19-300x190.png 300w" sizes="auto, (max-width: 697px) 100vw, 697px" /></figure>



<p class="wp-block-paragraph">In the template.yml, what is important to note is the pool definition. Here I point just a name, which correspond to ADO Agent Pool that I created. I&#8217;ll also show this step a bit further. </p>



<pre class="wp-block-code"><code></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="711" height="557" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-20.png" alt="" class="wp-image-42526" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-20.png 711w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-20-300x235.png 300w" sizes="auto, (max-width: 711px) 100vw, 711px" /></figure>



<p class="wp-block-paragraph" id="h-">For the pipeline creation itself, we will go to <strong>Pipeline</strong> -&gt; Create a new pipeline -&gt; Azure Repos Git</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1020" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-21-1020x1024.png" alt="" class="wp-image-42527" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-21-1020x1024.png 1020w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-21-300x300.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-21-150x150.png 150w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-21-768x771.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-21.png 1042w" sizes="auto, (max-width: 1020px) 100vw, 1020px" /></figure>



<p class="wp-block-paragraph">Then Existing Azure Pipelines YAML file, and pick our file from our repo.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="509" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-22-1024x509.png" alt="" class="wp-image-42528" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-22-1024x509.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-22-300x149.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-22-768x382.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-22-1536x763.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-22-2048x1018.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">We will also create a <strong>Variable Group</strong>, the name doesn&#8217;t matter, just remember to put the same in your YAML code. Here you create 4 variables which are information coming from your tenant and your enterprise application. That&#8217;s gonna be used during the pipeline run to deploy your resources.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="724" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-25-1024x724.png" alt="" class="wp-image-42531" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-25-1024x724.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-25-300x212.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-25-768x543.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-25.png 1375w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading" id="h-ado-agent-pool">ADO Agent Pool</h3>



<p class="wp-block-paragraph">In the <strong>Project Settings</strong>, look for <strong>Agent Pools</strong>. Then create a new one and fill it as follow:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="505" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-23-1024x505.png" alt="" class="wp-image-42529" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-23-1024x505.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-23-300x148.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-23-768x378.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-23-1536x757.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-23-2048x1009.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">The <strong>Authorize</strong> button will appear after you select the subscription you want, and to accept this your user must have the Owner role, as it adds rights. This will allow ADO to communicate with Azure by creating a Service Principal. Then you can fill the rest as follow:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="475" height="797" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-24.png" alt="" class="wp-image-42530" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-24.png 475w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-24-179x300.png 179w" sizes="auto, (max-width: 475px) 100vw, 475px" /></figure>



<h3 class="wp-block-heading" id="h-ado-pipeline-run">ADO pipeline run</h3>



<p class="wp-block-paragraph">When you first run your pipeline you must authorize it to use the <strong>Variable Group</strong> and the <strong>Agent pool</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="189" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-27-1024x189.png" alt="" class="wp-image-42533" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-27-1024x189.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-27-300x55.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-27-768x141.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-27-1536x283.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-27.png 1917w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="445" height="307" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-26.png" alt="" class="wp-image-42532" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-26.png 445w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-26-300x207.png 300w" sizes="auto, (max-width: 445px) 100vw, 445px" /></figure>



<p class="wp-block-paragraph">One this is done, everything should go smoothly and end like this.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="42" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-28-1024x42.png" alt="" class="wp-image-42534" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-28-1024x42.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-28-300x12.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-28-768x31.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-28-1536x63.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/image-28.png 1592w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">I hope that this blog was useful and could help you troubleshoot that king of problem between Azure and Azure DevOps.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend/">Deploying Azure Terraform code with Azure DevOps and a storage account as remote backend</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/deploying-azure-terraform-code-with-azure-devops-and-a-storage-account-as-remote-backend/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server’s LinkedIn Posts catch-up!</title>
		<link>https://www.dbi-services.com/blog/sql-servers-linkedin-posts-catch-up/</link>
					<comments>https://www.dbi-services.com/blog/sql-servers-linkedin-posts-catch-up/#respond</comments>
		
		<dc:creator><![CDATA[Stéphane Haby]]></dc:creator>
		<pubDate>Thu, 30 Oct 2025 13:38:40 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[Development & Performance]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Technology Survey]]></category>
		<category><![CDATA[Microsoft]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=41386</guid>

					<description><![CDATA[<p>You may not have followed all my posts this summer about what we are doing with Microsoft SQL Server technology and the BI stack like Power BI and Azure Data Fabric. So, I thought I&#8217;d write a little catch-up blog post, to help you to find all LinkedIn Posts! First, a bit of humour with [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-servers-linkedin-posts-catch-up/">SQL Server’s LinkedIn Posts catch-up!</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">You may not have followed all my posts this summer about what we are doing with Microsoft SQL Server technology and the BI stack like Power BI and Azure Data Fabric.</p>



<p class="wp-block-paragraph">So, I thought I&#8217;d write a little catch-up blog post, to help you to find all LinkedIn Posts!</p>



<p class="wp-block-paragraph">First, a bit of humour with this image of SQL Server scrolling through LinkedIn and wondering if anyone still loves it&#8230; Meanwhile, Power BI and Azure Data Fabric are stealing the show. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="602" height="903" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/Picture1.png" alt="" class="wp-image-41388" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/Picture1.png 602w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/Picture1-200x300.png 200w" sizes="auto, (max-width: 602px) 100vw, 602px" /></figure>



<p class="wp-block-paragraph">Let&#8217;s talk about SQL Server, and in particular all tests done on SQL Server 2025:  </p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_sql-server-2025-retirement-of-sql-server-activity-7343210645720317975-_eYk?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk">SSRS Deprecation – It’s time to rethink your reporting architecture</a></strong> explain you how with our Team, we can help you to go forward!</p>



<p class="wp-block-paragraph"><strong>d<a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_sqlserver2025-activity-7367160196273545221-mnBV?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk">bi services’ blog on fire for SQL Server 2025<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></strong> with this Tips to find all our SQL Server blogs : just Google: <strong>site:<a href="http://dbi-services.com/blog">dbi-services.com/blog</a> SQL Server 2025</strong></p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_sqlserver2025-alwayson-activity-7335937244957982720-RnZi?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f575-1f3fb.png" alt="🕵🏻" class="wp-smiley" style="height: 1em; max-height: 1em;" />Exploring SQL Server 2025 blogs</a></strong> with tests on SQL Server 2025 new features</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_microsoft-price-increase-for-on-premises-activity-7370734793887498240-7x9z?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk">Time to review your SQLServer licenses</a></strong> with 10% price increase for SQL Server licences, we can help you to optimize your SQL Server Architecture!</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_dbi-blog-activity-7361055722178023425-RxJO?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk">SQL Server 2025: AI, Performance… and real-world Lessons</a></strong> with a lot of deep tests and new thinking about  Tuning, Performance &amp; AI</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_sql-server-security-updates-activity-7379426832149954560-Jp0P?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Your SQL Server might be exposed right now</a></strong> is a very important topic because Microsoft put in Augaust and Septembre critical patches in High importance</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_sqlserver2025-activity-7343974921234001920-UtLO?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk">SQL Server 2025 – What’s new &amp; What’s next?</a></strong> withgood feedback and ideas from SQLBits 2025  in London</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_sqlserver2025-microsoftfabric-ai-activity-7363084169750478848-WnMp?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk">It&#8217;s time to rethink your data strategy with SQL Server 2025 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></strong>with the end of DQS, MDS and Synapse Link, it’s  the opportunity to see our expertise in Microsoft Fabic </p>



<p class="wp-block-paragraph">And also, publications about how we can help beside SQL Server and share these experiences &amp; expertise:</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_azure-powerbi-datafabric-activity-7375849857544130560-Az-_?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Struggling with rising Azure Data Fabric &amp; Power BI costs?</a></strong> with our experience to help to optimize the cost of your Azure Platform using the BI stack</p>



<p class="wp-block-paragraph"><strong><a href="https://www.linkedin.com/posts/st%C3%A9phane-haby-4481b633_mfiles-sqlserver-activity-7359190630989713409-GFHU?utm_source=social_share_send&amp;utm_medium=member_desktop_web&amp;rcm=ACoAAAb4YfgBKm8-2tQBY5Bec74LclUAp9YYckk"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> When M-Files meets SQL Server</a></strong> with our SQL Server &amp; M-Files expertise, we are on the top to help you to configure, customize, optimize, secure  your M-File infrastructure</p>



<p class="wp-block-paragraph">Continue to follow us in our blogs and linkedIn posts!</p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-servers-linkedin-posts-catch-up/">SQL Server’s LinkedIn Posts catch-up!</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/sql-servers-linkedin-posts-catch-up/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server: Do you know how to use SERVERPROPERTY()  function in a useful way?</title>
		<link>https://www.dbi-services.com/blog/sql-server-do-you-know-how-to-use-serverproperty-function-in-a-useful-way/</link>
					<comments>https://www.dbi-services.com/blog/sql-server-do-you-know-how-to-use-serverproperty-function-in-a-useful-way/#respond</comments>
		
		<dc:creator><![CDATA[Stéphane Haby]]></dc:creator>
		<pubDate>Wed, 22 Oct 2025 09:04:11 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Microsoft]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=41130</guid>

					<description><![CDATA[<p>The SERVERPROPERTY() function is so nice to use to have information about the instance and server very quickly. Sometimes it’s good to come back to basis&#8230; How to begin? Read the documentation of course here but you will see a lot of informations&#8230; After reading the documentation, how to have the first useful information? The [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-do-you-know-how-to-use-serverproperty-function-in-a-useful-way/">SQL Server: Do you know how to use SERVERPROPERTY()  function in a useful way?</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The SERVERPROPERTY() function is so nice to use to have information about the instance and server very quickly. Sometimes it’s good to come back to basis&#8230;</p>



<p class="wp-block-paragraph">How to begin? Read the documentation of course <a href="https://learn.microsoft.com/en-us/sql/t-sql/functions/serverproperty-transact-sql?view=sql-server-ver17">here</a> but you will see a lot of informations&#8230;</p>



<p class="wp-block-paragraph">After reading the documentation, how to have the first useful information?</p>



<p class="wp-block-paragraph">The first information will be about the <strong>SQL Server installed</strong> like the server name, instance name, build and version with also some advanced information like last update date, the KB or CU.</p>



<p class="wp-block-paragraph">Here this first query:</p>



<pre class="wp-block-code"><code>SELECT  
  SERVERPROPERTY('MachineName') AS &#091;Server_Name],
  SERVERPROPERTY('InstanceName') AS &#091;Instance_Name], 
  SERVERPROPERTY('Edition') AS &#091;Edition],
  SERVERPROPERTY('ProductVersion') AS &#091;Product_Version], 
  SERVERPROPERTY('ProductLevel') AS &#091;Product _Level],
  SERVERPROPERTY('ProductBuild') AS &#091;Product _Build],
   SERVERPROPERTY('ProductMajorVersion') AS &#091;Advanced_Product_ Major_Version],
  SERVERPROPERTY('ProductMinorVersion') AS &#091;Advanced_Product_Minor_Version],
   SERVERPROPERTY('ProductUpdateReference ') AS &#091;Advanced_KB_Version],
  SERVERPROPERTY('ProductUpdateLevel') AS &#091;Advanced_Update _Level],
  SERVERPROPERTY(' ResourceLastUpdateDateTime ') AS &#091;Advanced_Last_Update_Date]
</code></pre>



<p class="wp-block-paragraph">Result of a test:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="940" height="263" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-8.png" alt="" class="wp-image-41131" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-8.png 940w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-8-300x84.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-8-768x215.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>



<p class="wp-block-paragraph">I run all queries on my sql server container under Visual Studio Code and sql server 2025 CPT2.1.</p>



<p class="wp-block-paragraph">You can have more info about it here (<a href="https://www.dbi-services.com/blog/sql-server-2025-local-sql-server-container-without-docker-command/">dbi Blog</a>)</p>



<p class="wp-block-paragraph">After, some other useful information will be if the instance has <strong>features installed</strong> like Polybase or Full-Text seach but also some <strong>configuration</strong> like filestream or HA.</p>



<p class="wp-block-paragraph">&nbsp;Here the query:</p>



<pre class="wp-block-code"><code>SELECT 
  SERVERPROPERTY('MachineName') AS &#091;Server_Name],
  SERVERPROPERTY('InstanceName') AS &#091;Instance_Name], 
  SERVERPROPERTY('IsPolyBaseInstalled') AS &#091;Is_Polybase_Installed],  
  SERVERPROPERTY('IsFullTextInstalled') AS &#091;Is_Full-Text_Search_Installed],
  SERVERPROPERTY('IsAdvancedAnalyticsInstalled') AS &#091;Is_Advanced_Analytics_Installed],
  SERVERPROPERTY('FilestreamConfiguredLevel') AS &#091;is_Filestream_enabled],  
  SERVERPROPERTY('IsBigDataCluster') AS &#091;Is_BigData_Cluster_enabled],
  SERVERPROPERTY('IsClustered') AS &#091;Is_Clustered],  
  SERVERPROPERTY('IsHadrEnabled') AS &#091;Is_HADR_enabled],
   SERVERPROPERTY('IsTempDbMetadataMemoryOptimized') AS &#091;Is_TempDB_for_Memory_Optimized_Tables_Enabled],  
  SERVERPROPERTY('IsXTPSupported') AS &#091;Is_IN_Memory_OLTP_Supported],
  SERVERPROPERTY('IsExternalGovernanceEnabled') AS &#091;Is_External_Governance_Enabled];
</code></pre>



<p class="wp-block-paragraph">Result of a test:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="940" height="242" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-9.png" alt="" class="wp-image-41132" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-9.png 940w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-9-300x77.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-9-768x198.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>



<p class="wp-block-paragraph">You can notice that the last property is the External governance. This is linked to the &nbsp;<a href="https://learn.microsoft.com/en-us/azure/purview/how-to-policies-data-owner-arc-sql-server">Microsoft Purview access policies</a>. &nbsp;</p>



<p class="wp-block-paragraph">The next useful information will be about the <strong>security</strong>.</p>



<p class="wp-block-paragraph">Here the query:</p>



<pre class="wp-block-code"><code>SELECT 
  SERVERPROPERTY('MachineName') AS &#091;Server_Name],
  SERVERPROPERTY('InstanceName') AS &#091;Instance_Name], 
  SERVERPROPERTY('IsIntegratedSecurityOnly') AS &#091;Is_Integrated_Security_Only],
  SERVERPROPERTY('IsSingleUser') AS &#091;Is_Single_User],
  SERVERPROPERTY('IsExternalAuthenticationOnly') AS &#091;s_External_Authentication_Only];
</code></pre>



<p class="wp-block-paragraph">Result of a test:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="940" height="354" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-10.png" alt="" class="wp-image-41133" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-10.png 940w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-10-300x113.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-10-768x289.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>



<p class="wp-block-paragraph">The External Authentication concerns the <a href="https://learn.microsoft.com/en-us/azure/azure-sql/database/authentication-azure-ad-only-authentication">Microsoft Entra-only authentication</a>  for Azure SQL Database &amp; Azure SQL Managed Instance. </p>



<p class="wp-block-paragraph">The last information package is the <strong>collation/character set</strong> with this query:</p>



<pre class="wp-block-code"><code>SELECT 
  SERVERPROPERTY('MachineName') AS &#091;Server_Name],
  SERVERPROPERTY('InstanceName') AS &#091;Instance_Name], 
  SERVERPROPERTY('Collation') AS &#091;Collation], 
  SERVERPROPERTY('LCID') AS &#091;Windows_Locale_Identifier], 
  SERVERPROPERTY('SqlCharSetName') AS &#091;SQL_Character_Set_Name], 
  SERVERPROPERTY('SqlSortOrderName') AS &#091;SQL_Sort_Order_Name];
</code></pre>



<p class="wp-block-paragraph">Result of a test:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="602" height="191" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-11.png" alt="" class="wp-image-41134" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-11.png 602w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/10/image-11-300x95.png 300w" sizes="auto, (max-width: 602px) 100vw, 602px" /></figure>



<p class="wp-block-paragraph">To conclude, you have now in this blog <strong>4 useful queries to find information on the server level</strong>.<br>Don’t hesitate to add your comments or give me other useful property that you use.!</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-do-you-know-how-to-use-serverproperty-function-in-a-useful-way/">SQL Server: Do you know how to use SERVERPROPERTY()  function in a useful way?</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/sql-server-do-you-know-how-to-use-serverproperty-function-in-a-useful-way/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL-Server 2025: Generate Data Embeddings for Semantic Search</title>
		<link>https://www.dbi-services.com/blog/sql-server-2025-generate-data-embeddings-for-semantic-search/</link>
					<comments>https://www.dbi-services.com/blog/sql-server-2025-generate-data-embeddings-for-semantic-search/#respond</comments>
		
		<dc:creator><![CDATA[Hocine Mechara]]></dc:creator>
		<pubDate>Tue, 12 Aug 2025 16:36:43 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[data driven]]></category>
		<category><![CDATA[Data platform]]></category>
		<category><![CDATA[embeddings]]></category>
		<category><![CDATA[vectors]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=40060</guid>

					<description><![CDATA[<p>In this Blog we will continue with our AI journey in SQL-Server 2025 preview. If you didn’t read the first Blog you’ll find it here: dbi Blog  In this article, we will explore the concept of data embeddings, a key concept for modern AI-driven applications and platforms. We will then examine the latest capabilities introduced [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-2025-generate-data-embeddings-for-semantic-search/">SQL-Server 2025: Generate Data Embeddings for Semantic Search</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In this Blog we will continue with our AI journey in SQL-Server 2025 preview. If you didn’t read the first Blog you’ll find it here: <a href="https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/">dbi Blog</a> </p>
<p>In this article, we will explore the concept of data embeddings, a key concept for modern AI-driven applications and platforms. We will then examine the latest capabilities introduced in SQL Server 2025 (preview) and Azure SQL, focusing on their new support for vector data types. Finally, we will generate embeddings using an AI model and store them directly in our database, demonstrating how to integrate AI-powered semantic abstraction into your SQL workloads.</p>


<h2 class="wp-block-heading" id="h-but-first-what-exactly-are-data-embeddings">But First: What Exactly Are Data Embeddings?</h2>


<p>Let’s start from the back. From a linguistic perspective, written text consists of syntax and semantics. While syntax refers to the structure of the text and the arrangement of words and letters, semantics refers to the actual meaning conveyed by the text. You can have text with a similar syntax but a different semantic and you can also have text with a similar or the same semantic but different syntax. For example:</p>


<ul class="wp-block-list">
<li>Sentence 1: Our customer satisfaction has increased.</li>



<li>Sentence 2: The contentment of our clients is better than before.</li>
</ul>



<p class="wp-block-paragraph">While both sentences have basically the same meaning, they differ in structure and the way the words and letters are arranged.</p>



<p class="wp-block-paragraph">In IT, we have different simple ways to search for syntax matches, such as exact string matching, wildcard searches or regular expressions (Regex) for more sophisticated syntax matches.</p>



<p class="wp-block-paragraph">But when we are looking for semantic matches, simple programming functions that only evaluate and compare the arrangement of letters are not enough. In such cases, we need a human, or another form of intelligence, that can interpret those arranged letters and understand their meaning.</p>



<p class="wp-block-paragraph">That’s exactly where AI comes into play. The AI model basically reads and understands the written text, then it generates a numerical representation for the semantic of that text which we call “<strong>embedding</strong>”.</p>



<p class="wp-block-paragraph">When I first heard about embeddings, I asked myself: <em>Okay, but what is the data embedded in?</em> </p>



<p class="wp-block-paragraph">The answer is that the data is embedded in a high-dimensional mathematical space, with the vector data representing its coordinates within that space. Since the semantics of embedded data are represented as coordinates in a mathematical space, we can calculate the distance between embeddings and use that to search for data with similar meaning.</p>



<p class="wp-block-paragraph">If you want to learn more about the theory of vectors and embeddings, I can highly recommend the <a href="https://www.dbi-services.com/blog/future-data-driven-2024-introduction-to-vector-databases/">article </a>by my colleague <a href="https://www.dbi-services.com/blog/author/aminehaloui/">Amine Haloui </a>– he explains the basic mathematical concepts in an understandable way, even if you’re not a mathematician.</p>



<h2 class="wp-block-heading" id="h-enough-theory-for-now-let-s-get-practical">Enough Theory for Now – Let’s Get Practical!</h2>



<p class="wp-block-paragraph">Lets take a look how we can generate data embeddings with the latest functions and features of SQL-Server 2025 and Azure SQL directly within our database through T-SQL.</p>



<p class="wp-block-paragraph">For that I’m using the same sample database which we already used in the previous blog post. But in the meantime I created a new column in my “<strong>dbo.products</strong>” table and I inserted in that column the AI generated product description for each product. If you are wondering how I did that – you can read it <a href="https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/">here</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="498" height="650" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/1-1.png" alt="" class="wp-image-40061" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/1-1.png 498w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/1-1-230x300.png 230w" sizes="auto, (max-width: 498px) 100vw, 498px" /></figure>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
select p.product_id, p.product_name, p.Description, p.currency, p.price, c.category_name, b.brand_name, co.color_name, g.gender, s.season from dbo.products p
inner join dbo.category c on p.category_id = c.category_id
inner join dbo.brand b on p.brand_id = b.brand_id
inner join dbo.color co on p.color_id = co.color_id
inner join dbo.gender g on p.gender_id = g.gender_id
inner join dbo.season s on p.season_id = s.season_id

</pre></div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1044" height="583" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/2-1.png" alt="" class="wp-image-40062" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/2-1.png 1044w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/2-1-300x168.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/2-1-1024x572.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/2-1-768x429.png 768w" sizes="auto, (max-width: 1044px) 100vw, 1044px" /></figure>



<h3 class="wp-block-heading" id="h-deploy-an-embedding-model">Deploy an embedding Model:</h3>



<p class="wp-block-paragraph">For generating embeddings for our product data we need first an AI model which is capable to do that. Therefore I go into my Azure OpenAI Resource and I’m searching in the Model catalog in the Azure Foundry Portal for embedding models (I show you exactly who I can go there and deploy resources in the previous <a href="https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/">blog</a>). There are currently three embedding models available from OpenAI. I’m choosing for this blog post the model 3-small and I’m deploying it with a click on “<strong>text-embedding-3-small</strong>” <strong>-&gt;</strong> “<strong>use this model</strong>”<strong>-&gt;</strong>”<strong>Deploy</strong>” :</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1040" height="499" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-1.png" alt="" class="wp-image-40063" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-1.png 1040w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-1-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-1-1024x491.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-1-768x368.png 768w" sizes="auto, (max-width: 1040px) 100vw, 1040px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1039" height="205" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4-1.png" alt="" class="wp-image-40064" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4-1.png 1039w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4-1-300x59.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4-1-1024x202.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4-1-768x152.png 768w" sizes="auto, (max-width: 1039px) 100vw, 1039px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="624" height="602" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5-1.png" alt="" class="wp-image-40065" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5-1.png 624w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5-1-300x289.png 300w" sizes="auto, (max-width: 624px) 100vw, 624px" /></figure>



<p class="wp-block-paragraph">Then I’ll find the model in the Azure AI Foundry Portal under the section “<strong>Deployments</strong>”:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1039" height="437" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-1.png" alt="" class="wp-image-40066" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-1.png 1039w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-1-300x126.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-1-1024x431.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-1-768x323.png 768w" sizes="auto, (max-width: 1039px) 100vw, 1039px" /></figure>



<p class="wp-block-paragraph">When clicking on the model I’m able to see my models API endpoint and the access key:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1039" height="532" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-1.png" alt="" class="wp-image-40067" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-1.png 1039w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-1-300x154.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-1-1024x524.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-1-768x393.png 768w" sizes="auto, (max-width: 1039px) 100vw, 1039px" /></figure>



<h3 class="wp-block-heading" id="h-create-a-database-scoped-credential">Create a Database Scoped Credential:</h3>



<p class="wp-block-paragraph">Okay so far so good, let’s connect to our SQL-Server 2025 Instance where the ShopAI database is running on. To register the external model in our database and access it through the appropriate T-SQL functions, I first create a database-scoped credential. You can create the credential with a managed identity or with an API Key. I’m using the API Key which I copied from the Azure AI Foundry Portal. Note that the credential name must point to a path which is more generic than the request URL:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
-- Create database scoped credential:
CREATE DATABASE SCOPED CREDENTIAL &#x5B;https://shopai-blog.openai.azure.com/]
	WITH IDENTITY = &#039;HTTPEndpointHeaders&#039;, secret = &#039;{&quot;api-key&quot;:&quot;YOUR-API-KEY&quot;}&#039;;
GO
</pre></div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1039" height="96" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-1.png" alt="" class="wp-image-40068" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-1.png 1039w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-1-300x28.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-1-1024x95.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-1-768x71.png 768w" sizes="auto, (max-width: 1039px) 100vw, 1039px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1039" height="212" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-1.png" alt="" class="wp-image-40069" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-1.png 1039w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-1-300x61.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-1-1024x209.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-1-768x157.png 768w" sizes="auto, (max-width: 1039px) 100vw, 1039px" /></figure>



<h3 class="wp-block-heading" id="h-register-the-external-ai-model">Register the External AI Model:</h3>



<p class="wp-block-paragraph">As far as the database scoped credential is created we can register the external model with the “<strong>Create External Model</strong>” command, which is currently available in SQL-Server 2025 Preview, in our database. You can find more information’s about this brand new command under the following link from Microsoft: <a href="https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-model-transact-sql?view=sql-server-ver17">https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-model-transact-sql?view=sql-server-ver17</a></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
-- Create EXTERNAL MODEL
CREATE EXTERNAL MODEL OpenAITextEmbedding3Small
AUTHORIZATION dbo
WITH (
      LOCATION = &#039;YOUR-ENDPOINT_URL&#039;,
      API_FORMAT = &#039;Azure OpenAI&#039;,
      MODEL_TYPE = EMBEDDINGS,
      MODEL = &#039;text-embedding-3-small&#039;,
      CREDENTIAL = &#x5B;YOUR-CREDENTIAL],
      PARAMETERS = &#039;{&quot;Dimensions&quot;:1536}&#039;
);
</pre></div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1038" height="218" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10-1.png" alt="" class="wp-image-40070" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10-1.png 1038w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10-1-300x63.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10-1-1024x215.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10-1-768x161.png 768w" sizes="auto, (max-width: 1038px) 100vw, 1038px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1036" height="224" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-1.png" alt="" class="wp-image-40071" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-1.png 1036w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-1-300x65.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-1-1024x221.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-1-768x166.png 768w" sizes="auto, (max-width: 1036px) 100vw, 1036px" /></figure>



<h3 class="wp-block-heading" id="h-test-the-embedding-function">Test the Embedding Function</h3>


<p>As far as we created the external model successfully we can generate the embeddings with the “<strong>AI_Generate_Embeddings</strong>” function. This function is currently available in SQL-Server 2025 Preview.</p>
<p>The function requires the text to be embedded and the name of a pre-created external model as arguments, with optional model-specific parameters that can be appended in JSON format. You can get more information’s about this brand new function under the following link from Microsoft: <a href="https://learn.microsoft.com/en-us/sql/t-sql/functions/ai-generate-embeddings-transact-sql?view=sql-server-ver17">https://learn.microsoft.com/en-us/sql/t-sql/functions/ai-generate-embeddings-transact-sql?view=sql-server-ver17</a></p>


<p class="wp-block-paragraph">Let’s test the registered model and the embedding function with the command below. As you can see, the result is a JSON array containing multiple numerical values:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1037" height="154" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-1.png" alt="" class="wp-image-40072" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-1.png 1037w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-1-300x45.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-1-1024x152.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-1-768x114.png 768w" sizes="auto, (max-width: 1037px) 100vw, 1037px" /></figure>



<h3 class="wp-block-heading" id="h-generate-and-store-product-embeddings">Generate and Store Product Embeddings:</h3>



<p class="wp-block-paragraph">Having deployed the embedding model in Azure, registered it in our database, and successfully tested the embedding function, our next step is to generate embeddings for our products.</p>



<p class="wp-block-paragraph">Therefore I add an additional column called “<strong>embedding</strong>” to our “<strong>dbo.products</strong>” table. For the column I’m using the vector data type which is currently available in Azure SQL and in SQL-Server 2025 preview. Note the number in the brackets of the datatype definition is representing the amount of dimensions which are used for the embedding. Who many dimensions you need is depending on the model you are using. The “<strong>text-embedding3-small</strong>” model from OpenAI is using 1536 dimensions per default:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
ALTER TABLE dbo.products
ADD embedding vector(1536);
</pre></div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="372" height="115" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/13-1.png" alt="" class="wp-image-40073" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/13-1.png 372w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/13-1-300x93.png 300w" sizes="auto, (max-width: 372px) 100vw, 372px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1037" height="357" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-1.png" alt="" class="wp-image-40074" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-1.png 1037w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-1-300x103.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-1-1024x353.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-1-768x264.png 768w" sizes="auto, (max-width: 1037px) 100vw, 1037px" /></figure>



<p class="wp-block-paragraph">I now want to generate embeddings for all products in my ShopAI database and store them in the newly created column, taking the following product attributes into account when generating the embeddings:</p>



<ul class="wp-block-list">
<li>Product Name</li>



<li>Product Description</li>



<li>Product Price</li>



<li>Product Season</li>



<li>Product Gender</li>
</ul>



<p class="wp-block-paragraph">To accomplish this, I use the code below to generate the embeddings:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
UPDATE p
SET p.embedding = AI_GENERATE_EMBEDDINGS(
    CONCAT(
        N&#039;Product Name: &#039;,            COALESCE(p.product_name, N&#039;Unknown&#039;),
        N&#039; | Product Description: &#039;,  COALESCE(p.&#x5B;description], N&#039;Unknown&#039;),
        N&#039; | Product Price (CHF): &#039;,  COALESCE(CONVERT(NVARCHAR(32), p.price), N&#039;Unknown&#039;),
        N&#039; | Product Season: &#039;,
        CASE p.season_id
            WHEN 1 THEN N&#039;Spring&#039;
            WHEN 2 THEN N&#039;Summer&#039;
            WHEN 3 THEN N&#039;Autumn&#039;
            WHEN 4 THEN N&#039;Winter&#039;
            WHEN 5 THEN N&#039;All Seasons&#039;
            ELSE N&#039;Unknown&#039;
        END,
        N&#039; | Product Gender: &#039;,
        CASE p.gender_id
            WHEN 1 THEN N&#039;Male&#039;
            WHEN 2 THEN N&#039;Female&#039;
            WHEN 3 THEN N&#039;Unisex&#039;
            ELSE N&#039;Unknown&#039;
        END
    ) USE MODEL OpenAITextEmbedding3Small
)
FROM dbo.products AS p
WHERE p.embedding IS NULL;

</pre></div>


<p class="wp-block-paragraph">The query ran for over four minutes and successfully generated embeddings for all products:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1035" height="752" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-1.png" alt="" class="wp-image-40075" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-1.png 1035w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-1-300x218.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-1-1024x744.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-1-768x558.png 768w" sizes="auto, (max-width: 1035px) 100vw, 1035px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="975" height="228" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-1.png" alt="" class="wp-image-40076" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-1.png 975w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-1-300x70.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-1-768x180.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1035" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-1.png" alt="" class="wp-image-40077" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-1.png 1035w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-1-300x143.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-1-1024x489.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-1-768x367.png 768w" sizes="auto, (max-width: 1035px) 100vw, 1035px" /></figure>



<h3 class="wp-block-heading" id="h-test-semantic-similarity-functions">Test Semantic Similarity Functions:</h3>



<p class="wp-block-paragraph">So far so good, we were able to deploy an embedding model in Azure, we successfully created a credential for the access to the model, we registered the embedding model with the latest T-SQL command and we were able to generate embeddings for our products.</p>



<p class="wp-block-paragraph">Let’s see how we can use now the embedding model and the embedded data for semantic search capabilities.</p>



<p class="wp-block-paragraph">Therefore I’m using the “<strong>Vector_Distance</strong>” function which is available in SQL-Server 2025 preview and in Azure SQL. The function requires 3 arguments: The first is the metric you want to use for calculating the distance between two embeddings, and the other two are the vectors you want to compare.You can get more information’s about this brand new function under the following link from Microsoft: <a href="https://learn.microsoft.com/en-us/sql/t-sql/functions/vector-distance-transact-sql?view=sql-server-ver17">https://learn.microsoft.com/en-us/sql/t-sql/functions/vector-distance-transact-sql?view=sql-server-ver17</a></p>



<p class="wp-block-paragraph">Okay, let’s see how we can use this function &#8211; It’s summer and I would like to go on summer vacation (again). Therefore I’m looking for some pants which I can wear during my summer holidays. I don’t like anything flashy, so I’d like the pants in black.</p>



<p class="wp-block-paragraph">Let’s test with the code below if we can find a matching product for me:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
DECLARE @SemanticSearchText Nvarchar(max) = &#039;Im looking for black pants for men which I can wear during my summer vacation.&#039;

	
	DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(@SemanticSearchText USE MODEL OpenAITextEmbedding3Small);

	SELECT TOP(10) 
	  product_name, 
	  Description,
	  price,
	  s.season,
	  g.gender,
	  VECTOR_DISTANCE(&#039;cosine&#039;, @qv, embedding) AS distance 
	FROM dbo.products p
	  inner join dbo.season s on p.season_id = s.season_id
	  inner join dbo.gender g on p.gender_id = g.gender_id
ORDER BY   distance;
</pre></div>


<p class="wp-block-paragraph">As you can see, the results are quite accurate. All of the products are pants, except for the one with the highest distance, which is a full swimsuit. Every product is black in color, and most are categorized for the summer season, except for two that are suited for all seasons:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="894" height="562" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-2.png" alt="" class="wp-image-40078" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-2.png 894w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-2-300x189.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-2-768x483.png 768w" sizes="auto, (max-width: 894px) 100vw, 894px" /></figure>



<p class="wp-block-paragraph">As you can see by combining SQL Server 2025’s new vector capabilities with external embedding models, we can seamlessly integrate semantic understanding directly into our data workflows. This enables intelligent, context-aware queries that go far beyond simple keyword matching.</p>



<p class="wp-block-paragraph">You can find all the code again on <a href="https://github.com/HocineMechara/SQL2025-AI-Product-Embeddings-Blog-/tree/main">GitHub </a>and test it by your own. Feel free to share your thoughts with me in the comment section and stay tuned for upcoming posts from my colleagues and me. 😉</p>



<p class="wp-block-paragraph">Thanks for reading,<br>Hocine</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/sql-server-2025-generate-data-embeddings-for-semantic-search/">SQL-Server 2025: Generate Data Embeddings for Semantic Search</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/sql-server-2025-generate-data-embeddings-for-semantic-search/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server 2025: Where Data Meets Intelligence</title>
		<link>https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/</link>
					<comments>https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/#comments</comments>
		
		<dc:creator><![CDATA[Hocine Mechara]]></dc:creator>
		<pubDate>Tue, 05 Aug 2025 15:23:04 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Development & Performance]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[data]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39981</guid>

					<description><![CDATA[<p>The evolution of AI is booming and brings many new possibilities to enhance efficiency and convenience with many different use cases. While AI chatbots have had an almost revolutionary influence in recent years, we are now entering the next phase of this evolution with context-aware AI assistants and autonomous AI agents that will have even [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/">SQL Server 2025: Where Data Meets Intelligence</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The evolution of AI is booming and brings many new possibilities to enhance efficiency and convenience with many different use cases. While AI chatbots have had an almost revolutionary influence in recent years, we are now entering the next phase of this evolution with context-aware AI assistants and autonomous AI agents that will have even more impact.</p>



<p class="wp-block-paragraph">Providers of modern and future-oriented platforms and applications seem to be aware of this development and are integrating AI in a targeted manner to increase efficiency and improve the user experience.</p>



<p class="wp-block-paragraph">With SQL Server 2025 being the most developer-oriented release in over a decade, Microsoft is clearly targeting the AI evolution making it easier than ever to integrate AI with your data.</p>



<p class="wp-block-paragraph">In this article I will introduce you in two of the latest AI oriented features which are now available in SQL-Server 2025 preview and I will show you an example how you can interact with an external AI-model programmatically.</p>



<h1 class="wp-block-heading" id="h-sp-invoke-external-rest-endpoint">sp_invoke_external_rest_endpoint:</h1>



<p class="wp-block-paragraph">While the stored procedure sp_invoke_external_rest_endpoint was already available in Azure SQL Database and Managed Instance it’s now also available in &nbsp;SQL-Server 2025 Preview and allows you to communicate with external REST services from On-Premise.</p>



<p class="wp-block-paragraph">This is significant in terms of AI because AI-models which are hosted on Cloud Platforms or on Premise (for example with Ollama) are usually REST compatible. This stored procedure allows you so to interact with an external AI model directly and programmatically through T-SQL.</p>



<p class="wp-block-paragraph">You can find more information about the stored procedure and the specific parameters on the following Link from Microsoft: <a href="https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-invoke-external-rest-endpoint-transact-sql?view=sql-server-ver17&amp;tabs=request-headers">https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-invoke-external-rest-endpoint-transact-sql?view=sql-server-ver17&amp;tabs=request-headers</a></p>



<h1 class="wp-block-heading" id="h-json-datatype">JSON Datatype:</h1>



<p class="wp-block-paragraph">In the previous version of SQL-Server JSON Data was stored in the varchar and nvarchar datatypes. With SQL-Server 2025 you can now store JSON data in a JSON datatype. The JSON datatype which is also available in Azure SQL Database and Azure SQL Managed Instance brings multiple advantages over working with JSON Data in nvarchar and varchar datatypes.</p>



<p class="wp-block-paragraph">As the new JSON Datatype is compatible with all JSON functions no code change is necessary while benefiting from the following advantages:</p>



<ul class="wp-block-list">
<li>reads are faster because with the JSON datatype your JSON data is already parsed</li>



<li>you can update also individual values without accessing the whole JSON data</li>



<li>the JSON datatype is optimized for compression which makes the storage more efficient</li>
</ul>



<p class="wp-block-paragraph">In terms of AI this is significant because external AI-models are usually transferring data in the JSON format. With the new JSON datatype you can handle this data efficiently.</p>



<p class="wp-block-paragraph">To get more detailed information’s about handling JSON data with T-SQL and about the new JSON datatype, you can access the following Link from Microsoft: <a href="https://learn.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver17">https://learn.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver17</a></p>



<h1 class="wp-block-heading" id="h-hands-on-generating-product-descriptions-using-ai">Hands On &#8211; Generating Product Descriptions using AI:</h1>



<p class="wp-block-paragraph">Enough theory for now! let’s get practical. For demonstration purposes, I’ve prepared a sample shop database for a clothing reseller running on SQL-Server 2025.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="757" height="495" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/1.png" alt="" class="wp-image-40024" style="width:446px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/1.png 757w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/1-300x196.png 300w" sizes="auto, (max-width: 757px) 100vw, 757px" /></figure>



<p class="wp-block-paragraph">The database has some few tables which are containing product information’s:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="479" height="456" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-1.png" alt="" class="wp-image-40053" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-1.png 479w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/18-1-300x286.png 300w" sizes="auto, (max-width: 479px) 100vw, 479px" /></figure>



<p class="wp-block-paragraph">With the following query you can see that we have 3000 products with different categories from different brands etc.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
select p.product_id, p.product_name, p.currency, p.price, c.category_name, b.brand_name, co.color_name, g.gender, s.season 
from dbo.products p 
inner join dbo.category c on p.category_id = c.category_id 
inner join dbo.brand b on p.brand_id = b.brand_id 
inner join dbo.color co on p.color_id = co.color_id 
inner join dbo.gender g on p.gender_id = g.gender_id
inner join dbo.season s on p.season_id = s.season_id
</pre></div>


<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="827" height="633" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3.png" alt="" class="wp-image-40028" style="width:552px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3.png 827w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-300x230.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/3-768x588.png 768w" sizes="auto, (max-width: 827px) 100vw, 827px" /></figure>



<p class="wp-block-paragraph">What we don’t have is a product description for attracting potential buyers. This is something we will do now using AI. Therefore I need an AI model which I can integrate with my product data. I deploy this model in Azure.</p>



<h2 class="wp-block-heading" id="h-deploy-an-ai-model-in-azure">Deploy an AI Model in Azure:</h2>



<p class="wp-block-paragraph">In the Azure Portal I’m looking therefore for Azure AI Foundry.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="457" height="517" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4.png" alt="" class="wp-image-40031" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4.png 457w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/4-265x300.png 265w" sizes="auto, (max-width: 457px) 100vw, 457px" /></figure>



<p class="wp-block-paragraph">Then under AI Foundry I create a new resource of Azure OpenAI:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="917" height="343" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5.png" alt="" class="wp-image-40032" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5.png 917w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5-300x112.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/5-768x287.png 768w" sizes="auto, (max-width: 917px) 100vw, 917px" /></figure>



<p class="wp-block-paragraph">The deployment is pretty much straight forward and after the deployment is finished I access my newly created resource:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="920" height="337" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6.png" alt="" class="wp-image-40033" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6.png 920w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-300x110.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/6-768x281.png 768w" sizes="auto, (max-width: 920px) 100vw, 920px" /></figure>



<p class="wp-block-paragraph">In my new Azure OpenAI resource I’m accessing now the Azure AI Foundry portal for deploying a new AI-model:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1148" height="352" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7.png" alt="" class="wp-image-40034" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7.png 1148w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-300x92.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-1024x314.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/7-768x235.png 768w" sizes="auto, (max-width: 1148px) 100vw, 1148px" /></figure>



<p class="wp-block-paragraph">In the AI Foundry Portal I’m looking under the Model catalog for chat completion models and I select the gpt-4o model which is the “allrounder” AI-model for chat completion tasks from OpenAI(It’s in fact currently the model you are using with ChatGPT by default if you don’t choose anything else specifically):</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1271" height="332" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8.png" alt="" class="wp-image-40035" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8.png 1271w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-300x78.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-1024x267.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/8-768x201.png 768w" sizes="auto, (max-width: 1271px) 100vw, 1271px" /></figure>



<p class="wp-block-paragraph">After clicking on the gpt-4o model, I clik on “Use this model” and finally on “deploy” for deploying the model:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1146" height="356" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9.png" alt="" class="wp-image-40036" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9.png 1146w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-300x93.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-1024x318.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/9-768x239.png 768w" sizes="auto, (max-width: 1146px) 100vw, 1146px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="721" height="702" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10.png" alt="" class="wp-image-40037" style="width:402px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10.png 721w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/10-300x292.png 300w" sizes="auto, (max-width: 721px) 100vw, 721px" /></figure>



<p class="wp-block-paragraph">As far as I deployed the model successfully I’m able to find it in the Azure AI Foundry Portal under “Deployments”:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1070" height="371" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11.png" alt="" class="wp-image-40038" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11.png 1070w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-300x104.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-1024x355.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/11-768x266.png 768w" sizes="auto, (max-width: 1070px) 100vw, 1070px" /></figure>



<p class="wp-block-paragraph">After clicking on the newly deployed model I can also find my https URL and API key for accessing the model:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1068" height="557" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12.png" alt="" class="wp-image-40039" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12.png 1068w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-300x156.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-1024x534.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/12-768x401.png 768w" sizes="auto, (max-width: 1068px) 100vw, 1068px" /></figure>



<h2 class="wp-block-heading" id="h-interacting-with-the-ai-model-using-t-sql">Interacting with the AI Model using T-SQL:</h2>



<p class="wp-block-paragraph">As the model is now successfully deployed we are ready to interact with it using T-SQL. Therefore I wrote a small stored procedure around the stored procedure sp_invoke_external_rest_endpoint which is doing the following stuff:</p>



<p class="wp-block-paragraph">It takes the Product ID, API Key, API Endpoint URL and the desired description language as input parameters:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="733" height="317" src="http://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/13.png" alt="" class="wp-image-40042" style="width:559px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/13.png 733w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/13-300x130.png 300w" sizes="auto, (max-width: 733px) 100vw, 733px" /></figure>



<p class="wp-block-paragraph">It selects necessary product data for the provided Product ID from the database and stores it as a single string:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1177" height="260" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14.png" alt="" class="wp-image-40043" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14.png 1177w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-300x66.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-1024x226.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/14-768x170.png 768w" sizes="auto, (max-width: 1177px) 100vw, 1177px" /></figure>



<p class="wp-block-paragraph">It generates a prompt for the chat completion API and dynamically interpolates the selected product data into that prompt:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1758" height="461" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/AI_prompt.png" alt="" class="wp-image-40015" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/AI_prompt.png 1758w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/AI_prompt-300x79.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/AI_prompt-1024x269.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/AI_prompt-768x201.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/AI_prompt-1536x403.png 1536w" sizes="auto, (max-width: 1758px) 100vw, 1758px" /></figure>



<p class="wp-block-paragraph">Finally it invokes the external AI model using the stored procedure sp_invoke_external_rest_endpoint with the generated prompt:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1075" height="431" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15.png" alt="" class="wp-image-40044" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15.png 1075w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-300x120.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-1024x411.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/15-768x308.png 768w" sizes="auto, (max-width: 1075px) 100vw, 1075px" /></figure>



<p class="wp-block-paragraph">With the code below I’m then executing the stored procedure above for a specific product in my database and I’m extracting the product description from the AI models JSON response:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1072" height="561" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16.png" alt="" class="wp-image-40045" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16.png 1072w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-300x157.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-1024x536.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/16-768x402.png 768w" sizes="auto, (max-width: 1072px) 100vw, 1072px" /></figure>



<p class="wp-block-paragraph">As a random example I have this swim shorts in the color magenta in my Shop database with the product ID 2354:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1072" height="310" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17.png" alt="" class="wp-image-40046" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17.png 1072w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-300x87.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-1024x296.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/17-768x222.png 768w" sizes="auto, (max-width: 1072px) 100vw, 1072px" /></figure>



<p class="wp-block-paragraph">I’m now able to generate a product description using the gpt-4o model hosted in Azure for this specific product:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1297" height="437" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_english.png" alt="" class="wp-image-40018" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_english.png 1297w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_english-300x101.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_english-1024x345.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_english-768x259.png 768w" sizes="auto, (max-width: 1297px) 100vw, 1297px" /></figure>



<p class="wp-block-paragraph">You can see here the full product description which was returned by the gpt-4o model:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Make a bold splash this summer with these vibrant magenta swim shorts from River Island. Designed for the modern man, they combine style and comfort, ensuring you stand out at the beach or poolside. Don&#8217;t just swim—make a statement. Grab yours now and own the summer vibe!</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">The description is pretty good isn&#8217;t it? If magenta suited me, I would definitely buy one <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">The GPT-4o model is also quite a language expert. For example, you can even generate your product descriptions in Chinese.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1298" height="576" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_chinese.png" alt="" class="wp-image-40020" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_chinese.png 1298w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_chinese-300x133.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_chinese-1024x454.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/Image_AI_response_chinese-768x341.png 768w" sizes="auto, (max-width: 1298px) 100vw, 1298px" /></figure>



<p class="wp-block-paragraph">In case that I have Chinese speaking blog readers or if someone wants to translate it, here is again the full description:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>亮眼的紫红色泳裤，让您在夏日海滩上成为焦点！River Island精心设计，兼具时尚与舒适，完美贴合男性身形。无论是游泳还是晒日光浴，这款泳裤都是您的理想选择。立即下单，开启您的夏日魅力之旅！</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">If you want to test it by your own you can find the whole code and a backup of the ShopAI database on GitHub: <a href="https://github.com/HocineMechara/SQL2025-AI-Product-Description-Blog">https://github.com/HocineMechara/SQL2025-AI-Product-Description-Blog</a></p>



<p class="wp-block-paragraph">Of course, this is just a simple example. You can do much more. For instance, you could provide additional context to the chat completion model, such as the user&#8217;s recent orders or behavioral data, to generate personalized product descriptions tailored to individual customers.</p>



<p class="wp-block-paragraph">Feel free to share your thoughts in the comments, and stay tuned for upcoming posts from my colleagues and me. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Thanks for reading,<br>Hocine</p>
<p>L’article <a href="https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/">SQL Server 2025: Where Data Meets Intelligence</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/lift-your-application-in-the-age-of-ai-with-sql-server-2025/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Exploring the Future of Data at SQLBits 2025 in London</title>
		<link>https://www.dbi-services.com/blog/exploring-the-future-of-data-at-sqlbits-2025-in-london/</link>
					<comments>https://www.dbi-services.com/blog/exploring-the-future-of-data-at-sqlbits-2025-in-london/#respond</comments>
		
		<dc:creator><![CDATA[Hocine Mechara]]></dc:creator>
		<pubDate>Sat, 21 Jun 2025 12:02:05 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Big Data]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39218</guid>

					<description><![CDATA[<p>I’m looking back on three amazing days of interesting technical insights from the SQLBits event 2025 in London. It’s actually my first time having the pleasure of attending one of Europe’s biggest data platform events and I can sincerely say, that I enjoyed every minute of interesting workshops and sessions all around Data management, Data [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/exploring-the-future-of-data-at-sqlbits-2025-in-london/">Exploring the Future of Data at SQLBits 2025 in London</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I’m looking back on three amazing days of interesting technical insights from the SQLBits event 2025 in London. It’s actually my first time having the pleasure of attending one of Europe’s biggest data platform events and I can sincerely say, that I enjoyed every minute of interesting workshops and sessions all around Data management, Data engineering and analytics with the latest technologies from Microsoft.</p>



<p class="wp-block-paragraph">The sessions and workshops on the event mainly focused on the evolution of AI and a lot about Business Intelligence and Data Engineering with a big focus on Microsoft Fabric the unifying data platform from Microsoft. The choice of topics reflects the direction in which I believe the industry is heading, and I took the opportunity to gain valuable insights from renowned experts.</p>



<p class="wp-block-paragraph">On the first day, I attended a one-day workshop on the latest AI functionalities in SQL Server and Azure SQL, focusing on how these features support the integration of external AI models with your data, enabling the development of context- and data-aware AI assistants for your application&#8217;s users based on the RAG (Retrieval-Augmented Generation) pattern. It was very interesting, the workshop was delivered in a high quality and it was even my personal highlight of the event.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" data-id="39223" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-19-at-18.56.17-768x1024.jpeg" alt="" class="wp-image-39223" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-19-at-18.56.17-768x1024.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-19-at-18.56.17-225x300.jpeg 225w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-19-at-18.56.17-1152x1536.jpeg 1152w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-19-at-18.56.17.jpeg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" data-id="39224" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.27.16-768x1024.jpeg" alt="" class="wp-image-39224" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.27.16-768x1024.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.27.16-225x300.jpeg 225w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.27.16-1152x1536.jpeg 1152w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.27.16.jpeg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</figure>



<p class="wp-block-paragraph">On the second day I joined again a one-day workshop about Microsoft Fabric. I was very curious about Microsoft Fabric because I heard a lot of advantages about this end to end SaaS Data Platform and I was happy to learn more about it. The workshop covered a lot of topics regarding Microsoft Fabric and at the end of the day I had a good feeling of understanding the concept and the core elements about Microsoft Fabric.</p>



<p class="wp-block-paragraph">During the break I enjoyed a fancy coffee served at the Microsoft booth <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" data-id="39226" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.16-1-768x1024.jpeg" alt="" class="wp-image-39226" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.16-1-768x1024.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.16-1-225x300.jpeg 225w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.16-1-1152x1536.jpeg 1152w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.16-1.jpeg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" data-id="39227" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.161-768x1024.jpeg" alt="" class="wp-image-39227" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.161-768x1024.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.161-225x300.jpeg 225w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.161-1152x1536.jpeg 1152w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.32.161.jpeg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</figure>



<p class="wp-block-paragraph">On the last day I attended again a one-day workshop about Microsoft Fabric but with more focus on the administration of a Fabric Tenant including workspace management, security, Git Integration etc. The workshop was again delivered in a good quality and I really enjoyed to attend. The Kahoot Quiz at the end of the workshop confirmed my Impression that I’m on track of understanding this platform quite well.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1536" height="1152" data-id="39229" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.39.44-edited.jpeg" alt="" class="wp-image-39229" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.39.44-edited.jpeg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.39.44-edited-300x225.jpeg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.39.44-edited-1024x768.jpeg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/WhatsApp-Image-2025-06-21-at-13.39.44-edited-768x576.jpeg 768w" sizes="auto, (max-width: 1536px) 100vw, 1536px" /></figure>
</figure>



<p class="wp-block-paragraph">The event was awesome, I learned a lot about the latest technologies and I hope that I will be able to apply the gained knowledge in upcoming projects. I can highly recommend this event to every data professional working with Microsoft technologies!</p>
<p>L’article <a href="https://www.dbi-services.com/blog/exploring-the-future-of-data-at-sqlbits-2025-in-london/">Exploring the Future of Data at SQLBits 2025 in London</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/exploring-the-future-of-data-at-sqlbits-2025-in-london/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: www.dbi-services.com @ 2026-11-05 05:06:58 by W3 Total Cache
-->