I’ve worked with developers who write terrible, extremely questionable, queries. I’ve said many times over the course of my career, “That’s a bad query.” You know the saying about there not being any bad dogs, right? Only bad owners? What if that’s true for queries? What if there are no bad queries, just bad environments for queries, or bad data sets for a certain query, or a bad plan for a good query? Maybe it’s about the data/query/environment interaction more than the query itself?
As with everything SQL, I started thinking about that in the context of psychology…
Psychology tells us the individual both evokes and provokes the environment (including others in the environment) in which it finds itself (person-environment interaction). However, there is an even cooler concept (that freaks me out a bit), that we self-select environments that we are in. Meaning…we choose the shit storm we blame for our unhappiness.
Pardon me for a minute.
The asshole coworker? Not your fault, right?
Well, not so fast.
Let’s weave these together.
What if you have a query that runs great on a table with 10 rows? And then you move it to prod where there are 2.8 billion rows? What if it is on a laptop with 1gb of RAM allocated to SQL? What if it’s also running 85 other things just then?Bad query, or bad environment? Both is an option, too, of course. (If you said “bad dev environment,” you get a gold star!) What if you add indexes? What if you update statistics? What if you switch to columnstore? What if you put it on a grown-up server? What if you add a ton of RAM? What if you cache the table? What if you make the table in-memory? These could all be said to be environmental design to improve execution of the query because you’ve changed nothing with the query itself.
This is what happens to DBAs a lot. Queries come to us and are not able to be edited (third party software, grumpy developers, whatever). We then set about tying ourselves into knots to create an environment where that “bad query” can thrive.
People are like this, too, I feel. Sure, there are “bad” humans. Serial killers, for one come to mind. Narcissists are another. However, the vast majority of people mean to do their best. We try hard, maybe not for all the right reasons, but very rarely do most people set out to do harm to others. Some environments, some people in those environments, generate such a reaction in the individual that the literal worst comes out of them. Sometimes this means people need to remove themselves from harmful environments (or better yet, the toxic people should be removed), but other times (just like query tuning) environmental design can make a huge difference.
How can we go about improving a poor interaction? It’s the same process as for query tuning, actually. Observe. Detect patterns. Here you have two options (just like with SQL Queries):
Work backwards to find root cause, address root cause.
Take a stab at what you think might help (up the RAM!), observe again, record the results. Then tweak and try again. Sometimes you make the interaction worse, sometimes better. All results inform our future choices.
I’ve recently had the opportunity to observe a couple of significant workplace behavioral issues. Where I used to get extremely upset, I’m now able to observe and say, ok, what’s the pattern here? Sometimes what I come back to is yet another concept in Psychology that we are most disgusted by traits in others that we have and hate about ourselves. Having spent a long time in therapy, and worked through a lot of cognitive distortions, when I see them in others it’s like a huge sign flashing over their heads. The interesting thing is, I will feel dislike way before it clicks why.
So, let’s bring it back to what I said earlier…we self-select our environments. If I accept a job only to find out later I clash with someone, the question I ask myself is…Why did I choose that job over others without team members with this characteristic? Then I ask, “What in me has that trait that I’m not in touch with?” Finding yourself in a person-environment interaction that triggers all your vulnerable spots should be an invitation to understand those places on a deeper level.
Sometimes fixing a bad query (or person-environment interaction) is about environmental design. You leave the bad job, you beef up your server, you defrag your indexes…whatever it takes. Sometimes it’s about rewriting the query, though. You look at how you can get more efficiency out of the TSQL and reduce I/O. Sometimes you look at your own issues and how they evoke and provoke others.
Sometimes, it’s all of the above.
When you can rewrite the query, update statistics, and add more RAM, you do.
When you are able to extract yourself from unhealthy environments AND leverage those experiences to understand why you self-selected such a situation, why you stayed in such a situation for any length of time, and what you can do in the future to handle it differently…you do. You rewrite your own damn query.