<?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>Brent Ozar Unlimited®</title>
	<atom:link href="https://www.brentozar.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.brentozar.com/</link>
	<description>SQL Server training, tools, and free downloads.</description>
	<lastBuildDate>Tue, 05 May 2026 14:50:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.brentozar.com/wp-content/uploads/2015/08/cropped-Brent_Ozar_Unlimited-32x32.jpg</url>
	<title>Brent Ozar Unlimited®</title>
	<link>https://www.brentozar.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">111456981</site>	<item>
		<title>&#8220;We want to archive, but we still want to query the data.&#8221;</title>
		<link>https://www.brentozar.com/archive/2026/05/we-want-to-archive-but-we-still-want-to-query-the-data/</link>
					<comments>https://www.brentozar.com/archive/2026/05/we-want-to-archive-but-we-still-want-to-query-the-data/#comments</comments>
		
		<dc:creator><![CDATA[Brent Ozar]]></dc:creator>
		<pubDate>Thu, 07 May 2026 13:15:40 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">https://www.brentozar.com/?p=357850</guid>

					<description><![CDATA[At least once a month, I get this question from a client: We have big data, and we want to save money. We want to move the older data down to some kind of archives that will cost us less. I ask exactly one followup question: Are you willing to modify the app that queries...]]></description>
										<content:encoded><![CDATA[<p>At least once a month, I get this question from a client:</p>
<blockquote><p>We have big data, and we want to save money. We want to move the older data down to some kind of archives that will cost us less.</p></blockquote>
<p>I ask exactly one followup question:</p>
<blockquote><p>Are you willing to modify the app that queries the data, or do you want the users to still be able to query the old data in their existing screens and reports?</p></blockquote>
<p>If you&#8217;re willing to modify the app &#8211; like having an &#8220;archive reports&#8221; section for when users wanna query the older data, and use a different connection string pointing to an archival server, then great! It&#8217;s easy. Just put together a cheap 4-core SQL Server Standard Edition VM with crappy storage, and archive the data over to that. I have all kinds of tips to make that easier and cheaper.</p>
<h3>But you don&#8217;t wanna modify the app.</h3>
<p>You want to still be able to use the same screens and same reports. When you wanna run an all-history trending report, or find Acme&#8217;s order from 2002, you wanna use the exact same app and same reports.</p>
<p>You just want old data to magically be cheaper.</p>
<p><strong>Table partitioning doesn&#8217;t do that.</strong> In theory, table partitioning lets you put new data on expensive/fast storage, and old data on cheap/slow storage. In practice:</p>
<ul>
<li>None of your storage connected to production servers is really that cheap.</li>
<li>The data&#8217;s still inside the same database, so maintenance jobs like backups, high availability, corruption checking, and statistics updates are still time-intensive, and development servers are still huge.</li>
<li>As data ages, and you wanna move it to cheap/slow storage, that&#8217;s a row-by-row logged &amp; locked operation. The bigger your data is, the uglier of a process this is.</li>
<li>The index designs have to be the same across all partitions. (You can do some fancy stuff with filtered indexes, but it&#8217;s a giant pain in the keister.)</li>
<li>Table partitioning comes with a lot of design &amp; implementation considerations, basically requiring rewriting the whole table and all its indexes.</li>
<li>Every single one of your queries have to have WHERE clause filters on the partitioning column (which is inevitably a date range in these scenarios). If not, query performance gets worse because SQL Server can&#8217;t eliminate the old partitions.</li>
</ul>
<p><strong><a href="https://www.brentozar.com/archive/2016/09/partitioned-views-guide/">Partitioned views</a> kinda do it &#8211; but not really.</strong> In theory, they suffer from most of the above disadvantages too, with a couple of interesting exceptions:</p>
<ul>
<li>The data can be in different databases, so old stuff can be in an Archive database. You can seal that one as read-only when you&#8217;re not transferring data over from the live database. That makes backups, high availability, corruption checking, and statistics updates faster.</li>
<li>Indexes can easily be wildly different for archives &#8211; like columnstore, or tons of indexes without sacrificing the live data&#8217;s write performance.</li>
</ul>
<p>But the rest of partitioning&#8217;s disadvantages still apply, and you&#8217;ll wanna review those, because they usually end up as showstoppers.</p>
<p><strong>Linked servers kinda do it</strong> &#8211; but not really either. In theory, you can put the old data on a cheap Standard Edition VM with less frequent backups, less high availability, and maybe even no disaster recovery. You replace the old production table&#8217;s name with a view that does a union-all across the current live data, plus a reference to the linked server&#8217;s archival data. In practice:</p>
<ul>
<li>If any query doesn&#8217;t have the partitioning column (like date) as part of its where clause, <em>performance can be spectacularly bad</em>, because SQL Server doesn&#8217;t always filter data over on the archival server. Sometimes it brings <em>all of the archive data</em> across the network wire over to the production server, and does the filtering there.</li>
<li>Linked server data isn&#8217;t cached. When multiple users run multiple queries, even simultaneously, their query data isn&#8217;t shared or cached. It&#8217;s fetched from the archive server over the network into your production server&#8217;s memory, taking up space every time, replacing stuff that your production server used to cache.</li>
<li>As data ages, and you wanna move it to cheap/slow storage, this is really slow since we&#8217;re moving across servers now, and writing to a really slow destination.</li>
</ul>
<p>I&#8217;ve seen a lot of people try to use the linked server approach. They test a bunch of queries, work to make sure they don&#8217;t touch the linked server, and then go live &#8211; only to get a horrible surprise about the queries they <em>didn&#8217;t</em> test. It only takes a handful of frequently-called queries accidentally fetching data from the linked archive server to bring your production box to its knees.</p>
<h3>Try the linked server approach first.</h3>
<p>If you still wanna try archival after reading the above limitations, then try the linked server approach. It&#8217;s the one that will produce the most business value if you can get it to work. Here&#8217;s how to approach it conceptually:</p>
<ul>
<li>Set up a development environment with two servers: &#8220;production&#8221; and &#8220;archive&#8221;</li>
<li>Do the development work to replace the production tables with views that union-all across your current production data, plus the archival data on the linked server</li>
<li>Archive data over to the archival server, taking it out of production &#8211; you wanna accurately simulate the data distribution that you&#8217;re going to see in the real-life environment</li>
<li>Capture a trace of activity in real-life production for a business day</li>
<li>Set up a trace of activity on the development &#8220;archive&#8221; server</li>
<li>Replay the production trace on the development &#8220;production&#8221; server</li>
<li>Stop the trace of activity on the development &#8220;archive&#8221; server, and review its contents. Those are the queries that are going to hit your development &#8220;archive&#8221; server in real life. If you&#8217;ve done your work correctly, <em>few</em> queries will be hitting that server &#8211; because if they are, then you&#8217;re frequently querying archive data, and what was the point of all this?</li>
</ul>
<p>It&#8217;s a lot of work &#8211; but it sure is better than yolo&#8217;ing your way through this and discovering how bad it&#8217;s going to be after you&#8217;ve already archived in production, and you have to move it all back.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.brentozar.com/archive/2026/05/we-want-to-archive-but-we-still-want-to-query-the-data/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">357850</post-id>	</item>
		<item>
		<title>Free SQL Server Spring Training on Performance Tuning</title>
		<link>https://www.brentozar.com/archive/2026/05/free-sql-server-spring-training-on-performance-tuning/</link>
					<comments>https://www.brentozar.com/archive/2026/05/free-sql-server-spring-training-on-performance-tuning/#comments</comments>
		
		<dc:creator><![CDATA[Brent Ozar]]></dc:creator>
		<pubDate>Wed, 06 May 2026 13:15:37 +0000</pubDate>
				<category><![CDATA[Conferences and Classes]]></category>
		<guid isPermaLink="false">https://www.brentozar.com/?p=358134</guid>

					<description><![CDATA[Times and tech are changing quickly. Let&#8217;s get you up to speed on the latest developments to do your work more quickly with a series of free live webcasts. How to Tune Indexes Faster &#8211; May 12 &#38; 18 &#8211; Brent Ozar will show you how to use the latest features of sp_BlitzIndex to rapidly...]]></description>
										<content:encoded><![CDATA[<p>Times and tech are changing quickly. Let&#8217;s get you up to speed on the latest developments to do your work more quickly with a series of free live webcasts.</p>
<p><strong>How to Tune Indexes Faster &#8211; May 12 &amp; 18</strong> &#8211; <span>Brent Ozar will show you how to use the latest features of sp_BlitzIndex to rapidly improve performance on an existing database. He&#8217;ll show you how to figure out quickly if you&#8217;ve got too many indexes or not enough, and then demonstrate how to get advice from AI on how to consolidate them in seconds.</span></p>
<p><strong>How to Tune Queries Faster &#8211; May 14 &amp; 20</strong> &#8211; <span>Brent Ozar will show you how to use the latest features of sp_BlitzCache to rapidly improve performance on an existing server. He&#8217;ll show you how to find your server&#8217;s top bottleneck, find the queries causing that bottleneck, and then demonstrate how to get advice from AI on how to tune them in seconds.</span></p>
<p><strong><a  href="https://www.brentozar.com/wp-content/uploads/2026/04/Brent_Ozar_Trophy_Husband.jpg"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  fetchpriority="high" decoding="async" class="alignright size-medium wp-image-357987" src="https://www.brentozar.com/wp-content/uploads/2026/04/Brent_Ozar_Trophy_Husband-250x228.jpg" alt="" width="250" height="228" srcset="https://www.brentozar.com/wp-content/uploads/2026/04/Brent_Ozar_Trophy_Husband-250x228.jpg 250w, https://www.brentozar.com/wp-content/uploads/2026/04/Brent_Ozar_Trophy_Husband-439x400.jpg 439w, https://www.brentozar.com/wp-content/uploads/2026/04/Brent_Ozar_Trophy_Husband-600x546.jpg 600w, https://www.brentozar.com/wp-content/uploads/2026/04/Brent_Ozar_Trophy_Husband.jpg 738w" sizes="(max-width: 250px) 100vw, 250px" /></a>How to Gather Diagnostics Faster &#8211; June 2</strong> &#8211; <span>Whether you&#8217;re a consultant, a full time DBA at a big company, or just a lone sysadmin in a hurry, sometimes you need to gather a lot of diagnostic data, quickly, while SQL Server or Azure SQL DB is having a performance emergency. You wanna grab all this without running a bunch of time-consuming commands, and you want to be able to review the data later, at your leisure, to understand what was happening on the server. In this webcast, Brent Ozar will show you two ways to do it: by setting up Agent jobs to run the First Responder Scripts, and by using the Consultant Toolkit.</span></p>
<p><strong>How to Get Daily Database Advice &#8211; June 4</strong> &#8211; <span>You&#8217;ve got a lot on your plate, and SQL Server is just one of the things trying to get your attention. You&#8217;re looking for a way to have someone else keep an eye on your servers to alert you about really important tasks that can&#8217;t wait. You&#8217;ve tried third party monitoring apps, but they&#8217;re constantly crying wolf, spamming your email in-box with warnings about things that don&#8217;t really matter. In this webcast, we&#8217;ll show you how to install the totally free SQL ConstantCare app, the kinds of things it warns you about, and explain our monitoring philosophy. If you&#8217;d like to get performance advice with the paid version, we&#8217;ll show you how that works, too.</span></p>
<p><span>All of the meetings start at the same time: 1PM Eastern, 10AM Pacific. If you can&#8217;t make the classes, we&#8217;ll send out recording links after the classes finish. </span>The classes will be lecture-only &#8211; you don&#8217;t have to follow along on your machine, and you don&#8217;t have to install or configure anything.</p>
<p><a href="https://www.brentozar.com/archive/2026/05/free-sql-server-spring-training-on-performance-tuning/">Register here on the blog.</a> See you in class!</p>
<script>
var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),document.addEventListener("gform/theme/scripts_loaded",function(){gform.themeScriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,themeScriptsLoaded:!1,isFormEditor:()=>"function"==typeof InitializeEditor,callIfLoaded:function(o){return!(!gform.domLoaded||!gform.scriptsLoaded||!gform.themeScriptsLoaded&&!gform.isFormEditor()||(gform.isFormEditor()&&console.warn("The use of gform.initializeOnLoaded() is deprecated in the form editor context and will be removed in Gravity Forms 3.1."),o(),0))},initializeOnLoaded:function(o){gform.callIfLoaded(o)||(document.addEventListener("gform_main_scripts_loaded",()=>{gform.scriptsLoaded=!0,gform.callIfLoaded(o)}),document.addEventListener("gform/theme/scripts_loaded",()=>{gform.themeScriptsLoaded=!0,gform.callIfLoaded(o)}),window.addEventListener("DOMContentLoaded",()=>{gform.domLoaded=!0,gform.callIfLoaded(o)}))},hooks:{action:{},filter:{}},addAction:function(o,r,e,t){gform.addHook("action",o,r,e,t)},addFilter:function(o,r,e,t){gform.addHook("filter",o,r,e,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,r){gform.removeHook("action",o,r)},removeFilter:function(o,r,e){gform.removeHook("filter",o,r,e)},addHook:function(o,r,e,t,n){null==gform.hooks[o][r]&&(gform.hooks[o][r]=[]);var d=gform.hooks[o][r];null==n&&(n=r+"_"+d.length),gform.hooks[o][r].push({tag:n,callable:e,priority:t=null==t?10:t})},doHook:function(r,o,e){var t;if(e=Array.prototype.slice.call(e,1),null!=gform.hooks[r][o]&&((o=gform.hooks[r][o]).sort(function(o,r){return o.priority-r.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==r?t.apply(null,e):e[0]=t.apply(null,e)})),"filter"==r)return e[0]},removeHook:function(o,r,t,n){var e;null!=gform.hooks[o][r]&&(e=(e=gform.hooks[o][r]).filter(function(o,r,e){return!!(null!=n&&n!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][r]=e)}});
</script>

                <div class='gf_browser_ie gform_wrapper gravity-theme gform-theme--no-framework' data-form-theme='gravity-theme' data-form-index='0' id='gform_wrapper_65' ><div id='gf_65' class='gform_anchor' tabindex='-1'></div>
                        <div class='gform_heading'>
							<p class='gform_required_legend'>&quot;<span class="gfield_required gfield_required_asterisk">*</span>&quot; indicates required fields</p>
                        </div><form method='post' enctype='multipart/form-data' target='gform_ajax_frame_65' id='gform_65'  action='/feed/#gf_65' data-formid='65' novalidate>
                        <div class='gform-body gform_body'><div id='gform_fields_65' class='gform_fields top_label form_sublabel_below description_below validation_below'><div id="field_65_6" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_65_6'>LinkedIn</label><div class='ginput_container'><input name='input_6' id='input_65_6' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_65_6'>This field is for validation purposes and should be left unchanged.</div></div><fieldset id="field_65_5" class="gfield gfield--type-name gfield--input-type-name gfield--width-full gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><legend class='gfield_label gform-field-label gfield_label_before_complex' >Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></legend><div class='ginput_complex ginput_container ginput_container--name no_prefix has_first_name no_middle_name has_last_name no_suffix gf_name_has_2 ginput_container_name gform-grid-row' id='input_65_5'>
                            
                            <span id='input_65_5_3_container' class='name_first gform-grid-col gform-grid-col--size-auto' >
                                                    <input type='text' name='input_5.3' id='input_65_5_3' value=''   aria-required='true'     />
                                                    <label for='input_65_5_3' class='gform-field-label gform-field-label--type-sub '>First</label>
                                                </span>
                            
                            <span id='input_65_5_6_container' class='name_last gform-grid-col gform-grid-col--size-auto' >
                                                    <input type='text' name='input_5.6' id='input_65_5_6' value=''   aria-required='true'     />
                                                    <label for='input_65_5_6' class='gform-field-label gform-field-label--type-sub '>Last</label>
                                                </span>
                            
                        </div></fieldset><div id="field_65_2" class="gfield gfield--type-email gfield--input-type-email gfield--width-full gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_65_2'>Email<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_2' id='input_65_2' type='email' value='' class='medium'    aria-required="true" aria-invalid="false"  />
                        </div></div><fieldset id="field_65_3" class="gfield gfield--type-checkbox gfield--type-choice gfield--input-type-checkbox gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><legend class='gfield_label gform-field-label gfield_label_before_complex' >Things I want<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></legend><div class='ginput_container ginput_container_checkbox'><div class='gfield_checkbox ' id='input_65_3'><div class='gchoice gchoice_65_3_1'>
								<input class='gfield-choice-input' name='input_3.1' type='checkbox'  value='Free Training Class Invites'  id='choice_65_3_1'   />
								<label for='choice_65_3_1' id='label_65_3_1' class='gform-field-label gform-field-label--type-inline'>Free Training Class Invites</label>
							</div><div class='gchoice gchoice_65_3_2'>
								<input class='gfield-choice-input' name='input_3.2' type='checkbox'  value='Subscribe to Blog Posts (3-4 per week)'  id='choice_65_3_2'   />
								<label for='choice_65_3_2' id='label_65_3_2' class='gform-field-label gform-field-label--type-inline'>Subscribe to Blog Posts (3-4 per week)</label>
							</div></div></div></fieldset></div></div>
        <div class='gform-footer gform_footer top_label'> <input type='submit' id='gform_submit_button_65' class='gform_button button' onclick='gform.submission.handleButtonClick(this);' data-submission-type='submit' value='Register'  /> <input type='hidden' name='gform_ajax' value='form_id=65&amp;title=&amp;description=&amp;tabindex=0&amp;theme=gravity-theme&amp;styles=[]&amp;hash=0b65344270a7ccdf157ab6c63c024714' />
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_65' value='iframe' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_65' id='gform_theme_65' value='gravity-theme' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_65' id='gform_style_settings_65' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_65' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='65' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='cOFWFPFRg/nzjj2tZVklG9/kiXr99uzhHd2VQl+X1oejAYDE/ddLYt5+UL2BE5Z4w+2qGvyuRvr5ag7jiS+nZjDTyRgqG5CpOvbxsO4aO8wblcI=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_65' value='WyJbXSIsImQxMjI5NmU0ODQ3NzQ1NGJiOGExN2VjYTEwZGZmY2RkIl0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_65' id='gform_target_page_number_65' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_65' id='gform_source_page_number_65' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        <p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>&#916;<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="120"/><script>
document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() );
</script>
</p></form>
                        </div>
		                <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_65' id='gform_ajax_frame_65' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe>
		                <script>
gform.initializeOnLoaded( function() {gformInitSpinner( 65, 'https://www.brentozar.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_65').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_65');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_65').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_65').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_65').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_65').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_65').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_65').val();gformInitSpinner( 65, 'https://www.brentozar.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [65, current_page]);window['gf_submitting_65'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_65').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_65').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [65]);window['gf_submitting_65'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_65').text());}else{jQuery('#gform_65').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "65", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_65" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_65";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_65" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 65, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>

]]></content:encoded>
					
					<wfw:commentRss>https://www.brentozar.com/archive/2026/05/free-sql-server-spring-training-on-performance-tuning/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">358134</post-id>	</item>
		<item>
		<title>Who&#8217;s Hiring Database People? May 2026 Edition</title>
		<link>https://www.brentozar.com/archive/2026/05/whos-hiring-database-people-may-2026-edition/</link>
					<comments>https://www.brentozar.com/archive/2026/05/whos-hiring-database-people-may-2026-edition/#comments</comments>
		
		<dc:creator><![CDATA[Brent Ozar]]></dc:creator>
		<pubDate>Tue, 05 May 2026 13:15:34 +0000</pubDate>
				<category><![CDATA[Who's Hiring]]></category>
		<guid isPermaLink="false">https://www.brentozar.com/?p=357254</guid>

					<description><![CDATA[Is your company hiring for a database position as of May 2026? Do you wanna work with the kinds of people who read this blog? Let&#8217;s make a love connection. If your company is hiring, leave a comment. The rules: Your comment must include the job title, and either a link to the full job...]]></description>
										<content:encoded><![CDATA[<p>Is your company hiring for a database position as of May 2026? Do you wanna work with the kinds of people who read this blog? Let&#8217;s make a love connection.</p>
<p><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  decoding="async" class="alignright size-medium wp-image-353672" src="https://www.brentozar.com/wp-content/uploads/2024/10/Brent-and-Moose-190x250.jpg" alt="You probably don't wanna hire these two." width="190" height="250" srcset="https://www.brentozar.com/wp-content/uploads/2024/10/Brent-and-Moose-190x250.jpg 190w, https://www.brentozar.com/wp-content/uploads/2024/10/Brent-and-Moose-304x400.jpg 304w, https://www.brentozar.com/wp-content/uploads/2024/10/Brent-and-Moose-600x789.jpg 600w, https://www.brentozar.com/wp-content/uploads/2024/10/Brent-and-Moose-768x1010.jpg 768w, https://www.brentozar.com/wp-content/uploads/2024/10/Brent-and-Moose-scaled.jpg 1946w" sizes="(max-width: 190px) 100vw, 190px" />If your company is hiring, leave a comment. The rules:</p>
<ul>
<li>Your comment must include the job title, and either a link to the full job description, or the text of it.</li>
<li>An email address to send resumes, or a link to the application process &#8211; if I were you, I&#8217;d put an email address because you may want to know that applicants are readers here, because they might be more qualified than the applicants you regularly get.</li>
<li>Please state the location and include REMOTE and/or VISA when that sort of candidate is welcome. When remote work is not an option, include ONSITE.</li>
<li>Please only post if you personally are part of the hiring company—no recruiting firms or job boards. Only one post per company. If it isn&#8217;t a household name, please explain what your company does.</li>
<li>It has to be a data-related job.</li>
</ul>
<p>If your comment isn&#8217;t relevant or smells fishy, I&#8217;ll delete it. If you have questions about why your comment got deleted, or how to maximize the effectiveness of your comment, <a href="https://www.brentozar.com/contact/">contact me</a>.</p>
<p>Each month, I publish a new post in <a href="https://www.brentozar.com/archive/category/professional-development/whos-hiring/">the Who&#8217;s Hiring category here</a> so y&#8217;all can get the latest opportunities.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.brentozar.com/archive/2026/05/whos-hiring-database-people-may-2026-edition/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">357254</post-id>	</item>
		<item>
		<title>Free Webcast: Fixing Parameter Sniffing with Index Tuning</title>
		<link>https://www.brentozar.com/archive/2026/05/free-webcast-fixing-parameter-sniffing-with-index-tuning/</link>
					<comments>https://www.brentozar.com/archive/2026/05/free-webcast-fixing-parameter-sniffing-with-index-tuning/#comments</comments>
		
		<dc:creator><![CDATA[Brent Ozar]]></dc:creator>
		<pubDate>Fri, 01 May 2026 13:15:56 +0000</pubDate>
				<category><![CDATA[Indexing]]></category>
		<guid isPermaLink="false">https://www.brentozar.com/?p=358118</guid>

					<description><![CDATA[When a query is sometimes fast and sometimes slow, there are a lot of ways you can reduce the effects of parameter sniffing. We&#8217;re always going to have parameter sniffing in SQL Server and Azure SQL DB &#8211; it&#8217;s just the way the product is built &#8211; but there are a lot of options to reduce...]]></description>
										<content:encoded><![CDATA[<p><a  href="https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops.jpg"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  decoding="async" class="alignright wp-image-299005 size-us_350_350_crop" src="https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-350x350.jpg" alt="I'm trying not to sniff your parameters" width="350" height="350" srcset="https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-350x350.jpg 350w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-250x250.jpg 250w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-400x400.jpg 400w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-1536x1536.jpg 1536w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-600x600.jpg 600w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-768x768.jpg 768w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops-150x150.jpg 150w, https://www.brentozar.com/wp-content/uploads/2019/11/brent_oops.jpg 1662w" sizes="(max-width: 350px) 100vw, 350px" /></a>When a query is sometimes fast and sometimes slow, there are a lot of ways you can reduce the effects of parameter sniffing. We&#8217;re always going to <em>have</em> parameter sniffing in SQL Server and Azure SQL DB &#8211; it&#8217;s just the way the product is built &#8211; but there are a lot of options to reduce the blast radius.</p>
<p>One of the most powerful ways to do it &#8211; especially if you&#8217;re stuck with code you can&#8217;t change, like code generated by Entity Framework or other ORMs &#8211; is to tune indexes. It sounds odd, but by changing the shape of indexes, you can reshape execution plans &#8211; either encouraging SQL Server to take the paths you want, or removing paths that result in inefficient plans.</p>
<p>On May 21, I&#8217;m doing a free webcast with Idera on <a href="https://register.gotowebinar.com/register/3480723315596012384">How Index Tuning Reduces the Blast Radius</a>. In there, I&#8217;ll also be demoing sp_BlitzIndex&#8217;s new AI features, which can help you tune indexes across more tables, faster, using whatever LLM you like, hosted or local.</p>
<p>See you there!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.brentozar.com/archive/2026/05/free-webcast-fixing-parameter-sniffing-with-index-tuning/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">358118</post-id>	</item>
	</channel>
</rss>