On March 23rd, I’ll be the guest of honor at the first SQLFriends Lunch in Chicago. For just $30, you get lunch at Buca di Beppo on Rush Street plus two hours of talking about SQL, virtualization, blogging, consulting, the MCM program, you name it.
And you really do name it – on the SQLFriends registration form, there’s a spot to put in the questions you want answered. I’ll get a copy of those, and I’ll come armed with things vaguely resembling answers.
This is a refreshing change of pace from user groups and presentations. Here’s your chance to ask me anything in a friendly, relaxed environment and get insight from your peers. Network with the kind of people who find me interesting – believe it or not, you’re not the only one. (There’s also my mom.)
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
There’s beauty everywhere – even in SQL Server. I was just staring at this plan when I was struck by its beauty:
Stored Procedure Part 1
Oh, sure, it’s ugly, and I recoiled in horror at first, but when you get over that reaction, there’s an amazing amount of stuff there. Someone – probably many someones – poured every waking moment of their life into building a query that does a staggering amount of stuff. Then under that, SQL Server had to churn away to interpret all that text, look at the database, and decide how to execute this work. All of that isn’t just man-hour – it’s man-decades, all distilled into one giant array of elbow lines. One screen doesn’t even begin to capture it. Let’s look at another view of that same plan:
Stored Procedure Part 2
It’s like a Mark Bradford piece, one of his giant collage mashups of aerial maps – you just can’t appreciate it until you see the plan in life size, scrolling around in all its sprawl. Once I saw execution plans as art, I went looking for pleasing patterns, and they were everywhere.
Parallel Parallelism
Repeated rows of parallel parallelism become little armies marching in formation. Who cares if the work looks redundant? Why tune the query? Praise the developer for their artful design.
Plumbing the Depths
Lines of loops become fishermen casting their lines into the bottom of the execution plan, dragging up data from the deep. The execution plan turns into a statement about religion: these fishers of data work diligently, raising up information to the highest power – the end user.
The Darkness Begins
Familiar enemies come to life as villains, bringing conflict to the art. Curses, cursors!
Wiping the Slate Clean
Everyone wants a fresh start. The artist tells of wiping the slate clean before starting anew, but thanks to the foreshadowing lines to the left, we all know how this will end – badly. The strife begins again with each call of the query, struggling against itself.
Printing Pinstripes
Artists love to make prints, don’t they? Some queries fancy themselves as artists, printing their own works of mysterious art. What do they produce? Why are the lines so long? Seeing the plan through this small frozen window leaves the viewer wanting to know more. Sometimes, though, you take one look at a plan and you don’t want to know any more whatsoever:
X Marks the Spot
Even SSMS can’t handle the zoom-out feature on this particular work of art. It cries out for mercy with a blood-red X, signifying that it’s been wounded. Everything is mortal, even software. Ain’t art grand?
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
Right now, this very moment, there’s an ugly piece of work tapping on your shoulder – and I don’t mean your boss.
Or bacon. Bacon works too.
You agreed to do it months ago during the 2012 planning sessions, but you never really expected January 2012 to arrive. Now that it’s here, you’re starting to get nervous because you’ve never done it before and you’re not quite sure where to begin.
I’d like to help.
I believe I can’t be successful unless other people around me are successful, and that means you. I also believe that if there’s anything out there I haven’t done before, I bet either somebody I know has done it, or a few other readers have. Between all of us, we can figure it out. In the year 2012, there’s no need for you to feel alone going up against anything. Whether it’s implementing replication, fixing a performance problem, getting your blog back on track, losing weight, or beating cancer, we’re here for each other.
Leave an anonymous comment describing the work that scares you. We (and by we I mean the internet) will talk about our first time doing it, what we wish we’d have known when we did it, and our favorite getting-started resources.
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
Hi! I’m your SQL Server. I know you don’t usually listen to me, so I’ve decided to take a drastic step and find you where you spend all your time – Brent’s blog. Seriously, you need to spend less time on the intertubes and more time on the error logs. You’re lucky this post is about me, not about you, or else I’d also have to divulge the fact that you installed Adobe Flash on my desktop. Whoops, I just did.
Resolution 1: Keep in Touch with Loved Ones
Bad things have been happening to me all year long, but I’ve been keeping it secret from you. It’s time you and I were more honest with each other. To do this, I want you to write your name in my heart – and by that I mean, set yourself up as my operator. The below script sets you up as an operator and sends you alert emails whenever bad things happen. Before you run it, make these two changes:
Change YourEmailAddress@Hotmail.com to your actual email
Change 8005551212@cingularme.com to your actual phone’s email address (look up your provider)
Over the years, I’ve eaten a lot of bad stuff. It’s time to do a little cleansing ritual to purge myself. People have dumped in heaps of temporary backup tables that never got queried again. Here’s a modification of Jason Strate’s query to find heaps – this one just looks for heaps (tables without clustered indexes) that haven’t been accessed since the last server restart (or database restore/attach). Run it in my largest or most important databases:
SELECT SCHEMA_NAME(o.schema_id) AS [schema]
,OBJECT_NAME(i.object_id) AS [table]
,p.rows
,'EXEC sp_rename ''[' + SCHEMA_NAME(o.schema_id) + '].[' + OBJECT_NAME(i.object_id) + ']'', ''[' + SCHEMA_NAME(o.schema_id) + '].[_ToBeDropped_' + OBJECT_NAME(i.object_id) + ']''' AS ScriptToRename
,'DROP TABLE ''[' + SCHEMA_NAME(o.schema_id) + '].[' + OBJECT_NAME(i.object_id) + ']''' AS ScriptToDrop
FROM sys.indexes i
INNER JOIN sys.objects o ON i.object_id = o.object_id
INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
LEFT OUTER JOIN sys.dm_db_index_usage_stats ius ON i.object_id = ius.object_id AND i.index_id = ius.index_id
WHERE i.type_desc = 'HEAP'
AND COALESCE(ius.user_seeks, ius.user_scans, ius.user_lookups, ius.user_updates, ius.last_user_seek, ius.last_user_scan, ius.last_user_lookup) IS NULL
ORDER BY rows desc
These heaps are slowing down my backup times, my DBCC times, and my 100 meter sprint times. We can make some quick judgment calls based on table names – if they’re names like Sales_Backup2009BeforeDeployment, it’s probably a table someone made once as a backup – and then forgot about it. We could either rename them temporarily and then drop ‘em in a few days, or just drop ‘em outright. Standard warning about deleting data, blah blah blah. (Hey, my resolution wasn’t to be more cautious.)
Resolution 3: Lose Waits
Users love me, and they show it to me by feeding me huge dinners of data. I love my life, don’t get me wrong, but sometimes I see those new guys with their solid state drives and their 512GB of memory, and I think, wow, they must be able to handle anything. I’ll never be that well-endowed, but there’s still some easy things I can do to get in better shape. Right now, I’m in heart attack territory, and it’s time to fix that.
I’ll start by working out with Brent Ozar and Buck Woody, watching this video where Brent is dressed up like Richard Simmons. It’s an oldie but a goodie, and it’s better than being seen in public with a ShakeWeight.
Now, weren’t those resolutions easy? What, we’re not done yet? You haven’t run the scripts? What the hell, you lazy meatbag? I can’t pull this off by myself – I need you to do ‘em. What do you think this is, the cloud? And wasn’t one of your resolutions this year to make sure the boss doesn’t think the cloud is better than us? Hop to it before we lose our jobs.
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
Happy holidays! Santa SQL comes bringing tidings of cheer with a new sp_Blitz – but also doom and gloom about configuration problems in your servers. Here’s some of the recent contributions from readers:
John Miner suggested tweaking checkid 48 and 56, the untrusted constraints and keys, to look for is_not_for_replication = 0 too. This filters out constraints/keys that are only used for replication and don’t need to be trusted.
Ned Otter caught a bug in the URL for check 7, startup stored procs.
Scott (Anon) recommended using SUSER_SNAME(0×01) instead of ‘sa’ when checking for job ownership, database ownership, etc.
Martin Schmidt caught a bug in checkid 1 and contributed code to catch databases that had never been backed up.
Added parameter for @CheckProcedureCache. When set to 0, we skip the checks that are typically the slowest on servers with lots of memory. I’m defaulting this to 0 so more users can get results back faster.
Andreas Schubert caught a typo in the explanations for checks 15-17.
K. Brian Kelley added checkid 57 for SQL Agent jobs set to start automatically on startup.
Added parameter for @CheckUserDatabaseObjects. When set to 0, we skip the checks that are typically the slowest on large servers, the user database schema checks for things like triggers, hypothetical indexes, untrusted constraints, etc.
David Tolbert caught a bug in checkid 2. If some backups had failed or been aborted, we raised a false alarm about no transaction log backups.
Fixed more bugs in checking for SQL Server 2005. (I need more 2005 VMs!)
Ali Razeghi added checkid 55 looking for databases owned by <> SA.
Fixed bugs in checking for SQL Server 2005 (leading % signs)
Whew! And there’s more to come – I’ve got another half-dozen improvements queued up that also require new web pages, so those will take a little while longer.
If you’ve already downloaded sp_Blitz, you can run master.dbo.sp_BlitzUpdate to fetch the latest version from The Clouds. Enjoy!
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
A few weeks ago, Microsoft announced that SQL Server 2012 will no longer be licensed by the CPU socket, and will instead be licensed by the core. You can read more at Microsoft’s recap or Denny Cherry’s analysis.
After contemplation and discussing the issues with companies, I think of this as a few related announcements.
SQL Server is getting more expensive overall.
This shouldn’t come as a surprise to anybody: good things get more expensive over time, and crappy things get cheaper. This change simply doesn’t affect me because I’ve never paid a single penny for SQL Server myself anyway, and I don’t plan to start now. If I had to pay my own money for a database platform, I’d have switched to PostgreSQL long ago.
When I talked to my clients about this change, they all had one of two reactions:
“OMG, THIS IS UNBELIEVABLE!” These people were more worried about their individual careers than their budgets: DBA managers wanted to know if SQL Server would start waning in popularity, thereby reducing the value of their skills. (If the high salaries of Oracle DBAs are anything to go by, bring on the licensing price increases.)
“No big deal, but no new 2012 projects next year.” These people understood that they were already licensed for their existing servers anyway, and only their ongoing maintenance fees would be impacted. However, they immediately crossed Availability Groups off their list of 2012 projects, and that really sucks for me. I’d been so excited about the ability to scale out with multiple read-only replicas, but the pricing just makes this a no-go for most of my clients. Between the licensing changes and the traditional hesitation to deploy before Service Pack 1, 2012 is dead in the water for them.
Nobody decided to throw SQL Server out of the shop altogether, but some of them did start asking tough questions about their future projects. It’s really hard to hire a good production SQL Server DBA right now (email us your resume if you’re looking in the Chicago, Los Angeles, or Portland areas, but no remote workers) so many of our clients are running understaffed. One client said to me, “As long as I’m relying on outsiders for my database administration, what difference does it make whether it’s MSSQL, Oracle, DB2, Postgres, or the cloud?”
SQL Server used to be seen as the middle ground between expensive-but-awesome Oracle and free-but-limited open source. Those days are gone – SQL’s pricing is higher, and open source platforms have gotten pretty darned good.
Limits kick in quickly on Standard Edition.
Standard Edition’s limits haven’t really changed significantly – but today’s hardware has, and Standard Edition isn’t keeping up. If you’re struggling with application performance on Standard and you survive by throwing hardware at the problem, your options run out once you hit 16 cores and 64GB of memory. At that point, you have to throw hardware and licensing at the problem by upgrading to Enterprise Edition.
I don’t think 16 CPU cores is really all that limiting. CPU-intensive SQL Server queries tend to be the easiest ones for me to tune, and I’ve always argued that database servers aren’t app servers anyway. The core-based licensing change just gives me more ammo to tell developers not to do string processing in the database server.
While 10-core Xeon CPUs are already available, they’re not typically deployed in 2-socket configurations. You can technically buy a 4-socket box like the HP DL580 and populate it with 2 10-core CPUs, but that config just doesn’t make sense for Standard Edition due to the high cost. With Intel’s upcoming tick/tock roadmap, the next couple of Xeon families are still slated to be in the 6-10 core range, so I don’t think the 16-core limitation is going to have a dramatic impact in 2012/2013.
The 64GB memory limitation, on the other hand, is frustratingly small given today’s memory prices. 32GB of server memory runs around $1,000, and memory can hide a lot of sins. Standard Edition just doesn’t let you hide sins – you’re forced to spend manpower to keep tuning applications, and unfortunately, that’s not an option with third party applications. I do a lot of work with independent software vendors (ISVs), and they’re frustrated that their customers can’t just buy $1,000 worth of memory to get awesome performance quickly.
There’s an opening for DBAs who love performance tuning.
It’s just you and me here, so let’s be honest: I make money when companies are in pain, and SQL Server’s licensing changes will inflict some pain. Companies can’t just throw more CPU or memory at the problem anymore without writing a big check to Microsoft for additional licensing. As a consultant, I can say, “I’ll fix that problem for less money than Enterprise Edition costs, let alone the cost of a server with more CPU sockets.”
If Microsoft had raised the 64GB memory limit, then companies could afford to mask problems longer by throwing memory at the problem. They can’t, so I win.
The bummer for me is that I just can’t make the math work for scaling out with Availability Groups now. I was really, really hoping for a lower-tier license cost for the read-only replicas (after all, they only support a subset of the work) but the cost to run a 5-node Availability Group is staggering. Even if we use just 2-socket, 6-core servers across the board, that’s $412,440 of licensing – simply unthinkable, even if we throw in discounts. It kills me, because I’m a huge fan of this feature, but right now companies have to be under tremendous pain in order to write a check that large to scale one application. It’s just easier to tune SQL Server, and that’s where I come in.
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
When Ronald Reagan said, “Trust, but verify,” he was talking about DBAs working with their VMware sysadmins.
"Trust, but verify." Ronald Reagan
As a consultant, I get to see a lot of SQL Server implementations – both successes and failures. The successes have one thing in common: transparency. The database administrators, VMware admins, and storage admins have clear, open discussions about the way their respective systems are configured. They give read-only access to other teams so everyone can double-check to make sure everything is working well. After all, these teams share a common goal – fast, reliable applications for end users.
You can easily get read-only access to the VMware vSphere Client, the tool VMware admins use to manage your virtualization environment. Here’s how:
1. Walk over to your sysadmins and show them this blog post.
This is the hardest step in the entire process.
The rest of the steps are simple and predictable: click a button, get a result. This step, however, involves complex, unpredictable meatbags. Soft skills are the hardest one to master, and finessing this is outside of the scope of this particular article. Start by brushing up with my Consulting Lines series.
You need to walk over there because you’re asking for access into their domain. This implies that you don’t trust them. You do, but like Reagan said, you just need to verify.
2. Open VMware vSphere, Home, Hosts and Clusters.
The vSphere Client is a thick front end that connects to Virtual Center, a service that keeps an eye on your hosts and guests. In the vSphere Client, click Home, Hosts and Clusters. Here’s a screenshot of what you’ll see:
VMware vSphere Client
On the left side, click on the thing you want access to – which brings up the first question for your VMware admins: what do you need read-only access to? Your VMware sysadmins may have built a separate cluster just for SQL Server use, or your VMs may be intermingled with other virtual machines.
On the right side, click the Permissions tab, right-click, and click Add Permissions.
3. Add the DBA domain group.
In the Add Permissions popup, click Add. In the dropdown for domain, choose your Active Directory domain, and in the Users and Groups dropdown, click Show Groups First. Your screen will look like this:
Active Directory Groups in VMware
In my lab, I’ve created an Active Directory group called “Database Administrators” that includes me, Jeremiah, Kendra, and Tim. That way, anytime I need to grant additional permissions for the DBAs (like when I build a new SQL VM that they’ll need to administer), I can just use that domain group instead of individual user accounts.
Click your own DBA group’s name, click Add, and click OK. On the right side of the Assign Permissions window, the Read-Only permission will be defaulted, and that’s fine – click OK. Presto, you’re in.
If you click on child objects in the left tree (like one of your SQL VMs) and click the Permissions tab, you’ll notice that your read-only permissions have propagated to this object too.
4. Install the VMware vSphere client on your desktop.
The client is a free download from VMware.com as part of other products, but the easiest way to get it is to simply point your web browser at one of your in-house VMware hosts. In my lab, here’s what that looks like:
Downloading vSphere From Your VMware Host
Click the Download vSphere Client link and the installer will come flying through the tubes. Yes, the installer includes Visual J#, and yes, I laugh at that too.
5. Launch the vSphere Client and start poking around.
After the installation finishes, double-click the VMware vSphere Client icon. You’ll need to enter the name or IP address of your Virtual Center server – ask your sysadmins for that. Check the box labeled “Use Windows session credentials,” and thanks to the magic of Active Directory, you’ll be poking around in virtualization in no time. (Actually, it takes about 30 seconds to launch the dang thing.)
To learn what you’re looking at, consider watching my Tuning SQL Server on VMware session:
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
Denny’s a jack of all trades, and a Microsoft Certified Master of SQL Server to boot. I’ve had the pleasure of knowing Denny for a few years, and he’s on the short list of people who I’d trust with my server password list. (I wouldn’t trust him with my laptop password, though, because he’s got a wicked sense of humor.) When Denny first told me he was writing a security book by himself, I asked him why – it seemed like such a dry topic. Amazingly, Denny was able to bring this material to life in a friendly, readable way.
It’s easy to recommend this book for companies that store financial, medical, or personally identifiable data in their databases, but going beyond that, I think every company with a multi-DBA team should have a copy of this book on their bookshelf. A lot of my clients ask questions that are answered well in this book, and this book is way cheaper than a HIPAA/PCI/SOX audit.
If you’re a solo DBA at a shop, I probably wouldn’t recommend this book, though. The topics covered in this book take time to implement, and they’re usually beyond the scope of what a single person has the time to do when they’re firefighting. Yes, I wish all our databases were secure, but solo DBAs probably need to start with more basic security concepts such as how to configure service accounts, and that’s not covered here. This focuses on senior DBA level knowledge.
Troubleshooting SQL Server by Jonathan Kehayias and Ted Kreuger Paperback
Jonathan and Ted are forum monsters: they’re constantly patrolling user questions looking for ways they can help. As a result, they’re well-versed in the typical problems DBAs face and the best ways to solve those problems. They’ve compiled the results into a book. The book reads like a very polished forum answer: if you’ve got a CPU problem, turn to Chapter 3. You’ll learn what tools to use to diagnose the issue, the most common problems, and the best solutions.
Jonathan was one of the coauthors on Professional SQL Server 2008 Internals and Troubleshooting (Paperback – Kindle), and at first glance, it might sound like those two books are similar. This book is different because it takes a problem-and-solution approach, whereas our Pro 2008 Internals teaches the reader about internals first, then explains troubleshooting tools you can use to look under the hood. I’d say that Troubleshooting SQL Server is a faster approach to getting ‘er done, and I’m adding it to my list of recommended books for SQL Server DBAs.
SQL Server 2008 R2 Administration Cookbook by Satya Shyam K Jayanty Paperback – Kindle
Lemme just start out by saying that I don’t like posting negative reviews. I first received a review copy of this, marked it up, and emailed the publisher and author with a list of questions. Despite a long dialog, I never got answers to the technical issues, so I tossed the book in the closet. I wouldn’t have posted this review, but I noticed a disturbing number of five-star reviews for the book on Amazon. It wouldn’t be fair for me to let people spend their money on this, because by buying it and following the advice, they’re hurting their SQL Servers.
Here’s a few examples of the advice:
P335 – in a section on designing maintenance tasks in a mission-critical environment, the reader is instructed to check maintenance plans for reorganize indexes, rebuild indexes, and update statistics. This is the worst approach possible for a mission-critical environment: it will do all three tasks against every index in the database, every time. If we absolutely had to use this approach, we could accomplish the same thing by simply rebuilding all indexes, but again, even that is a bad idea in a mission-critical environment. It even tells the reader to create separate schedules, but doesn’t say how or when these tasks should run.
P361 – “Place transaction logs on RAID5 rather than RAID1+0 for sequential workloads.” Not true, as Microsoft documented in Table1A of this doc.
P360 – in a section on building a scalable server: “…edition-wise it must be either DataCenter or Enterprise edition to host production data.” What, Standard isn’t good enough for production?
P70 – in the wait stats troubleshooting query, useless wait stats aren’t filtered out. The example screenshot shows that the server is bottlenecked by SQLTRACE_INCREMENTAL_FLUSH_SLEEP, XE_TIMER_EVENT, and FT_IFTS_SCHEDULER_IDLE_WAIT, none of which are wait events that a DBA should spend time investigating. Contrast this with the well-thought-out, production-tested queries in Troubleshooting SQL Server, and it’s pretty disappointing.
P360 – “Configure the storage and memory L2 cache per CPU has a minimum of 2 MB to improve memory.” There are so many grammatical and technical errors here I don’t even know where to begin.
To top it all off, many of the book’s sample queries simply don’t work – keywords are mashed together with no spacing, like page 69′s “SELECTTOP” and “CROSSAPPLYsys”. Ouch.
Needless to say, I don’t recommend adding this book to your collection, but if you’re itching for holiday reading, check out my recommended SQL Server book list.
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.
The NOLOCK hint: we all use it sometimes, and some of us use it almost all the time. In this session Kendra Little shows three phenomena which will cause you to look differently at the NOLOCK hint. If you have two years of experience working with TSQL and database structures, this session is for you.
Kendra specializes in high availability and performance tuning. She is a Microsoft Certified Master in SQL Server-- the highest technical SQL Server Certification available. Kendra loves databases and software development more than long walks on the beach. Those cartoons in her blog posts? She draws 'em all. Read more and contact Kendra.
My new sp_Blitz stored procedure helps you take over SQL Servers, identify risks, and build an inventory of what needs to be fixed. Here’s the video from our Tech Tuesday Triage webcast series this week when I explained how to use it:
In the sp_Blitz output, I include a link to learn more about each problem on your server. Thanks to the magic of web site analytics, I can see the most popular issues.
Single-Use Plans in the Procedure Cache – just one isn’t a problem, of course, and the severity of the problem is based on the number you have and the size of memory they take up. Those numbers are listed in the sp_Blitz output.
Triggers Found on Tables – no surprise there because this was one of the reasons I first started writing my Blitz scripts. My developers were troubleshooting problems with insert/update statements and had no idea someone else had written a trigger to modify their data.
Those are just five of the checks – and there’s already over fifty. If you’d like to add a check, email me with your script and the permission to use it, and I’ll add it into sp_Blitz too.
Brent specializes in performance tuning for SQL Server, VMware, and storage. He's one of the very few Microsoft Certified Masters of SQL Server, a published author, and a Microsoft MVP. He likes travel, Jeeps, Apple gear, jokes, and writing about himself in the third person. Read more and contact Brent.