<?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>LobsterPot Solutions</title>
	<atom:link href="https://lobsterpot.com.au/feed/" rel="self" type="application/rss+xml" />
	<link>https://lobsterpot.com.au/</link>
	<description></description>
	<lastBuildDate>Tue, 11 Aug 2026 07:12:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.3</generator>

<image>
	<url>https://lobsterpot.com.au/wp-content/uploads/2022/02/cropped-LobsterPot_ICON-32x32.png</url>
	<title>LobsterPot Solutions</title>
	<link>https://lobsterpot.com.au/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Temp tables &#8211; a blessing or a curse?</title>
		<link>https://lobsterpot.com.au/blog/2026/08/11/temp-tables-a-blessing-or-a-curse/</link>
					<comments>https://lobsterpot.com.au/blog/2026/08/11/temp-tables-a-blessing-or-a-curse/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 11 Aug 2026 07:12:52 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6391</guid>

					<description><![CDATA[<p>Let me say for starters that I’m pleased we have temporary tables. They’re tremendously useful, but often get abused. Compared to obvious villains like NOLOCK, cursors, and scalar functions, they&#8217;re really quite inane (but any of these features can be used for good &#8211; trust me). But temporary tables were the one of these I [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/08/11/temp-tables-a-blessing-or-a-curse/">Temp tables &#8211; a blessing or a curse?</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Let me say for starters that I’m pleased we have temporary tables. They’re tremendously useful, but often get abused. Compared to obvious villains like NOLOCK, cursors, and scalar functions, they&#8217;re really quite inane (but any of these features can be used for good &#8211; trust me). But temporary tables were the one of these <a href="https://lobsterpot.com.au/blog/2026/07/08/signs-of-potentially-bad-code/" target="_blank" rel="noreferrer noopener">I mentioned in last month’s post about signs of a bad query</a>. If nothing else, using temporary tables probably means you&#8217;re writing procedural code rather than set-based queries. </p>



<p class="wp-block-paragraph">The scenario I want to talk about is using temporary tables to materialise a set of data, ahead of using it in a separate query a moment later. That’s essentially what <a href="https://www.jefftaylor.io/" target="_blank" rel="noreferrer noopener">Jeff Taylor</a> is <a href="https://www.jefftaylor.io/post/t-sql-tuesday-201-invitation-temp-tables-friend-or-foe" target="_blank" rel="noreferrer noopener">asking us to comment on</a>.</p>



<p class="wp-block-paragraph">Temporary tables are fine&#8230; really. I use them often.</p>



<p class="wp-block-paragraph">If I’m writing queries in SSMS, to do some quick debugging of a situation, then I’ll often drop the results into a temporary table.</p>



<p class="wp-block-paragraph">If I’m dealing with remote queries across a linked server, I’ll often use openquery and make a local version of the result set.</p>



<p class="wp-block-paragraph">If I’m grabbing a tiny subset of data from large tables, scanning to look for examples of particular scenarios, I might use NOLOCK and temp tables, before re-testing those specific cases without NOLOCK. More on this later (because I know a bunch of you screamed and unfriended me when you read that there&#8217;s a scenario I used NOLOCK for).</p>



<p class="wp-block-paragraph">And of course, I might use temporary tables to look at the current wait stats before waiting a moment and re-querying &#8211; because that gap in the query is what makes the time-based logic of wait stats work.</p>



<p class="wp-block-paragraph">The problem with temp tables (or cursors or scalar functions to some degree) is that people use them as procedural crutches to ensure the correctness of their queries, and never refactor the code to make it less procedural. Imagine you are really confident in a piece of logic that you created using temp tables or a cursor, but you know that you really ought to use more set-based methods instead. Do I mind that you used procedural code to work out what you wanted? No &#8211; not at all. But how about you use that code in your testing harness, and come up with a better way. Your procedural code can be used to make sure your logic is correct, but maybe stop running it in production, yeah? Particularly once you have the skills to make something that performs better.</p>



<p class="wp-block-paragraph">And as much as it frustrates me, there are times when procedural code is just better. Expertise in your domain should mean knowing when some of those &#8216;rules&#8217; (about procedural v set-based) can be broken.</p>



<p class="wp-block-paragraph">Let&#8217;s quickly consider that scenario with NOLOCK, for example.</p>



<p class="wp-block-paragraph">Imagine you have a known application bug where sometimes the OrderTotal of an Order becomes different to the sum of the OrderLineAmount values. Shouldn&#8217;t happen. But it can. Arguably, Order doesn&#8217;t need an OrderTotal value, but for the sake of performance and various other things, it does. </p>



<p class="wp-block-paragraph">Sure, you can explore options with triggers to try to spot it, but I’d be very reluctant to create a trigger on an existing system. One very real option is to run some hefty scanning queries again the tables involved to check the data. I’m fine about using NOLOCK for this kind of thing, because I don’t need it to be completely accurate. NOLOCK can (and will) give inaccurate results, so I drop the results of my scan into a temporary table (probably a table variable actually), and then run the query again without NOLOCK, filtered to the list I came up with, and now able to seek into just those potentially-problematic orders. To see if any of those rows that popped up were just because of data movement causing NOLOCK inaccuracy, and all while minimising the blocking. Is it perfect? No. Am I doing things that would make someone cringe? Sure. My choice though and it meets the goal I’m after.</p>



<p class="wp-block-paragraph">When I’m running a query that involves a linked server, I feel like I&#8217;m even more at the mercy of the Query Optimizer than usual. I’m always somewhat at the mercy of the QO to be fair, but when linked servers are involved, I’m much less able to provide the QO with metadata, based on limited information about &#8220;what&#8217;s on the other side&#8221;. If the stats are looking like I might get a bad plan (with the potential for it to be way worse than a normal bad plan, and potentially impacting two servers), then temporary tables can be my friend. I can work out what data I&#8217;d from the remote server overall, fetch that in a single call (dropping it into a temporary table), and then using my new local copy of the data in my main query. Procedural code can legitimately help when you run the risk of having a bad plan across two servers.</p>



<p class="wp-block-paragraph">Back in the day, temporary tables were often used as a way of breaking down queries to make them more understandable. And there were even times that the QO would prefer to optimise multiple smaller queries that a single large one, making temp tables a reason for performance. And as there could be stats on the temporary table, sometimes it would just work better.</p>



<p class="wp-block-paragraph">Still today this is a very real tuning method, but I feel like the QO has improved a lot and there are advantages to be lost by materialising intermediate results. When you see a plan operator pushing out 10k rows of data, it&#8217;s better not to just let the engine use those rows, rather than drop them onto disk and pick them up again. Then again, if that same branch appears multiple times, then spooling them could be useful. And a temporary table is basically rolling your own table spool. It&#8217;s definitely a real tuning method!</p>



<p class="wp-block-paragraph">I will always advocate for the power of the QO, and for its ability to see shortcuts to avoid work. But sometimes you really have to give a nod to query writers for creating stuff that the QO is going to struggle with, and either introduce or rip out temporary tables to get the behaviour you want.</p>



<p class="wp-block-paragraph">And ultimately, I’d rather a query be easy to understand and perform well. I&#8217;m not going to rule out temporary tables if I can achieve both of these.</p>



<p class="wp-block-paragraph">It&#8217;s all well and good to be a purist, but pragmatism usually wins.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/08/11/temp-tables-a-blessing-or-a-curse/">Temp tables &#8211; a blessing or a curse?</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/08/11/temp-tables-a-blessing-or-a-curse/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL 2025 showing crazy-high CPU</title>
		<link>https://lobsterpot.com.au/blog/2026/07/27/sql-2025-showing-crazy-high-cpu/</link>
					<comments>https://lobsterpot.com.au/blog/2026/07/27/sql-2025-showing-crazy-high-cpu/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 11:22:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6386</guid>

					<description><![CDATA[<p>Yes, you should consider upgrade to SQL Server 2025. But if you use SQL Logins, check this first (and if you&#8217;re here to figure out why it&#8217;s suddenly slow, read on). For the most part, upgrades to SQL Server 2025 go pretty smoothly. I&#8217;d even say upgrades to other versions of SQL Server have gone [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/07/27/sql-2025-showing-crazy-high-cpu/">SQL 2025 showing crazy-high CPU</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Yes, you should consider upgrade to SQL Server 2025. But if you use SQL Logins, check this first (and if you&#8217;re here to figure out why it&#8217;s suddenly slow, read on).</strong></p>



<p class="wp-block-paragraph">For the most part, upgrades to SQL Server 2025 go pretty smoothly. I&#8217;d even say upgrades to other versions of SQL Server have gone pretty smoothly too, although plenty of people suffered from performance pain from the change in cardinality estimation model when upgrading to SQL 2014 (well, the compatibility level 120). The &#8216;simple&#8217; fix for that one was to put the compatibility level back to 110, and then figure out what was causing the pain. But with SQL Server 2025, there&#8217;s another pain point which isn&#8217;t quite so easy to get around.</p>



<p class="wp-block-paragraph">Regular readers will know that I don&#8217;t like to write about real situations that customers have been through. It&#8217;s all well and good to say that I fixed the performance of a query by adding an index, or by changing the data type of a column, but I&#8217;m always reluctant to mention particular products or customers by name.</p>



<p class="wp-block-paragraph">But this one has already been mentioned, including calling me out by name, so I&#8217;m fine.</p>



<p class="wp-block-paragraph"><a href="https://www.winthropdc.com/about.htm" target="_blank" rel="noreferrer noopener">David Musgrave</a> is a <a href="https://mvp.microsoft.com/en-US/mvp/profile/3a472184-a751-e511-810d-fc15b4285d7c" target="_blank" rel="noreferrer noopener">Dynamics MVP</a> in Perth (Adelaide&#8217;s nearest neighbour to the west, only 2000km away) who reaches out from time to time. A couple of months I got a call from Arthur Achilleos saying David had recommended me to figure out why a machine that had been upgraded from SQL Server 2019 to SQL Server 2025 had seen its CPU metrics skyrocket. Queries were struggling to run, and people were scrambling to figure out if rolling back to SQL Server 2019 was an option. The application was Dynamics GP.</p>



<p class="wp-block-paragraph">SQL Server 2025 introduces a handful of new features. Intelligent Query Processing, for example, has seen a number of changes such as Parameter Sensitivity Optimization and Cardinality Feedback. A quick look at the queries that were the most expensive showed a lot of queries that had over a hundred parameters. My initial thoughts were that this could be painful if the engine is trying to assess the parameter sensitivity across all of that. But that wasn&#8217;t it. Not entirely.</p>



<p class="wp-block-paragraph">Connecting via SSMS wasn&#8217;t much of a problem, and queries seemed to run well enough there.</p>



<p class="wp-block-paragraph">We looked at the wait stats, and some of the usual suspects around parallelism were around, as well as some SQL Operating System ones (SOS_SCHEDULER_YIELD, for example). But there was one wait type that I hadn&#8217;t seen much of before. It was appearing third or fourth in the list of largest waits, and only occasionally jumping to the top, even when the long list of &#8220;ignorable&#8221; wait types were ignored (as per <a href="https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/" target="_blank" rel="noreferrer noopener">SQLskills&#8217; list</a>). It was the <strong><a href="https://www.sqlskills.com/help/waits/preemptive_os_cryptops/" target="_blank" rel="noreferrer noopener">PREEMPTIVE_OS_CRYPTOPS</a> </strong>wait type. I&#8217;ve linked to SQLskills&#8217; post about the type, because they make it clear that this is typically more of a Windows problem than a SQL one (plus, SQLskills is where you should always go for information about wait types &#8211; it&#8217;s a great resource). Their page suggests to &#8220;have your infrastructure team investigate performance issues with servers that provide cryptographic services to the domain (for instance, the server for an Enterprise Key Management system)&#8221;. And while that&#8217;s really good advice, it wasn&#8217;t what was going on here.</p>



<p class="wp-block-paragraph">This problem is actually inside SQL Server 2025, and what&#8217;s worse is that you probably won&#8217;t notice it in your test environment unless you&#8217;re testing at scale.</p>



<p class="wp-block-paragraph">The issue is the way that SQL Server 2025 hashes the passwords for SQL Logins. Dynamics GP uses SQL Logins. Lots of older applications do. Essentially, the PBKDF2 algorithm improves on security by applying the SHA-512 hash 100,000 times. The idea is to slow down brute force attacks, but it will also slow down applications that re-authenticate a lot. Chatty ones. Connection pooling can help to a degree, but not as much as you might like. Best is to use a Windows login instead &#8211; the trusted account for your web service, or the user who&#8217;s running the application. It&#8217;s why SSMS might still run just fine &#8211; because SSMS probably connects as you. And because SSMS won&#8217;t be as chatty as your application.</p>



<p class="wp-block-paragraph">Your test harness, making sure that your logic is correct in the new database environment, might not push enough new logins to notice. Maybe it reuses its connections really well. Either way, this is a problem that seems to avoid getting caught in test environments. Perfect.</p>



<p class="wp-block-paragraph">Let me be clear&#8230; <strong>The fix is to use a Windows Login. </strong>But I do appreciate you might not be able to change your application. </p>



<p class="wp-block-paragraph">You can&#8217;t just set the compatibility level back to SQL 2022 to make this problem go away, but there is a trace flag you can use. A couple of months ago, it was definitely undocumented. I&#8217;ve heard it&#8217;s now documented, but I&#8217;m not completely sure. I can&#8217;t see it described on anything official. So maybe check with Microsoft Support. (Even though when your CPU is high and your application is failing, you want a really urgent fix and don&#8217;t want to have to wait for Microsoft Support!)</p>



<p class="wp-block-paragraph"><strong>But even the trace flag isn&#8217;t the whole fix.</strong></p>



<p class="wp-block-paragraph">You need to know &#8211; this trace flag was documented by Michael Howard for SQL Server 2022, for turning this behaviour ON. You can read it at <a href="https://techcommunity.microsoft.com/blog/azuresqlblog/support-for-iterated-and-salted-hash-password-verifiers-in-sql-server-2022-cu12/4087155">Support for Iterated and Salted Hash Password Verifiers in SQL Server 2022 CU12 | Microsoft Community Hub</a>. But in SQL Server 2025, the trace flag reverts you to the old one. You might want to be aware of that if you used the trace flag to become compliant with NIST SP 800-63b. Personally, I would&#8217;ve preferred a different trace flag for turning PBKDF2 off, that wasn&#8217;t the same one that turned it on before. The trace flag is 4671. There are a few blog posts about it, but not enough to convince me that it&#8217;s fully supported. If you turn it on in SQL 2022, it might make your application slow. It&#8217;s annoying.</p>



<p class="wp-block-paragraph"><strong>The trace flag was in that last paragraph. But please keep reading for the full fix.</strong></p>



<p class="wp-block-paragraph">In SQL 2025, after you&#8217;ve applied the trace flag, each password hash will still be the PBKDF2 version until you reset it with ALTER LOGIN, so just applying the trace flag won&#8217;t fix the CPU right away. The login mechanism is smart, and checks to see which hash algorithm was used so that it can check it right way &#8211; either the fast method or the slow one. But in SQL 2025 without the trace flag, it&#8217;ll update a successful the hash to the PBKDF2 version for next time. So the trick is to turn on the trace flag, then reset all your passwords (let&#8217;s face it &#8211; probably only one), and only then will your performance return. Luckily, the logins will still work on either algorithm, but anyone logging in repeatedly with a PBKDF2 hash will hurt your CPU until you reset the password. </p>



<p class="wp-block-paragraph">The clue for spotting which algorithm was used on each password is to look at the password_hash column in sys.sql_logins. The PBKDF2 ones start with 0x03, and the older/faster ones start with 0x02. Leave &#8216;sa&#8217; disabled (always) and with a PBKDF2 hash, because that&#8217;s the one you really want to be more secure (same for all sysadmin ones), but any locked-down application logins could be 0x02 style, for the sake of your CPU. </p>



<p class="wp-block-paragraph">And in case you&#8217;re curious, <a href="https://winthropdc.blog/2026/06/04/msdyngp-sql-server-2025-default-password-verifiers-causing-slow-microsoft-dynamics-gp-performance/" target="_blank" rel="noreferrer noopener">David&#8217;s post about it is here</a>, including some instructions on configuring trace flags. </p>



<p class="wp-block-paragraph">I really hope you&#8217;re reading this BEFORE you&#8217;ve experienced it. Otherwise, good luck.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/07/27/sql-2025-showing-crazy-high-cpu/">SQL 2025 showing crazy-high CPU</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/07/27/sql-2025-showing-crazy-high-cpu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Signs of potentially-bad code</title>
		<link>https://lobsterpot.com.au/blog/2026/07/08/signs-of-potentially-bad-code/</link>
					<comments>https://lobsterpot.com.au/blog/2026/07/08/signs-of-potentially-bad-code/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 07:41:24 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6372</guid>

					<description><![CDATA[<p>I feel like I should preface this with a disclaimer. I added &#8220;potentially-&#8221; to the title, because there are many queries that might seem bad but can actually perform just fine. There are queries that on the surface can be great, but are nasty without a particular index, and there are queries that make me [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/07/08/signs-of-potentially-bad-code/">Signs of potentially-bad code</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I feel like I should preface this with a disclaimer. I added &#8220;potentially-&#8221; to the title, because there are many queries that might seem bad but can actually perform just fine. There are queries that on the surface can be great, but are nasty without a particular index, and there are queries that make me cringe a little when looking at them, but are actually okay. Brent Ozar is asking about <a href="https://www.brentozar.com/archive/2026/06/get-your-blog-posts-ready-for-t-sql-tuesday-200-heres-the-topic/" target="_blank" rel="noreferrer noopener">signs of bad code </a>for this month&#8217;s T-SQL Tuesday (the 200th &#8211; and I have a response for all 200 if you look back through my history of posts), and he wants us to write this for 2004 Brent, rather than 2026 Brent.</p>



<p class="wp-block-paragraph">2004 was a different time for T-SQL. For example, we could still write joins using commas, putting the predicates in the WHERE clause. This still works today, but back then if we wanted to do an outer join, we would join using a special operator, such as &#8220;WHERE s.ProductID *= p.ProductID&#8221;. Code like this was deprecated in SQL Server 2005, and stopped working completely in SQL Server 2012.</p>



<p class="wp-block-paragraph">So let&#8217;s start with that one. Hey Brent04, <strong>stop doing joins that way. Embrace the ON clause. </strong>It won&#8217;t make your code work any better, but it will stop it from breaking in a few years&#8217; time. Plus, you can do more with it, having control about which join predicates are used for joining which tables. If you do find yourself wanting to use a comma, write out CROSS JOIN instead. I know it&#8217;s more typing, but you&#8217;ll make better choices.</p>



<p class="wp-block-paragraph">But now that we&#8217;re talking about joins &#8211; <strong>start using aliases, and don&#8217;t just refer to the first table as &#8216;a&#8217;, the second as &#8216;b&#8217;, and so on</strong>. It doesn’t change the performance, but I will judge you. If you&#8217;re only using aliases when you refer to a table twice in a query, then I&#8217;m going to think you write your queries using Query Builder, and that&#8217;s something you should move away from (Query Builder will limit you, and can even make mistakes, so don&#8217;t use it &#8211; take the time to learn to write queries without it). Without aliases, at some point you&#8217;ll look back at your code, and when you see something like: &#8220;WHERE a.Col1 > 3 AND Val &lt; 7&#8221;, you won&#8217;t know which table the &#8220;Val&#8221; column is in, and you&#8217;ll need to keep looking back at the FROM clause to see which table is &#8216;a&#8217;. I&#8217;ve seen code like &#8220;FROM dbo.Bank as a JOIN dbo.Account as b ON a.BankID = b.BankID&#8221;, and that&#8217;s going to trip up anyone.</p>



<p class="wp-block-paragraph">Notice how I used schemas there? Yeah, you should specify the schemas. Don&#8217;t be lazy. We all do it from time to time, especially in databases where everything is in dbo &#8211; but at some point you&#8217;ll regret it. Plus, it&#8217;s slightly more work for the database engine if you don&#8217;t tell it the schema, as it has to check what your default schema is, and see if that object is in there. But more importantly, when your code runs as someone who has a different default schema, it might do something different.</p>



<p class="wp-block-paragraph">Another pattern that will really make me cringe, Brent04, is <strong>when a procedure contains lots of UPDATE statements</strong>. I&#8217;m sure you know what I mean &#8211; this kind of thing:</p>



<p class="wp-block-paragraph">UPDATE #WorkingTable SET Col2 = Col2 + 1 WHERE Col3 BETWEEN 5 and 10;<br>UPDATE #WorkingTable SET Col3 = 11 WHERE Col2 &gt; 10;<br>UPDATE #WorkingTable SET Col2 = Col2 * 2 WHERE Col3 &gt; 10;<br>&#8211;followed by dozens of similar lines</p>



<p class="wp-block-paragraph">This code tends to have been created by people who have a process they need to follow. A recipe. And they can get it working, but it becomes huge and error-prone, and no one wants to debug it. When someone works out the logic isn&#8217;t right &#8211; they tack more statements onto the end.</p>



<p class="wp-block-paragraph">Now, I have my ways of handling this. I start by using a lot of CROSS APPLY clauses to create each new version of the table, with CASE statements to replace the WHERE clauses. It probably looks even more ugly than the list of UPDATE statements, but hopefully does everything in one fell swoop, and after testing the results and tweaking until it&#8217;s correct, I can look at the expressions that get used in the plan to figure out what the finished result should be. Worst case, I leave it as the CASE-statement version, which is almost certainly quicker than the series of UPDATE statements, which might look something like this:</p>



<p class="wp-block-paragraph">UPDATE v0 SET Col1 = v3.Col1, Col2 = v3.Col2, Col3 = v3.Col3<br>FROM #WorkingTable v0<br>CROSS APPLY (SELECT v0.Col1, CASE WHEN v0.Col3 BETWEEN 5 AND 10 THEN v0.Col2 + 1 ELSE v0.Col2 END as Col2, v0.Col3) v1<br>CROSS APPLY (SELECT v1.Col1, v1.Col2, CASE WHEN v1.Col2 > 10 THEN 11 ELSE v1.Col3 END as Col3) v2<br>CROSS APPLY (SELECT v2.Col1, CASE WHEN v2.Col3 > 10 THEN v2.Col2 * 2 ELSE v2.Col2 END as Col2, v2.Col3) v3<br>;</p>



<p class="wp-block-paragraph">If you do this, make sure each CROSS APPLY clause can return exactly one row for each row in the base table (for example, use an aggregate if there&#8217;s a FROM clause, or OUTER APPLY and TOP (1), or don&#8217;t use a FROM clause and have no filter like in my example).</p>



<p class="wp-block-paragraph">So, Brent04… you know I could keep writing for a while here. I&#8217;m going to suggest that you don&#8217;t beat yourself up from all the advice you&#8217;ll get from this T-SQL Tuesday event. Bad code exists, and it takes time to get rid of bad habits. Do what works for you. Understand that correctness is more important than performance, and that you need to be coding within your means. If someone (even me) has recommending a method you don&#8217;t understand, seek to understand it before you start using it. I see a lot of people who have tried to use patterns they&#8217;ve been told are good, but do it wrong and end up with an even bigger mess.</p>



<p class="wp-block-paragraph">Good luck Brent04 &#8211; I guess I&#8217;ll see you in about 5 years. I think it was 2009 when we met in person.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/07/08/signs-of-potentially-bad-code/">Signs of potentially-bad code</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/07/08/signs-of-potentially-bad-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Forgotten skills that could become critical</title>
		<link>https://lobsterpot.com.au/blog/2026/06/09/forgotten-skills-that-could-become-critical/</link>
					<comments>https://lobsterpot.com.au/blog/2026/06/09/forgotten-skills-that-could-become-critical/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 01:09:38 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6365</guid>

					<description><![CDATA[<p>Koen Verbeeck (with inspiration from Alexander Arvidsson) asks about the scenario of returning to on-prem from the cloud. Koen wonders if it’s a European concern, and being in Australia, I’m not entirely sure. I have clients in three of the four camps &#8211; ones who are in the cloud and staying there, ones who are [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/06/09/forgotten-skills-that-could-become-critical/">Forgotten skills that could become critical</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://sqlkover.com/" target="_blank" rel="noreferrer noopener">Koen Verbeeck</a> (with <a href="https://www.arcticdba.se/posts/whiplash-effect/" target="_blank" rel="noreferrer noopener">inspiration from Alexander Arvidsson</a>) asks about the scenario of <a href="https://sqlkover.com/t-sql-tuesday-199-invitation-back-to-on-prem/" target="_blank" rel="noreferrer noopener">returning to on-prem from the cloud</a>. Koen wonders if it’s a European concern, and being in Australia, I’m not entirely sure. I have clients in three of the four camps &#8211; ones who are in the cloud and staying there, ones who are on-prem and staying there, and ones who are in the process of moving from on-prem to the cloud. None are moving from the cloud back to on-prem, but I’m sure some of the reasons that kept the on-prem clients from moving could easily spread to those who are in the cloud. The European concerns could easily become similar in Australia – we have sovereignty concerns that are similar to various European nations – and I’m a little surprised that they aren’t already.</p>



<p class="wp-block-paragraph">One of the things that Koen asks about is training people new to on-prem &#8211; things they wouldn’t necessarily know if they have only worked in the cloud. My mind turns to disk-related issues such as restoring from log files, and to corruption. There was a while when database corruption seemed to be quite commonplace – or at least a reason for people to get in touch with me to help. It’s definitely a lot less of an issue nowadays, even for on-prem environments, but the underlying concepts of disaster recovery are definitely something I think should be understood by SQL professionals.</p>



<p class="wp-block-paragraph">I feel like every SQL professional should be able to argue their reasons for choosing a particular frequency of log backups, where those backups are going to, and what happens to those files. Is recovery tested regularly, including to a specified point-in-time? And can the data professionals explain what’s needed for that? Do they understand tail-log backups, and how to take one if the LDF file is all that can be salvaged (and do they even understand the importance of salvaging the LDF file)?</p>



<p class="wp-block-paragraph">I like to think that junior DBAs are trained in this even if they never use on-prem environments. But I’ve definitely come across gaps.</p>



<p class="wp-block-paragraph">Reliance on data is more and more significant for all organisations, but more and more of that data is in SaaS systems, where the data is stored on the servers of those separate systems. We don’t think about how this data is stored in these online systems, let alone how to back it up and what those companies do to make sure they can recover our data in case of disaster. We might extract the data for analysis, but if these systems become on-prem once more, running on local databases with local DBAs, understanding how to recover will be critical.&nbsp;</p>



<p class="wp-block-paragraph">I do wonder how many organisations would cope if they had to pull systems back from online systems. I have clients who only use systems that can guarantee the data stays in Australia, but this doesn’t tend to include “controlled by Australian organisations”. Considering news articles in 2025 (such as at <a href="https://www.forbes.com/sites/emmawoollacott/2025/07/22/microsoft-cant-keep-eu-data-safe-from-us-authorities/" target="_blank" rel="noreferrer noopener">https://www.forbes.com/sites/emmawoollacott/2025/07/22/microsoft-cant-keep-eu-data-safe-from-us-authorities/</a>) reported that Microsoft could be forced to “snoop” on EU-hosted data – although they would push back on any such requests (<a href="https://broadbandbreakfast.com/microsoft-pledges-to-protect-european-operations-and-unveils-data-center-expansion/" target="_blank" rel="noreferrer noopener">https://broadbandbreakfast.com/microsoft-pledges-to-protect-european-operations-and-unveils-data-center-expansion/</a>) – I wonder whether those concerns should be raised even higher. Is anyone asking the smaller SaaS companies what they would do if the US government asked them for sensitive information held in non-US data centres?</p>



<p class="wp-block-paragraph">One thing is for certain – if tension increases between your country and the country of the organisation that has your data, then you will have an interesting time ahead.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/06/09/forgotten-skills-that-could-become-critical/">Forgotten skills that could become critical</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/06/09/forgotten-skills-that-could-become-critical/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Detecting changes</title>
		<link>https://lobsterpot.com.au/blog/2026/05/12/detecting-changes/</link>
					<comments>https://lobsterpot.com.au/blog/2026/05/12/detecting-changes/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 12 May 2026 10:41:37 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6361</guid>

					<description><![CDATA[<p>Figuring out what has changed in a system isn&#8217;t always easy, so it&#8217;s a good topic that Meagan Longoria has chosen this month &#8211; read the invite and see what other people have contributed on the topic at https://datasavvy.me/2026/05/04/t-sql-tuesday-198-invitation-how-do-you-detect-data-changes/ I&#8217;ve used quite a few different methods over the years, because there are pros and cons [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/05/12/detecting-changes/">Detecting changes</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Figuring out what has changed in a system isn&#8217;t always easy, so it&#8217;s a good topic that Meagan Longoria has chosen this month &#8211; read the invite and see what other people have contributed on the topic at <a href="https://datasavvy.me/2026/05/04/t-sql-tuesday-198-invitation-how-do-you-detect-data-changes/" target="_blank" rel="noreferrer noopener">https://datasavvy.me/2026/05/04/t-sql-tuesday-198-invitation-how-do-you-detect-data-changes/</a></p>



<p class="wp-block-paragraph">I&#8217;ve used quite a few different methods over the years, because there are pros and cons of each, and what will work best for one situation might not work at all for another. For example &#8211; it&#8217;s rarely okay to make changes to an existing application, but sometimes it&#8217;s okay to replicate the data to a second database, and use that to detect changes. However, if your database doesn&#8217;t have primary keys, then some kinds of replication won&#8217;t work either…</p>



<p class="wp-block-paragraph">In an ideal world, the database is controlled in-house, so that methods like Change Tracking, Change Data Capture, or the new-in-2025 Change Event Streaming (CES) can be used. Bespoke applications written by a local development team can often agree to avoiding the restrictions that these methods have, but it all depends on what&#8217;s needed.</p>



<p class="wp-block-paragraph">For example, I really like CES. It&#8217;s an easily-configurable tool which will stream changes out to Azure Event Hubs using standard protocols like Apache Kafka or AMQP. The data appears in a CloudEvents message using JSON format, and includes the old values and the new values (how good is that!), so it&#8217;s easy to look in the event stream for messages that suit particular purposes but also dump the data into longer-term storage to let you go back to it. I wouldn&#8217;t want to have to search through a backlog of changes from years ago in JSON format, but it&#8217;s easy to push the changes into a table for the next ETL load <em>(which can save me trying to use start/end times to pick up the changes for each ETL load, and hoping that I can rely on arrival times)</em>, and also store the data in a different format to suit a longer history of changes, at whatever grain I like. Tracking every row with triggers feels a little too close to the application in most cases, while using temporal tables physically adds columns (even if they&#8217;re &#8216;hidden&#8217; columns that&#8217;s probably not a good thing) and locks the tables down a lot.</p>



<p class="wp-block-paragraph">But every silver cloud has a dark lining… You know how I mentioned that local developers can often code around the restrictions here? Well that&#8217;s a thing.</p>



<p class="wp-block-paragraph">At least at the moment (and I&#8217;m not saying that because I have inside knowledge &#8211; I don&#8217;t have any inside knowledge about this at all), there are some <a href="https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/change-event-streaming/configure?view=sql-server-ver17&amp;tabs=sas-access%2Csas-token-auth#limitations" target="_blank" rel="noreferrer noopener">limitations</a>.</p>



<p class="wp-block-paragraph">Some are fine &#8211; for example, you can add or remove columns, and CES doesn&#8217;t care. If a new value appears in a column that wasn’t there when CES was first configured, that&#8217;s fine! The message going to Event Hubs will reference that new column (it&#8217;s just JSON after all), and hopefully your code handling the stream can handle that. Maybe have a column for &#8220;other column data&#8221;? But if you want to rename a column that&#8217;s in a CES-enabled table… sorry, that won&#8217;t work.</p>



<p class="wp-block-paragraph">If you&#8217;re using partitions, CES isn&#8217;t for you. You might not notice it on day one, but when you go to use SWITCH, then you&#8217;ll get an error. Worth knowing. Oh, and you&#8217;re probably not using TRUNCATE TABLE on a table you&#8217;re tracking, but stranger things have existed.</p>



<p class="wp-block-paragraph">But when we get to the column restrictions, there are some surprises. If you&#8217;re someone who uses geometry and geography, then great &#8211; I always felt like there should be more people using those data types. But json and xml are also not supported &#8211; and I do see a lot of xml columns. Like I said, if you&#8217;re wanting to use CES in a local environment, then maybe you can code around this? Or consider CDC, CT, temporal tables, or plain old replication, which all support those types because they don&#8217;t need the data to be serialised as much as CES.</p>



<p class="wp-block-paragraph">For me, CES is very promising for detecting changes, and gives me a bunch of flexibility about how I do that. It&#8217;s very probably my preferred method for tracking history, but the limitations are still pretty annoying. Hopefully in vNext&#8230;?</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/05/12/detecting-changes/">Detecting changes</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/05/12/detecting-changes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Presentations with impact!</title>
		<link>https://lobsterpot.com.au/blog/2026/04/14/presentations-with-impact/</link>
					<comments>https://lobsterpot.com.au/blog/2026/04/14/presentations-with-impact/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 14 Apr 2026 02:28:29 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6356</guid>

					<description><![CDATA[<p>I like this topic from the legendary Steve Hughes. It’s been a long time since I’ve seen him, but he was always a thoroughly good guy. We both spoke at conferences back in the heyday of the SQL community, and although his journey has been tougher than most in recent years, he is still impacting [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/04/14/presentations-with-impact/">Presentations with impact!</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I like this topic from the legendary Steve Hughes. It’s been a long time since I’ve seen him, but he was always a thoroughly good guy. We both spoke at conferences back in the heyday of the SQL community, and although his journey has been tougher than most in recent years, he is still impacting the world in amazing ways.</p>



<p class="wp-block-paragraph">Steve is hosting this month’s T-SQL Tuesday, and <a href="https://dataonwheels.wordpress.com/2026/04/07/t-sql-tuesday-197-an-impactful-session-or-two-from-a-conference/" target="_blank" rel="noreferrer noopener">asks about what we’ve learned from conference sessions</a>, things which impacted us and how we work. It&#8217;s an interesting topic for two reasons &#8211; firstly, I enjoy giving conference presentations, and secondly, they&#8217;re really not my preferred way of learning.</p>



<p class="wp-block-paragraph">Don&#8217;t get me wrong &#8211; conferences are a great way to learn things for a lot of people. I just find that my brain isn&#8217;t wired for learning during sessions. If I&#8217;m at a conference, I&#8217;m probably learning more from conversations, and from hearing what people are saying outside the sessions they&#8217;re giving. But this is part of why I enjoy giving presentations. Let me explain, by way of describing some sessions where I definitely did learn something.</p>



<p class="wp-block-paragraph">I’m not sure which things I learned in conference sessions per se, rather than at conferences in general. I remember an incredibly insightful session at an MVP Summit in 2023 where a few things about Fabric really clicked in ways they hadn’t before. It was so insightful that I grabbed a few others who hadn’t been there (Alex Whittles comes to mind) to join the rest of Bogdan Crivat’s session. But I can’t say it impacted the way I work &#8211; just that it set a stronger foundation than what I’d had before. And also, it wasn&#8217;t a &#8220;traditional&#8221; session, with someone talking in front of hundreds of people. There were a dozen or so of us in a fairly small room, and Bogdan was writing on a whiteboard.</p>



<p class="wp-block-paragraph">Whereas, a session from TechEd Australia 2005 impacted me a lot.</p>



<p class="wp-block-paragraph">It was my second TechEd event (the first was 1999), but the first after I learned the significance of the technical community. And I&#8217;d become a regular presenter myself, just not large events yet. I couldn’t tell you about many of the sessions I attended (I learned a lot more in the expo hall that year), but one session certainly had an impact. It was about security, and the speaker was Microsoft’s Jesper Johansson. LinkedIn tells me he now works for Walmart. <a href="https://www.linkedin.com/in/jesperjo" target="_blank" rel="noreferrer noopener">https://www.linkedin.com/in/jesperjo</a></p>



<p class="wp-block-paragraph">Of course there were things about security that I learned that day, although I couldn’t tell you much about that. The impact that he had on me was more than that. He held the audience’s attention like few technical presenters I’d seen before. I had done user group presentations and spoken in church plenty of times. I understood the need to connect with an audience, but Jesper validated the significance of that for technical sessions. I could remember university lecturers who connected with the room, but mostly that only applied if you were already interested in the subject matter. Jesper was attracting an audience who didn’t even care that much about security. He was leaving a mark. People were learning. Really learning.</p>



<p class="has-text-align-left wp-block-paragraph">Jesper’s session inspired me to aim for a style that would engage people. Technical sessions that would be interesting to people who didn’t necessarily have a background in the material. I wanted to be able to grab the attention of the people in the room (or at least most of them), and hold onto it. To teach their hearts and not just their minds, hopefully so they would leave changed. I try to do the same with my consulting, with the people I encounter in life in general. Of course I’m not always successful at that, but I do ask myself what people need from me whether I’m teaching a large room, a small room, or an individual. Sometimes it’s just a one-on-one conversation, but I&#8217;m there for the audience. I&#8217;m not trying to perform to be entertaining or interesting to them, I&#8217;m genuinely interested in the people who are there and I want to create that connection.</p>



<p class="wp-block-paragraph">I know that my first TechEd Australia presentation didn&#8217;t achieve that. But I hope some of my presentations since then have. I try not to be bound by a slide deck or script (although I&#8217;ll have an idea about how the talk will go, and may have even used slides during the preparation), and instead reach into the room and be led by how the people are responding (definitely harder for online presentations, I know). I learn my material well, so that I have the freedom to explain it in ways that work that day, whether it&#8217;s through demos, whiteboards, flip-charts, or something else. It means I&#8217;m not a typical presenter, and while some audience members don&#8217;t like my presentation style, I hope that enough of them do. I&#8217;ve had a lot of good feedback from a lot of sessions, and even seen some other presenters adopt similar styles with great success.</p>



<p class="wp-block-paragraph">I&#8217;m keen to see which sessions other people mention in response to Steve&#8217;s blog party this month, because I feel like there&#8217;s always something to learn about presenting. When I hear people saying that someone blew their mind, I want to know what it was that caused that. I would encourage every conference presenter to learn from the posts that respond to Steve&#8217;s question, and to inspire to blow people&#8217;s mind, to change their lives, and leave them different. I mean, why wouldn’t you?</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/04/14/presentations-with-impact/">Presentations with impact!</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/04/14/presentations-with-impact/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Career risks?</title>
		<link>https://lobsterpot.com.au/blog/2026/03/10/career-risks/</link>
					<comments>https://lobsterpot.com.au/blog/2026/03/10/career-risks/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 10 Mar 2026 01:38:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6353</guid>

					<description><![CDATA[<p>My old friend James Serra asks about what we’ve done where we weren’t sure that things would work out. I&#8217;m sure you know I&#8217;m a business owner. I’ve had my company since 2008. Sure, there have been ups and downs over that time, but in general it’s been good. We take on clients who want [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/03/10/career-risks/">Career risks?</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">My old friend <a href="https://jamesserra.com">James Serra</a> asks about <a href="https://www.jamesserra.com/archive/2026/03/t-sql-tuesday-192-what-career-risks-have-you-taken/" target="_blank" rel="noreferrer noopener">what we’ve done where we weren’t sure that things would work out</a>.</p>



<p class="wp-block-paragraph">I&#8217;m sure you know I&#8217;m a business owner. I’ve had my company since 2008. Sure, there have been ups and downs over that time, but in general it’s been good. We take on clients who want our services, but also try to maintain a level of flexibility with our time so that we can be responsive to whatever happens. Even if I&#8217;m spending most days at a particular client, I try to make sure I can respond to other things. Because just like how an employee might get sick, another client might have an urgent issue and I like to be able to respond. I like to be able to pause what I’m doing if necessary. Maybe this is to avoid risk, by not feeling like I have all my eggs in one basket. But maybe it increases the risk, because I&#8217;m less inclined to take on long-term full-time contracts.</p>



<p class="wp-block-paragraph">Before I had the business, things were different. I craved stability, and I’m sure my career suffered for it.</p>



<p class="wp-block-paragraph">I finished my university time in Melbourne at the very end of 1997. I’d had jobs as a research assistant in each of the three faculties I got degrees from, and it all wound up on New Year’s Eve at the end of 1997. I handed in my last pieces of work and after the long weekend I started working as a consultant, in a job that I had been offered six months earlier. I turned down the offer of a PhD for the stability of a wage.</p>



<p class="wp-block-paragraph">In 2000, we moved to the UK with our two sons, and that felt risky. When we arrived I did not have a job to step into, but within a week I was deciding which of two I would take. Both were permanent positions &#8211; I was still risk-averse. I didn’t want to go contracting. I didn’t back myself enough. Financially, I could’ve made better choices, but I had a young family, and money has never been a goal. In 2002 we moved to Adelaide (where my wife grew up), and I still wanted permanent roles.</p>



<p class="wp-block-paragraph">It took more than ten years of working in permanent positions (&#8217;98 to &#8217;08) for me to take the career risk of starting my own company.</p>



<p class="wp-block-paragraph">Someone called me an entrepreneur recently. I disagreed with them. I’ve never sought funding from anywhere. I&#8217;ve never tried to build up a company to sell it. I’ve always pushed against hiring a salesperson and never had anyone in the company with a sales-related title.</p>



<p class="wp-block-paragraph">What I have done is lean into the community. I’ve done work for charities for little or no revenue &#8211; I even remember charging a client less than the hourly rate I was paying a subcontractor to do the work. And I’ve volunteered my time (and that of my employees) to work among the data community, running events, speaking at conferences, helping community members with what they need, even sometimes people who would consider us competition. And I’ve tried to listen to what God is saying. That’s been hard a lot of the time, but I try.</p>



<p class="wp-block-paragraph">Is that a career risk? Sure &#8211; community work is definitely a risk. It would be better for me to focus on the bottom line and limit how much we do that isn’t tied directly to revenue. Community work is not how people are supposed to run a business. I’m in a group for business leaders and I know that I’m not the same as most of the others there.</p>



<p class="wp-block-paragraph">This stretches to other parts of my life as well. In the comedy community, I’m hoping to start another open mic room again (I ran one in May/June last year before the venue closed). And I’m not running it to make money &#8211; I’m doing it to provide more options for local comedians. People need stage time to improve, and I can help with that. That might help me improve as a comedian too, but that’s not it. There is a need for more open mic space in Adelaide, and I think I can help. Is that a risk? Nah &#8211; it&#8217;s not taking anything away from my livelihood. But people have called me &#8220;commercially naïve&#8221; because of it.</p>



<p class="wp-block-paragraph">Like I wrote further up &#8211; I’m not an entrepreneur. I’m good at helping other people solve their stuff, which makes me a good consultant. But running my own company still feels like a career risk to me. At the end of the day though, I like that my company reflects who I am, and I think the bigger risk would be for me to be someone I’m not.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/03/10/career-risks/">Career risks?</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/03/10/career-risks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ageing code</title>
		<link>https://lobsterpot.com.au/blog/2026/02/10/ageing-code/</link>
					<comments>https://lobsterpot.com.au/blog/2026/02/10/ageing-code/#comments</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 10 Feb 2026 00:58:53 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6344</guid>

					<description><![CDATA[<p>I’m pretty sure both spellings are fine, so don’t come at me for putting an ‘e’ in ‘ageing’. The interwebs tell me the version with the ‘e’ is preferred in England and Australia, so that’s what I’m going with. Now, as much as I’d like to wax lyrical about how English ages and changes over [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/02/10/ageing-code/">Ageing code</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I’m pretty sure both spellings are fine, so don’t come at me for putting an ‘e’ in ‘ageing’. The interwebs tell me the version with the ‘e’ is preferred in England and Australia, so that’s what I’m going with.</p>



<p class="wp-block-paragraph">Now, as much as I’d like to wax lyrical about how English ages and changes over time, and how people nowadays would’ve said “don’t @ me”, I’m going to fit into <a href="https://sqlasylum.wordpress.com/2026/02/03/t-sql-tuesday-195-how-has-your-code-aged/" target="_blank" rel="noreferrer noopener">Pat’s brief</a> slightly better and talk about code ageing &#8211; T-SQL code even!</p>



<p class="wp-block-paragraph">I could write about how new features in T-SQL can help, such as the NULL-aware &#8220;IS [NOT] DISTINCT FROM&#8221;. If you have code that uses the non-sargable ISNULL function on a column, then that might be something to consider when you next review that code. But I&#8217;m going to talk about T-SQL that can age badly because of more sneaky reasons.</p>



<p class="wp-block-paragraph">There’s a truth that I think many coders don’t really appreciate, and that’s that <strong><em>a T-SQL query is rarely good by itself</em></strong>. Sure, there are queries that have strong potential to be good, but performance depends on a few other things too. And this can mean that a query that was good when it was written might have become bad over time, even though it’s the same query it always was.</p>



<p class="wp-block-paragraph"><strong>Bad plans in the cache</strong></p>



<p class="wp-block-paragraph">One obvious example is when a bad plan has crept into the cache, and now every time that query runs, the bad plan gets chosen, and performance is now rubbish.</p>



<p class="wp-block-paragraph">Plans show us how the Query Optimizer has decided to run a query. And I&#8217;m saying &#8216;decided&#8217; to personify it a little. Of course it&#8217;s just maths, following a precise algorithm with heuristics to try to make the best choices, but at the of the day, as much as we know that there&#8217;s no arbitrary decision-making going on, it can really feel like there&#8217;s some tiny person in there, choosing to punish us for every mistake.</p>



<p class="wp-block-paragraph">One mistake that gives us a bad plan can be simply calling the query with a parameter that is rarely used but causes the query to run a very different way. That plan could get cached, and suddenly every subsequent call for that query (with more typical parameters) uses a less-than-ideal plan.</p>



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



<pre class="wp-block-code"><code>SELECT TOP (100) t.Col1
FROM SomeTable t
WHERE t.Col2 IS NOT DISTINCT FROM @p1
ORDER BY t.Col3 DESC;</code></pre>



<p class="wp-block-paragraph">There are two obvious ways that this query could run. One would be to apply a TopN Sort on the results of a Seek on Col2, the other would be to perform an ordered (backward) Scan of an index on Col3 with a residual Predicate on Col2. Which one is better? No idea. It depends on how selective the filter is. It also depends on whether particular indexes are available, although right now I&#8217;m going to assume there are covering indexes that could produce both plans, one on &#8220;(Col3) include (Col1, Col2)&#8221;, and one on &#8220;(Col2, Col3) include (Col1)&#8221;. And it depends on whether the SQL engine knows about the selectivity of different values (ie, the statistics). All this is where the strength of a query is not just about how the query is written, but about indexes, statistics, the cardinality estimate model, and more.</p>



<p class="wp-block-paragraph">If the table has 100M rows and 10% of them have the value we&#8217;re looking for, then the perhaps the best option is the ordered Scan. On average we might need to look through 1000 rows to find the top 100, if those values are mostly around the largest values of Col3.</p>



<p class="wp-block-paragraph">But what if only 0.001% of the rows have the value we&#8217;re looking for. A total of 1000 rows in the whole table. Now we&#8217;d be better off using a Seek to find the 1000 rows. But that Sort might need a large memory grant.</p>



<p class="wp-block-paragraph">And what if there are 10M of them, but they&#8217;re all around the smallest values of Col3&#8230; oh, the joys of query tuning.</p>



<p class="wp-block-paragraph">Maybe the value is usually selective, but every so often it&#8217;s not &#8211; maybe when it runs at 4am it uses a value which isn&#8217;t selective, so I&#8217;m willing to take the hit on performance, but during the day I want it to use the Seek + Sort plan. And usually this is fine, and there&#8217;s a cached plan that does the Seek + Sort that gets reused every time. Terrific.</p>



<p class="wp-block-paragraph">Then one night, there&#8217;s an index rebuild, and the next time the query runs it&#8217;s the overnight non-selective parameter. The compiler comes up with a plan which is good for that value, and it&#8217;s the ordered Scan plan, which gets cached. Then when users arrive in the morning, that&#8217;s the plan that gets used every time, and it&#8217;s slow. Agonisingly, it gets often (but not always!) fixed by restarting the SQL service, and let&#8217;s stop imagining how much pain organisations can get into when they start down these rabbit holes.</p>



<p class="wp-block-paragraph">Could we force the Seek? Sure. Should we force the Seek? That&#8217;s a tougher question. Maybe we need the overnight query to run better too. Maybe we need two queries. If the parameter value NULL is the only one which is non-selective, then making two queries is easy. We could test the value for NULL and then run a different query. That&#8217;d be easy to do. Or maybe it could be fixed by using the OPTION (RECOMPILE) hint, but that&#8217;s not exactly free either.</p>



<p class="wp-block-paragraph">Inside knowledge is great, but perhaps we didn&#8217;t have that knowledge when we wrote the query, and the code has aged badly because we didn&#8217;t anticipate the future.</p>



<p class="wp-block-paragraph">There are a bunch of other changes that can cause a perfectly adequate query to age poorly. Some quick examples:</p>



<p class="wp-block-paragraph"><strong>More data than expected</strong></p>



<p class="wp-block-paragraph">It doesn&#8217;t have to be a &#8216;bad plan&#8217; scenario for a query to be less good than when it was written, because conditions can simply change. The system was so popular than the amount of data grew and now some process takes a lot longer than before. The scan was fine, but now the table is a lot larger, and the values that we thought would be selective aren&#8217;t (or vice versa).</p>



<p class="wp-block-paragraph">Or maybe because the volume of data has increased, the number of physical reads is higher. Perhaps adding RAM is a simple solution, but maybe queries that were fast enough with full scans need to be rewritten.</p>



<p class="wp-block-paragraph"><strong>Better (!) estimates</strong></p>



<p class="wp-block-paragraph">Maybe the version has been upgraded, and the cardinality estimates are improved. The Optimizer used to think that 20 rows would be the results of a filter, but it was always wildly wrong, with 20,000 rows being more typical. Now with a later version of SQL, the estimate is correct, but because of this, there&#8217;s a join that&#8217;s using a Hash Match instead of a Nested Loop. Way fewer logical reads, but now it needs a larger memory grant to run the query, and system performance is hurting.</p>



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



<p class="wp-block-paragraph">Speaking of memory, maybe the concurrency requirements have increased. Maybe there are 100x as many as expected users trying to use the system at once, and those memory grants are causing a bottleneck. Maybe queries need to be tuned to discourage large memory grants.</p>



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



<p class="wp-block-paragraph">Maybe partitions have been introduced, and the indexes haven&#8217;t been reviewed.</p>



<p class="wp-block-paragraph">Or maybe a well-meaning DBA or external consultant (ahem!) has been brought in and a new index has been added to reduce the reads. Except that now some other query has started to use that index and although the Query Optimizer has good reason for choosing that index, it&#8217;s slower than it was before, or that query we&#8217;d tuned to reduce the memory has returned to its old patterns.</p>



<p class="wp-block-paragraph"><strong>So… what should we do?</strong></p>



<p class="wp-block-paragraph">Naturally what we need is a crystal ball, and write our queries (and our indexes, partitions, statistics, hints, whatever) according to how we expect when things have changed. Typically if you write with scale in mind, you won&#8217;t be impacted too much by scale.</p>



<p class="wp-block-paragraph">But also, understand that there will be some things that you can&#8217;t expect so easily. You can&#8217;t necessarily expect to anticipate that a particular index will be created, and I&#8217;m definitely not suggesting you force the use of a particular index from day 1 of your query, because the change might be about the shape of the data &#8211; something that was marvellously selective no longer is for example.</p>



<p class="wp-block-paragraph">The general feel of T-SQL code might not age as obviously as, say, .Net application code, with techniques that have been superseded over the years. Or a UI that that has aged like a trendy haircut. A lot has changed in the database world, but a T-SQL query now looks roughly the same as it did in the days of SQL Server 2005. But you should totally expect that a query you wrote in a small dev environment might behave quite different in production as the size and shape of the data increases.</p>



<p class="wp-block-paragraph">So don&#8217;t beat yourself up about it &#8211; just schedule a code review, or at least a good tuning session. There&#8217;s bound to be some things you can fix up, and maybe those fixes won&#8217;t age nearly so badly, because you have a better idea about how things will look in the future.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/02/10/ageing-code/">Ageing code</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/02/10/ageing-code/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Mistakes? Really, Louis? ;)</title>
		<link>https://lobsterpot.com.au/blog/2026/01/20/mistakes-really-louis/</link>
					<comments>https://lobsterpot.com.au/blog/2026/01/20/mistakes-really-louis/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 20 Jan 2026 00:14:42 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6336</guid>

					<description><![CDATA[<p>Louis Davidson is hosting this month&#8217;s T-SQL Tuesday, and asks us to relive mistakes. Ouch! It&#8217;s fine &#8211; I already had a psychologist appointment scheduled for later in the week. The name of this post &#8220;Really, Louis?&#8221; is nothing to do with how Louis thought for a number of years that Arnie Rowland was me. [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/01/20/mistakes-really-louis/">Mistakes? Really, Louis? ;)</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://drsql.link" target="_blank" rel="noreferrer noopener">Louis Davidson</a> is hosting this month&#8217;s T-SQL Tuesday, and <a href="https://drsql.link/2026/01/13/t-sql-tuesday-194-invitation-learning-from-mistakes/" target="_blank" rel="noreferrer noopener">asks us to relive mistakes</a>. Ouch! It&#8217;s fine &#8211; I already had a psychologist appointment scheduled for later in the week.</p>



<p class="wp-block-paragraph">The name of this post &#8220;Really, Louis?&#8221; is nothing to do with how Louis thought for a number of years <a href="https://www.red-gate.com/simple-talk/blogs/why-we-write-3-an-interview-with-rob-farley/" target="_blank" rel="noreferrer noopener">that Arnie Rowland was me</a>. But rather about how people (especially &#8220;conscientious types&#8221; <em>(that&#8217;s only &#8216;code&#8217; if you want it to be)</em> like so many of us in the data world) frequently take ourselves back through our mistakes, beating ourselves up about it, thinking about how we could&#8217;ve avoided it, what we could&#8217;ve done better (before, during and after), as if time machines could exist.</p>



<p class="wp-block-paragraph">I mean, sure, there&#8217;s a school of thought that because we learn through our mistakes, we become stronger. But you know, I&#8217;d rather learn through near misses. &#8220;Oh, that could&#8217;ve been bad, let me code up something so that doesn&#8217;t happen&#8221; is a better experience than having to learn when a disaster has actually happened. And hands up if you know that having a good &#8216;disaster recovery&#8217; plan only saves you from certain problems, not all problems&#8230; thank you, I see that hand. And that one. Yup. All the hands.</p>



<p class="wp-block-paragraph">There&#8217;s an article on Psychology Today called <a href="https://www.psychologytoday.com/us/blog/more-than-a-feeling/202412/coming-out-of-the-shadows-of-our-worst-mistakes" target="_blank" rel="noreferrer noopener">&#8220;Coming Out of the Shadows of Our Worst Mistakes</a>&#8220;, by Rodney Luster, PhD <em>(he has a blog called &#8220;More Than A Feeling&#8221; which has a lot of great posts and is worth looking at if you have mental health struggles)</em>. One of his points is that even a single mistake can heighten anxiety and depression symptoms. And still, we all make mistakes. All of us. Data professionals included.</p>



<p class="wp-block-paragraph">Our mistakes shouldn&#8217;t define us. We can quote Sting when he sings that &#8220;history will teach us nothing&#8221;, but we hope that each mistake makes us likely to fall into the same patterns that led us into trouble before. I heard something recently that says our histories might describe us, but they don&#8217;t define us. And I want to assure you, reader (and myself), that your history is more about successes than your failures. You wouldn&#8217;t be where you are today if you weren&#8217;t good at what you&#8217;d do. <em>(You would&#8217;ve been promoted into management instead.)</em></p>



<p class="wp-block-paragraph">As Dr Luster writes, our mistakes can cast shadows over us. Over our mental wellbeing. Over our general mood. We can feel guilt and shame about mistakes, and it can take proper effort to feel redeemed. As a Christian, I know that this is a major aspect of Christianity. The Bible says that we&#8217;ve been set free from our guilt and shame, and God loves (and likes) us despite our failings. And yet, we relive our mistakes. Especially the ones involving those areas in which we know we&#8217;re meant to do better. Where we&#8217;re supposedly &#8216;experts&#8217;.</p>



<p class="wp-block-paragraph">I&#8217;m not going to dwell on my mistakes today. Well, I&#8217;m not going to dwell on my mistakes any more today. I&#8217;ve already spent time doing that, even though I knew it wasn&#8217;t a good idea. I thought at some point in my life I would work out how to stop reliving mistakes, but that&#8217;s not a skill I&#8217;ve learned yet.</p>



<p class="wp-block-paragraph">I say to my clients, &#8220;Don&#8217;t worry &#8211; we&#8217;ve all done it&#8221;, and &#8220;You&#8217;re not a proper data professional until you&#8217;ve stuffed something up&#8221;. For some reason, I still remember a question in the Microsoft Certified Master that dealt with corruption, and (without going into any detail, because NDA, and because I really don&#8217;t remember the detail) failing to grab a copy of the database files first. That&#8217;s not a mistake I&#8217;d ever made with a corrupt database in the real world (and there had been plenty I&#8217;d handled &#8211; I think I had a reputation for fixing corruption, back when it was more common than nowadays), but in the exam &#8211; yeah, made the mistake. Maybe it was because it was an exam. Maybe it was because I was sitting by myself (not alongside a customer). That day in the exam, I found myself wanting those files (because of another mistake!), and didn&#8217;t have them.</p>



<p class="wp-block-paragraph">The consequence of my mistake in that exam was basically nothing. I passed the exam and earned my MCM status. Apparently I scraped through with the lowest passing score I could get. But I still passed. That corrupt database question didn&#8217;t matter at all. And yet, every so often, it appears in my thoughts. I wonder whether I would make that mistake again, perhaps in an environment where it would matter more. So you can imagine how much I relive the mistakes that actually count for something&#8230;  </p>



<p class="wp-block-paragraph">The mistake I&#8217;m going to relive for you/Louis is the mistake of reliving my mistakes, as I&#8217;ve been describing. I know it sounds meta &#8211; but I learned recently that &#8216;meta&#8217; is the Portuguese word for &#8216;goal&#8217; (not the football goal, but the thing you&#8217;re trying to achieve), so maybe it&#8217;s okay that it&#8217;s meta. It&#8217;s a useful goal to stop reliving your mistakes, even if it is meta.</p>



<p class="wp-block-paragraph">My advice to you is to learn forgiveness. Forgive everyone else their mistakes. It&#8217;s easy to forgive people their mistakes because, by definition, they&#8217;re unintentional. So do that, and get used to doing that. Then work out how to forgive yourself for your own.</p>



<p class="wp-block-paragraph">&#8230;and teach me how to do it&#8230; 😉</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://lobsterpot.com.au/blog/2026/01/20/mistakes-really-louis/">Mistakes? Really, Louis? ;)</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2026/01/20/mistakes-really-louis/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Notes to self&#8230;</title>
		<link>https://lobsterpot.com.au/blog/2025/12/09/notes-to-self/</link>
					<comments>https://lobsterpot.com.au/blog/2025/12/09/notes-to-self/#respond</comments>
		
		<dc:creator><![CDATA[Rob Farley]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 01:14:38 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://lobsterpot.com.au/?p=6326</guid>

					<description><![CDATA[<p>Mike Walsh from StraightPath wants us to write two short notes to former selves. One writing now to ten years ago (2025 me to 2015 me), and one writing what we imagine a future self would write to us now (2035 me to 2025 me). In 2019 there was a &#8220;letter to 20-year-old me&#8221; post, [&#8230;]</p>
<p>The post <a href="https://lobsterpot.com.au/blog/2025/12/09/notes-to-self/">Notes to self&#8230;</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Mike Walsh from <a href="https://straightpathsql.com" target="_blank" rel="noreferrer noopener">StraightPath</a> wants us to <a href="https://straightpathsql.com/archives/2025/12/t-sql-tuesday-193-a-note-to-your-past-and-a-warning-from-your-future/" target="_blank" rel="noreferrer noopener">write two short notes to former selves</a>. One writing now to ten years ago (2025 me to 2015 me), and one writing what we imagine a future self would write to us now (2035 me to 2025 me). In 2019 there was a &#8220;<a href="https://lobsterpot.com.au/blog/2019/06/11/a-letter-to-a-former-me/">letter to 20-year-old me</a>&#8221; post, but that was different. Twenty-year-old me didn&#8217;t know about the significance of data or of the technical community, hadn&#8217;t started a career yet, was still at university&#8230; whereas today&#8217;s post is writing to someone who&#8217;s a lot like current me, just without the last ten years. And imagining what a version of me in ten years&#8217; time would say. Hmm.</p>



<p class="wp-block-paragraph">I&#8217;m in a business leaders group called <a href="https://www.vistage.com/" target="_blank" rel="noreferrer noopener">Vistage</a>. In Australia it used be to called TEC (I&#8217;m quite happy about the rebranding because &#8220;TEC&#8221; sounds like &#8220;tech&#8221;. Plus each group has a chair, and &#8220;TEC Chair&#8221; sounds a lot like &#8220;deckchair&#8221; to me). Anyway, when there&#8217;s a discussion going on, my Vistage chair sometimes says, &#8220;If you knew the answer, what would it be?&#8221;, which comes from Sir John Whitmore&#8217;s book &#8220;Coaching for Performance&#8221;.</p>



<p class="wp-block-paragraph">It&#8217;s an annoyingly good question because it shifts the perspective a little. It&#8217;s not just asking what the answer is (to which &#8220;that&#8217;s the problem &#8211; I don&#8217;t know!&#8221; is a common response), it&#8217;s asking the person to imagine a situation where they already know. It subtly creates courage in the responder, because they&#8217;re asked to imagine that they know and that what they know is correct. I say it&#8217;s &#8220;annoyingly good&#8221; because it&#8217;s essentially using mind games to get us to move us past not knowing.</p>



<p class="wp-block-paragraph">Mike&#8217;s asking us to write a note to ourselves from ten years in the future is framed similarly. He wants us to imagine a world in which we&#8217;ve got through the next ten years, and we now have the benefit of hindsight. He wants us to look back at 2015 with hindsight, to point out that a thing we were going through at the time would work out okay (or maybe the opposite), and then give ourselves similar advice about the thing we&#8217;re in now. Essentially, he&#8217;s asking, &#8220;If you knew you were going to be successful, what would you do/feel differently?&#8221; He wants us to prod ourselves into action about something in the world.</p>



<p class="wp-block-paragraph">For me, I&#8217;ve just turned 51. I remember turning 31 and finding it&#8217;s still one of the more jarring age-changes I&#8217;ve had. Something about changing from &#8220;thirty&#8221; to &#8220;thirty-something&#8221; felt like I had entered a different phase of life, and I&#8217;m trying not to feel similar this year now that I&#8217;m &#8220;fifty-something&#8221;. Looking back at being 41, and imagining what it might be like to be 61, it&#8217;s interesting.</p>



<p class="wp-block-paragraph">Ten years ago the world felt like it was changing quickly. And now it feels like it&#8217;s changing even quicker. In another ten years, I suspect the rate of change will not have slowed at all, although there is a significant chance that a breaking point might have been reached along the way. Ten years ago we had no idea of the events that were coming. Australia had seen five changes of Prime Minister in the previous ten years, but despite only having two more changes since then, the impact of fires, lockdowns, and other global events have made the world seem vastly different.</p>



<p class="wp-block-paragraph">My advice to 2015 me is to ride with the big waves and to not sweat the small ones. I don&#8217;t think I did let the small waves knock me around, but I know there were times that were harder than I&#8217;d like. I&#8217;m still here though! Data is still data, whether the tools change, or the trend is towards or away from relational, or whether we&#8217;re working on-site or remote. Basic needs of society are still the same, and businesses still need their data to be good, insightful, and well-looked after. New ways of doing things might change the day-to-day activity, and people might be dealing with jarring stresses from the world more than ever, but the core needs of society and data-focused businesses are mostly unchanged. </p>



<p class="wp-block-paragraph">I suspect I&#8217;ll feel similar in 2035 looking back at now. I have no idea what will happen in those ten years. AI is bringing change, bringing new tools (<a href="https://lobsterpot.com.au/blog/2025/08/12/ais-impact-on-careers/" target="_blank" rel="noreferrer noopener">as I wrote in August</a>), but I don&#8217;t think it will change what people or businesses need &#8211; just how we deliver them. People still need people to be there for them, and businesses still need to trust their data and have insight into it. This year I passed 20 years of running the user group in Adelaide, and in another 10 years I might have just gone past 30 &#8211; which will be just about half my life by then. The pandemic caused a lot of change to community, and even within the local user group things feel different now to then. But people do still need community, and I will try to help make that happen, whether that&#8217;s in the technical community, the comedy community, or the church community.</p>



<p class="wp-block-paragraph">So the advice I&#8217;m going to give myself from the future is to make the right decisions. Keep doing the things that I should be doing, and find the right balance between pushing myself and going easy on myself. Tonight is a case in point &#8211; my back is sore, but it often is so I shouldn&#8217;t let that stop me going out to Monday night open-mic comedy. I haven&#8217;t been in a long while, but I need to get that back into my weekly schedule.</p>



<p class="wp-block-paragraph">If current me knows things are going to work out, what will I have been doing to help that? Yeah &#8211; doing those things that I know are what I should be doing. I&#8217;m pretty sure hindsight will thank me for making those good decisions.</p>



<p class="wp-block-paragraph"><a href="https://bsky.app/profile/robfarley.com" target="_blank" rel="noreferrer noopener">@robfarley.com@bluesky</a> (previously <a href="https://twitter.com/rob_farley" target="_blank" rel="noreferrer noopener">@rob_farley@twitter</a>)</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://lobsterpot.com.au/blog/2025/12/09/notes-to-self/">Notes to self&#8230;</a> appeared first on <a href="https://lobsterpot.com.au">LobsterPot Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lobsterpot.com.au/blog/2025/12/09/notes-to-self/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
