Monthly Archives: March 2011

Dealing with Presentation Criticism

I just had a champagne moment.

Outlier.

Dozens of good feedback forms, and one not-so-good one.

Scott Adams (the creator of Dilbert) blogged about having these champagne moments in his life, times when he was almost-but-not-quite-ready to pop the champagne open because he still wanted to take things higher.  My standards aren’t quite so high – I recognize certain achievements as being champagne-worthy, and this is one of ‘em.

My presentation at SQLSaturday Chicago last weekend was probably one of the best presentation experiences I’ve ever had. To explain it, I need to step backwards through time starting with a pile of feedback forms.  I’ve got a little stack of papers on my desk (pictured at right) from dozens of attendees.  When I review feedback, I break it into two piles: good comments and bad comments. The pile on the left?  All good.  I got one and only one piece of negative feedback:

“Just OK. Only theory. Need to be more in depth and practical session.”

I can live with this because every single part of it is incorrect.  Sounds horrible for me to say, but bear with me and I’ll break it down:

  • “Only theory” – nope, I’ve lived all of these lessons, and there’s nothing in this deck that I haven’t validated via experience.
  • “Need to be more in depth” – I can’t go into more depth when the session is only an hour long. The only way to go into more depth is to reduce the number of topics covered, and the abstract specifically explained the number of topics that would be covered.
  • “Need to be more practical” – I finished up with a checklist of things you need to do when you get back to the office and a set of links to do them. It simply doesn’t get any more practical than that without me visiting your office and doing it for you (and I’ll be happy to do that for a price, but you don’t get that for free at any conference.)

That’s the only single bad comment I got this time, and I’m fine with it.  I consider this my most successful presentation so far, but it’s not because of the stack of good comments.

The Key to Getting Good Comments

Getting positive feedback on your presentations is really simple: get bad comments first, then make your presentations better. My stack of good comments today are the result of me constantly paying attention to yesterday’s bad comments and figuring out what I need to improve.  Here’s a tour of some of the good comments I got this time, and how they came about.

“Great information I can use on Monday morning!  The take home checklist is much appreciated!” – Recently I was going back through my notes from the MCM training and I noticed that I’d made a lot of notes about things I wanted to address with my own servers when I got back to work.  It hit me – I was building a checklist.  Why not finish up every presentation with a list of things the attendee should do when they get back to the office on Monday?  Rather than recapping what I’d told ‘em, I gave them a list of things to do.  This weekend’s presentation was the first one I finished that way, and it was a smash, generating a lot of good feedback.

"He'll be on in just one more minute..."

My Opening Act

“Brent O always gives a fun and informative presentation” – I don’t think you can present successfully with a sense of shame. I’ll wear a Richard Simmons costume to talk about weight stats – I mean wait stats – or I’ll show contortionist photos as I explain good filegroup design. Don’t take yourself seriously. Do you enjoy reading Books Online with all information and zero humor? My attendees sure don’t, and if I don’t keep things lively, they zone out. I keep watching my slides to see if I’ve got enough fun injected into my information. If I don’t have at least one fun slide for every 10-15 informational slides, I get nervous.

“Good presentation and humor and always down to earth.” – For me, being down to earth means that I try to identify with every person who asks a question. There are no stupid questions, because at some point in the past, I asked the exact same question. When I hear a question, I about the point in my career when I wondered the same thing, and I think about what was on my mind at the time. For example, at SQLSaturday Chicago, an attendee asked for clarifications about why we shouldn’t separate clustered indexes and nonclustered indexes onto separate filegroups. I’ve been there myself! I remember reading similar advice on the web, thinking it was a good idea, and applying it to some of my databases. It keeps me humble. Experience doesn’t mean I’m better than anybody else – it just means I’ve made more mistakes.

“Great content available online is good.” – More and more attendees are bringing wireless gadgets with ‘em. They’re bringing iPads with cellular data connections or they’re tethering their phones to their laptops, and they’re surfing the web during the presentation. It’s not enough to tell attendees that the slides and the code will be available sometime next week: they want it right freakin’ now. Before your presentation starts, create a page on your blog with your presentation resources. Put one or two links on there, and upload the PDF version of your slide deck. Give attendees a short, easy-to-remember URL with bit.ly or the WordPress GoCodes plugin. Good comments will ensue.

“Great approach to simplifying complex concepts” – Even though I don’t cook, I like watching the cooking show Good Eats by Alton Brown. He uses crazy props like a life-size cow made of foam to illustrate how science improves cooking.  I don’t leave Good Eats with a degree in science, but I know more than I need to know in order to improve my cooking.  (If I cooked.)  I try to take that same approach with databases by teaching you what you need to know, yet not boring you with the minutiae that doesn’t actually improve your skills.

“More detail than expected which was excellent.” – When someone does want to know more than what’s on the screen, and if I’m running ahead of schedule, I’ll go deep or off-topic in order to satisfy questions.  I have to balance the questions with the clock, so I also have to maintain an encyclopedic knowledge of links with more info.  I use the WordPress GoCodes plugin to save my favorite resources on all kinds of topics.  For example, if someone wants to know more about the file cache problems on Windows, it’s easy for me to remember BrentOzar.com/go/filecache instead of http://blogs.msdn.com/b/ntdebugging/archive/2009/02/06/microsoft-windows-dynamic-cache-service.aspx.  Attendees love it when you can give a 30-90 second answer to a question, plus write a whiteboard link for much more detail about the topic.

“Only complaint is that Brent only had one session.” – On the surface this is an awesome comment, but there’s a dark side.  As a presenter, if you see this as a negative comment and you try to get more sessions, you’re doin’ it wrong.  Relax and enjoy the event as an attendee.  Network with your other presenters, because they’re like your coworkers.  I only had one session this time, so I was able to veg out before my session, help another presenter get feedback, and then start my session relaxed and focused.  That brings me to the next phase of our backwards-in-time journey.

The Keys to the Zen Energy Balance

Brent in his native habitat

Me at SQLSaturday Chicago

As I took questions from leaving attendees, Allen White asked me, “Did you know you started about fifteen minutes early, and you ended about fifteen minutes early?” Yep – perfect timing for length on that one.  I’d started early because there was literally no space left in the room!  With fifteen minutes before go-time, people were standing in the aisles and sitting on the floor.  No sense in waiting around for more folks to come in, because no one else could have crammed in without filing a sexual harassment lawsuit.  Allen himself had taken the presenter’s chair – not that I would ever present sitting down anyway.  I’m one of those running-around-wildly presenters. I’m one espresso short of screaming, “DEVELOPERS! DEVELOPERS! DEVELOPERS!”

During the presentation, I’d had a good balance of energy and calmness.  I’d relaxed before my presentation by sitting through Erin Stellato‘s good presentation on baselining, and I’d snuck out about fifteen minutes before the end in order to grab coffee. Over the years, I’ve figured out that a shot of adrenaline – err, caffeine – helps get me upbeat, attentive, and focused right before a presentation starts. When the presenter’s zippy, the attendees are zippy. I sat back in her session, drank my zoom juice, and opened up my slide deck.

The moment Erin Stellato finished her presentation and the room’s doors opened, suddenly attendees started flooding in. People had been waiting outside to claim a seat. I hustled up to the podium because I like hooking up my laptop right away to make sure everything works, and when I looked up, the room was chock full of nuts. That’s a fantastic feeling for a presenter, knowing that people really, really wanna see this particular topic. Despite a lack of caffeine and music, I found myself totally energized and pumped up, and that wasn’t anywhere near what I expected.

See, months earlier, when SQLSaturday crew picked this abstract, I was actually disappointed. This wasn’t my favorite presentation. Sure, I was happy with it, but it wasn’t the kind of presentation that really made me proud to be a presenter.  But whaddya know – it ended up being one of my best presenting experiences.

This week, I’m presenting at Connections for the first time, and then it’ll be time to read comments again, and keep sluggin’ through the bad ones.  I look at presenting the same way I look at database administration: being good means you’re never good enough, and you’re constantly trying to find the next way to up your game.  That’s what Scott Adams meant in his champagne moments blog post, and he’s absolutely right.

But I’m still drinking champagne as I write this.  Cheers!

If you liked this post, you might also like some of my past posts about my quests:

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

SQLCruise 2011 Miami: The Movie

Want to know what it’s like aboard SQLCruise?  Here’s our SQLCruise 2011 Miami movie trailer:

You can read more about our adventures in our day-by-day recaps:

Two months left before we set sail on SQLCruise Alaska.  I cannot believe this is my life.

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

How to Build a SQL Server Support Matrix

When I want to check out a piece of software, one of the first things I look for (after the price tag) is the support matrix.  I want to know what versions of SQL Server and Windows they support.  I lined that up with the available machines I had in-house, picked the right platform, and got started.

Years ago, I noticed that when other users wanted to bring a new piece of software in-house, they brought me the product’s support matrix and asked what versions & servers we had in-house.  Some departments (like the mainframe guys) got so many requests that they published their own standards document showing what they supported.  When a manager insisted on putting certain kinds of software onto specific servers, the mainframe guys could point to their support matrix and say, “Sorry, that doesn’t match our standards.  It needs to go on this other server over here.”  Bam, discussion over.

Wow – why wasn’t I doing that?

I decided to build my own support matrix and standards document for our SQL Servers.  I broke the servers out into categories: Development, QA/Testing, Production, and Mission-Critical Production.  I came up with standard descriptions for each category that covered our HA/DR levels, our on-call availability, and security.  Here’s a screenshot:

My SQL Server Support Matrix

My SQL Server Support Matrix

Kapow, I laid down the law.  For example, I would not be on call if the dev server crashed at 9pm when one lonely developer was working late – he could open a support ticket, and I’d address the issue in the morning.  Note that this didn’t mean I wouldn’t fix the dev server after hours; I still set up SMS alerts to notify the team whenever ANY server was experiencing problems, and I wanted to get them fixed before the developers came in the next day.  However, with this support matrix, I was setting up reasonable expectations across the staff so that we knew what was an emergency, and what wasn’t.  If someone needed a database to be available 24/7, then that fell into the production category, not development.

When I built this document, I didn’t show it to my existing customers.  (Yes, I really think of my users and developers as my customers, not my coworkers.)  The goal of the document wasn’t to change expectations for our existing databases, but to shape expectations for any new databases and applications that came on board.  When a project manager wanted to bring in a nasty, poorly-written app that required SA permissions and 24/7 uptime, my support matrix backed me up.  I simply said, “No, that’s not in our support matrix,” and handed them the document.

If the manager has dealt with support matrixes before, they’ll recognize that these documents are usually built over time with a great deal of testing time and political wrangling.  Your document wasn’t – but they don’t know that.  They don’t know your document was only crafted with your finely honed intellect.  They’ll assume the support matrix is not negotiable, because the vendor’s got a support matrix too, and it’s not negotiable either.

The project manager will take the vendor’s support matrix, set it side by side with your support matrix, and look for a way to make this work.  They want the path of least resistance.  Your support matrix needs to give them an easy way to get their app in the house in the way YOU want to support it.  In my support matrix, I noted that with asterisks – if someone really wanted to get remote desktop access or SA access to their server, they could have it – as long as we could install them in a dedicated VM.

“No one will take me seriously.”

You think you’re powerless against your customers, and you’re right.  The project manager can pull rank over you and tell your manager to shut up and start installing.  For years, they’ve been kicking sand in your face, but I’m going to introduce you to your enforcers. Your existing customers will play the bad cop. Watch how this works:

Ned the New Guy: “Here’s an installation script for a new database we need.  After you put it on the mission-critical production cluster, let me know what the SA password is.”

Me: “Sorry, apps on the production cluster don’t get the SA password.  Here’s our support matrix.”

Ned the New Guy: “I’ll show you where to put that support matrix.  Don’t make me ask your manager.”

Me: “Well, if I give you SA permissions on that cluster, I’m also giving you SA permissions on our SalesApp database – the system that all our revenue comes through.  I’m not comfortable doing that without Bob’s okay.  He’s the SalesApp project manager.  Hey, Bob – would it be okay if I gave someone else permission to truncate your tables, drop your databases, and shut down your servers?”

Bob the Bad Cop: “Hell no, Ned, you’re not getting that.  Go get your own server.  Don’t make me get the CFO.”

Presto – you’re not the bad guy, and you’ve got someone with much more power in your corner.  Get started today by taking my sample SQL Server Support Matrix and making it your own.

If you liked this post, check out my Consulting Lines series here.

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

Consulting Lines: “Do you want 10% faster, 100% faster, or 1000% faster?”

My favorite engagement is when I’m brought in to help a good person who’s overwhelmed.  The manager knows his DBA is smart, but the DBA is just flat out overworked.  Too many developers are slinging too much code on too many servers, and there’s too many signs of smoke.  The manager asks the DBA who he would pick if he could pick any SQL Server guy in the world to help out, and my email goes to Inbox Plus One.

In situations like this, I have to jump aboard a moving train.  My biggest value is that I can tell the DBA, “Don’t worry, I’ll take the arrows at this next meeting.  You stay back in the cube and keep working.”  I have to respond to questions without knowing the slightest thing about the amount of work involved.  I can’t ask for precise measurements of past performance – I have to shoot from the hip, and I have to do it fast.

The Situation: The Angry User

Ripley: “We’re having problems with the Hyperdine 120-A2′s.  The hand motion is pretty quick, but we need them to go faster.”

Me: “How much faster?”

Ripley: “Well, I’m not sure.  I’m not sure how to measure how fast their hands move.  We started this test with a knife.  Put your hand on the table and I’ll bring one in to show you.”

Me: “No thanks, that’s okay.  Let’s keep it simple – do you want it to be 10% faster, 100% faster, or 1,000% faster?

What That Line Does

I purposely use the 100% and 1,000% numbers instead of the easier-to-understand “twice as fast or ten times as fast” metrics because I want them to stop and think through the metrics.  I want them to think about what those percentages mean, and more importantly, think about the vast differences in those numbers.

Those numbers don’t just refer to speed improvements.

They hint at work requirements, too.

See, the more they think about what it means to get something to be 100% faster or 1,000% faster, the more they’ll understand the fundamental differences between performance tuning and rearchitecting.  They’ll realize that they’re not just calling me in to tweak a few little knobs – if they need something to go ten times as fast, I might make a very big suggestion on how they’re using technology.  Admitting that you need something to be 1,000% faster means you’re willing to make some radical changes.

Sometimes, a judicious use of just the right index, query tweak, or configuration can improve performance by 1,000%.  When I’m doing a very first round of performance tuning for a new client, that word “sometimes” might even be replaced with the word “often.”  But before I go saying a simple new index will solve everything, I want the client to tell me how high I need to aim.

What Happens Next

I consider this line a success if the other person blinks and thinks, and they almost always do.

Ripley: “Uh…well…I guess it needs to be ten times faster.”

Me (nodding and making a note): “I see.  That’s a pretty big jump.  Okay, what else?”

Ripley: “You can do that?”

Me (with a grin): “I can do just about anything – that’s why they brought me in.  I have no baggage, no politics, and no excuses.  I’m just a hired gun.”

Ripley: “Ah, so the more work I want done, the more money you make!”

Me: “Exactly.  So go ahead – let’s go through everything you’re frustrated with, and how much of a difference you need.”

By simply acknowledging the size of the jump and moving on, I’m setting up a silent contract between me and the user.  They realize that performance costs money, and they start taking politics out of their decisions too.  They build a mental shopping list and associate it with dollar signs, and you’d be surprised at how that tempers their demands for more performance.

If you liked this one, check out more from my Consulting Lines series.

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

Scaling Up or Scaling Out? Part Two

In part 1 of this post, I covered how SQL Server handles scaling up.  We talked about how quickly it becomes expensive to add more CPU power, memory, and storage throughput to our database servers.  Today, we’re going to focus on a different way to scale.

When most folks talk about scaling out SQL Server, they’re adding more SQL Servers to the infrastructure and dividing the work between them.  I want you to take a bigger step back, though, and ask the question, “What are the different things we’re asking SQL Server to do?”  The answer isn’t just storing data, either:

  1. We insert data – and not just data, but different kinds of data
  2. We update data
  3. We delete data
  4. We do some processing of that data
  5. We retrieve the data – and we want to include the different ways we retrieve it, and with which tools
  6. We check the data to make sure it’s still correct
  7. We back up the data – or sometimes we don’t, because it’s easier to rebuild from source

By the time our application gets large enough for the word “scale” to get thrown around, we’ve usually got several different kinds of data.  Each of those data groups has different answers to those seven processes above.  Let’s take a common type of data – orders for a web site.  At first glance, a web site might seem like it has just one type of data, but here’s several types for a system I tuned recently:

  • Items – product details about what we sell.  This data is only periodically updated, and we’re not the primary source for this data.  Our manufacturers update the data via file feeds they send us.  Reads have to be absurdly fast, and the load will be very, very high.
  • Price rules – no, one price does not fit everybody.  We run sales, referral programs, and discounts for our bulk buyers.  This data may not need frequent updates, but when updates happen, they have to be available everywhere instantaneously.  Otherwise, a pricing error waiting for a rollout might cost us millions.
  • Reviews – end users can add their own reviews about our items.  We’re the primary source for this data, but it doesn’t have to be transactionally consistent with our sales data.  We can afford to lose some of this data.  Reads have to be fairly fast, and the data can be completely out of date.
  • Shopping carts – transient data about people shopping at any given time.  We’re the primary source for this.  It’s insert-focused, and data has to be up-to-the-second.  We could lose all of this data at any time without a serious outage, but while it’s down, our sales stops.
  • Orders placed – This is the good stuff.  We’re the primary source for this, and it absolutely, positively has to be completely consistent.  Our credit card records, items ordered, and shipment addresses have to be complete, and they have to be available across multiple datacenters simultaneously.

If we take each of those data profiles and put our 7 questions to it, we could get completely different answers.  Of particular interest is question 5 – how we retrieve the data.  At first glance, we give answers like, “When we retrieve orders placed, we need to join to items to see what they bought.”  There’s an important scalability part of that question, though – how old can the related data (items) be when we query the orders placed?  If I’m querying an order from yesterday, I can probably live with yesterday’s copy of Items.

Scaling Back Our Demands on SQL Server

As we dissect our data into different types, start exploring the needs of each type, and stay completely honest with ourselves, we’ll probably discover that a relational database like SQL Server might not be the best option for everything.  I’m a Microsoft SQL Server cheerleader, but if I’m going to get it to scale, I have to be honest about its strengths and weaknesses.  Pushing a technology to its limits isn’t always the right answer – especially if there’s another technology at hand that can do the job with less effort.

Separating this data off the SQL Server and onto other servers is a method of scaling out – throwing more hardware and services at our business problems.  StackOverflow’s first iteration of search used SQL Server’s built-in full-text search and we ran into scaling challenges.  SQL Server 2008 moved the full text search into the engine, and this introduced some concurrency issues that we weren’t able to solve in a cost-effective way.  I could have recommended that they build out a replication or log shipping infrastructure and start querying slightly stale copies of the database, but that just didn’t make sense for their needs.  They were armed to the teeth with web server hardware and guys who knew how to write code, so why not scale ourselves right out of SQL Server?  They switched to Lucene, and I (as a DBA guy) have been happy ever since.  Are the programmers happy?  Who cares?  Not me – I’m able to help them focus on what SQL Server really does well.

There are going to be parts of our data storage solution that absolutely require a relational database with transaction support.  Our example business needs the orders-placed data to leverage all of the data integrity features built into SQL Server.

Scaling Out SQL Server’s Remaining Work

Once we’ve pared down our list of demands, we can make different architectural decisions about how to add more hardware into the mix.  Some of the most common scale-out infrastructures I’ve seen include:

Using bidirectional or merge replication – this allows two SQL Servers to handle writes to the same database, same tables, at the same time.  Changes are replicated between the servers so that within a few seconds, both servers will have the same records.  Schema designs that rely on identity fields can run into trouble here, and we have to compensate by using identity fields with different seeds – one server uses odd numbers, the other uses even.  I only recommend replication as a scale-out method when the client has an around-the-clock database team on duty at all times because when this thing breaks, it breaks hard.  A DBA has to be available to get the alerts of problems with replication latency, jump to work on solving the problem, and get it fixed before a performance-killing reinitialization is required.

Putting several read-only SQL Servers behind a load balancer – if our primary bottleneck is reads (like reporting queries or a lack of app-tier caching), we can build several SQL Servers that are refreshed via log shipping or SAN snapshots.  End users or app servers don’t access SQL Server for reads directly – they get a server name that points to the load balancer hardware (like an F5 Big-IP), and the load balancer redirects that connection to an available SQL Server automatically.  Every X minutes, we pull a server out of the farm by telling the load balancer it’s no longer open for accepting connections.  After the last remaining query finishes, we refresh the data by applying new transaction logs or mounting a new SAN snapshot.  We then put it back into the load balancer pool, and the load balancer starts sending user connections to it.  This is a lot of moving parts, and while it’s all automated by scripts, scripts can still break.  Depending on the robustness of our scripts and our DBA team, we might be able to get away with this solution without an around-the-clock DBA team, but people still have to be on call.

Using SQL Server Denali (2011) AlwaysOn – this one isn’t actually available yet, but when this new version of SQL Server comes out, it holds the promise of up to 4 read-only replicas.  Apps can declare a read-only intent in the connection string, and the production SQL Server will redirect them to one of the available replicas.  Up to 2 of the replicas can be synchronous, although I don’t think many customers will opt for live reads from a synchronously updated SQL Server – the overhead will slow down production transactions.  You can read more at my post on Denali AlwaysOn.

Using third-party scale-out products – I’m always leery of adding third-party infrastructure to scale out SQL Server because it’s just so darned difficult.  Xkoto Gridscale sounded like the brightest hope in a while, but that was discontinued when Teradata bought Xkoto.  I don’t know of any other reliable technology that I’d trust to pull it off, and maybe more importantly, that I’d trust with my long-term business model.

The first two solutions (replication and load balanced read-only servers) don’t require anything unsupported, so they’re a safe bet.  Denali might not be seen as a safe bet because it’ll be a version 1 technology when it ships, but if you need to scale out, you can’t afford not to investigate it.  I’d even argue that some of my scale-up customers (like data warehouses) would be well-served by kicking AlwaysOn’s tires – if you could shed 50% of your load by moving your read-only queries away from your >8-CPU server currently running SQL Server Datacenter Edition, you could easily save hundreds of thousands of dollars in licensing.  If you’re currently running a 4-CPU box and you’re worried about headroom, Denali might be your silver bullet to avoid a big expenditure.

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

How to Get Paid to Take a Cruise

As a database expert, I regularly travel to speak at conferences.  When I travel, I try to time my trips to take advantage of other opportunities to see sights, visit friends, or relax.  When my speaking schedule put me in South Florida last summer, I thought I’d take a cruise out of Miami afterwards.

SQLCruise 2010 Classroom

SQLCruise 2010 Classroom

Suddenly I wondered, “What if I offered training on board the cruise ship and got paid for it?”

Since other database people would be in Miami for the same user group event, I thought maybe I could entice them on board for training whenever the ship was at sea.  I’d charge $300 for the training – a relative bargain for 10-14 hours of highly technical training, plus I could have plenty of side conversations about the attendees’ personal challenges with their databases.  I didn’t want to book an entire boat – quite the opposite.  I wanted a small, intimate group of just 15 people max who could hang out, build relationships, and learn cool stuff.

I fired off an email to a close friend of mine, Tim Ford, and we started SQLCruise.com.  We sold out our first cruise, made a profit, and proceeded to start a series of cruises.  If you’ve built a popular blog, this is a great way to monetize your blog by charging for a premium audience experience, and I’d like to share my experiences to help you do it too.

Why People Would Pay Us for Training

For those of you who are new around here, Tim and I both write blogs about Microsoft SQL Server, a popular enterprise database platform.  Over 250,000 people have signed up for the Professional Association for SQL Server, indicating a strong user base, and my blogs target highly technical users.  I write about performance tuning issues, high availability, and disaster recovery.  I’ve spoken at SQL Server events around the world, and my online events often draw over 1,000 live attendees.  At the time we decided to launch the cruise, I had about 3,000 RSS readers and 5,000 Twitter followers.

My online brand revolves around the quality of my writing and presentations.  I’ve won awards and high praise around the world for my sessions, including 2 of the top 10 sessions at the international PASS Summit.  My audience already believes I’m delivering premium SQL presentations and articles, so I didn’t have to do a big marketing push to convince them that I could deliver good content.  They knew I could present, but I had a different challenge: getting them to pay for training aboard a cruise ship.

SQLCruisers ordering drinks on the back deck

SQLCruisers ordering drinks on the back deck

Training on a Cruise Ship? Really?

Cruise costs compare very favorably with typical conference hotels. I usually end up spending $1,300-$1,500 for a week of lodging and food when I attend a conference, but I can get a 4-night cruise for two for under $1,000.  Conference organizers have huge costs for hotel meeting rooms and lunches, which cost way more than you might think.  Much of conference prices come down to the room & food cost.  Cruise lines don’t jack up the room and food prices, though – they’d rather use meetings as bait to get people on board the ship, then take money from them in other ways, like shore excursions, spa packages, and gambling in the casino.

Unfortunately, those last few phrases are also why managers think training aboard a cruise ship might be a joke – nothing more than an excuse to get together and party on the company dime.  Since I wanted my attendees to get their training, travel, and cruise costs paid by their employers, I faced a challenge.  I thought we had to market the cruise in a way that both cruisers and companies would appreciate.

We differentiated ourselves from traditional training conferences in two ways.  First, we offered much longer sessions.  Instead of a blizzard of one-hour sessions, we offered only 3-hour deep dive sessions.  We wanted to spend much more time examining each topic so attendees came away with a solid explanation of the topic rather than a brief introduction.  Second, we emphasized the relationship-building aspect of the cruise as much as the training itself.  We capped attendance at 15 people, and we marketed the cruise as a chance to get to know the presenters in a very casual, all-access environment.  Cruisers had the chance to ask for advice from me and Tim on any topic – their SQL Servers, their job challenges, or their personal brand.

Field trip to the beach

Field trip to the beach

On our first cruise, we sold out all 15 spots a month before the cruise left port, and our cruisers told us they’d signed up for exactly the reasons we’d expected.  They wanted longer sessions, and they wanted to build relationships with us.  Even better, the cruise turned out to be a great way for them to build relationships with each other.  Tim and I watched with joy as the junior SQL Server people talked shop with the more experienced ones, conversed about their challenges, and formed bonds.

Our Second Target Audience: Sponsors

As we built our marketing plan, we realized we had another target audience: sponsors!  We were building an event that would generate a ton of buzz in the community.  Even if SQL Servers couldn’t convince their bosses to pay for training aboard a cruise ship, we knew they’d be watching closely from ashore.  We wanted to be the talk of the town – the kind of event you really wanted to attend, but probably couldn’t.  We offered sponsorship positions to vendors because we hoped our event would be all over Twitter and blogs.  Normally SQL Server vendors would never sponsor paid training classes for just a few attendees – they want to reach more people – but we hoped we had a unique message that would reach even non-attendees.  The buzz about the event might be more valuable than the event itself.

The small size of the event made it an unusual sell for sponsors.  Sponsors want to pay as little as possible in order to reach as many people as possible, but we were pitching a quiet, tight-knit event with a little over a dozen people.  We wanted vendors to send representatives aboard the boat because they’d have the chance to build very close relationships with some of the most influential people in the SQL Server community.  Our attendees were bloggers, presenters, and user group volunteers – people who wouldn’t ordinarily spend hours on end having drinks and relaxing on the beach with vendor employees.  I saw this event as a really unique way to bring these diverse people together.  On the first cruise, no vendor employees attended, but we convinced two to come on the next cruise, and four on the upcoming SQLCruise Alaska.  I’m really excited to see what comes out of the 2011 cruise season.

SQLCruise 2010 docked in Mexico

SQLCruise 2010 docked in Mexico

We sold more sponsorship spots on the first cruise than we’d expected, and we were able to make a very (very) small profit.  We didn’t make anywhere near as much money as we’d normally earn in our day jobs, but for us, the important part was that we were getting paid to have fun on a cruise.  It wasn’t as relaxing as a vacation, though – in fact, it was hard work in the weeks leading up to the cruise.

Handling the Mechanics of Registration

I originally wanted to use EventBrite to handle registrations – it’s a site that lets you sell event tickets using their tools for registration and credit card processing.  I really liked their ability to cap registration at exactly 15 tickets even if I wasn’t around to shut down registration, because I’m on the road and inaccessible a lot.  My worst registration fear was that 20-25 people would register before I got the chance to shut off registration.  However, I couldn’t deal with one showstopper – EventBrite doesn’t release the attendee funds to the event organizer until after the event is over.  I needed the cruisers’ funds to organize travel for me & Tim and to get the swag.  I wasn’t about to go thousands of dollars into the red gambling that I wouldn’t have a problem with EventBrite.

Instead, we handled registration with a WordPress contact form.  As each person registered, we emailed them an invoice with a PayPal link for the registration fee.  We kept track of the attendee details with a Google Docs spreadsheet, and as the event date got closer, we shared the spreadsheet with the cruisers so they could add in their travel details, excursion plans, and share rides to/from the airport.  We used an email list so the cruisers could ask questions, and we found that most of the time, the other cruisers did the answering for us.

SQLCruisers Eating Ashore

SQLCruisers Eating Ashore

Bonding Between the #SQLCruisers

The first round of cruisers shocked us by taking initiative in marketing the event too!  Karen Lopez, one of the cruisers, got the event covered by IT Canada Weekly, and another attendee almost got us on a Seattle TV show.  Our attendees’ willingness to help market our event surprised us so much that we weren’t able to keep up with demand!  We had a full plate just trying to get our presentations ready for the cruise.  Their efforts didn’t stop when they board the ship, either – they wanted to thank the sponsors for making the event possible, so they blogged and generated buzz even while we were at sea.

We think the small number of attendees was a big part of the event’s success.  Long before boarding, the cruisers got to know each other via the mailing list and Twitter, thereby building close bonds.  We know we could sell more spots on our next cruises, but we don’t want to sacrifice what made the event so special.  At the same time, having a large number of watching but non-attending people also helped.  SQLCruise generated great tweets and excitement in the SQL Server community, and that enabled our sponsors to get their moneys’ worth.

Things We Learned Along the Way

The most disappointing lessons all came from the legal side of SQLCruise.  We started the event without requiring sponsor contracts because we’d never used them in our user group transactions with sponsors.  We sent the sponsors a list of sponsorship packages, they picked one, and they sent us payment – case closed.  By the second cruise, though, we realized we had to start getting sponsors to sign on a legally defensible bottom line to protect ourselves from changing whims.

SQLCruise swag bag in Key West

SQLCruise swag bag in Key West

We need to institute a non-refundable deposit due immediately to reserve a spot in the training, too.  We managed to sell out SQLCruise Alaska in just twelve hours, but after the initial sellout, we had one cancellation after another.  As of this writing, we’ve still got 3 spots left.  That sucks as an event organizer because you only get one chance to do a first push to fill up the cruise.  Now I’m faced with mounting another marketing campaign to fill up those last few slots.

We even need to rework our relationships with the cruise lines.  We’ve faced some hurdles getting the comp rooms and meeting rooms that we were promised by the cruise lines, and because our group isn’t huge, we’ve even had our meeting rooms downgraded in order to make room for a bigger group.  (Damn you, weddings.)

Bon Voyage!

I can’t complain because as this blog post goes live, I’m on board the Norwegian Dawn sailing away from Miami along with a dozen cool SQL Server people.  It’s been hard work getting to this point, and it hasn’t been all sunshine and margaritas, but looking back it’s been worth every moment.  I’m really proud of what we’ve built, and I’d love to see more bloggers take on special events like this to help build up communities around their blogs.  There’s absolutely nothing stopping you from organizing your own event – and indeed, there’s people like me who would love to share our knowledge with you.  Maybe your event will be a cruise – or maybe it will be a retreat, a Grand Canyon camping trip, or a wine country tour.  It’s not just about making money – it’s about building close relationships with your readers and your virtual friends.  Just as hundreds of volunteers organize their own user group and SQLSaturday events around the world every year, you can do the same for traincations.  Talk to your close friends, decide where you want to go, build a plan, and open it up to the public.  I’ll drink to your success.

Hmmm, I wonder if the meeting room staff will bring in room service margaritas….

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

RAID 0 SATA with 2 Drives: It’s Web Scale!

Before I start with this sordid tale of low scalability, I want to thank the guys at Phusion for openly discussing the challenges they’re having with Union Station.  They deserve applause and hugs for being transparent with their users.

Today, they wrote about their scaling issues.  That article deserves a good read, but I’m going to cherry-pick a few sentences out for closer examination.

“Traditional RDBMSes are very hard to write-scale across multiple servers and typically require sharding at the application level.”

They’re completely right here – scaling out writes is indeed hard, especially without a dedicated database administrator.  Most RDBMSes have replication methods that allow multiple masters to write simultaneously, but these approaches don’t fare well with schemaless databases like Phusion wanted.  SQL Server’s replication tools haven’t served me well when I’ve had to undergo frequent schema changes.  Some readers will argue that the right answer is to pick a schema and run with it, but let’s set that aside for now.  Phusion chose MongoDB for its ease of scale in these situations.

“In extreme scenarios our cluster would end up looking like this.”

Their final goal was to have three MongoDB shards.  Unfortunately, they didn’t understand that the Internet is an extreme scenario.  If your beta isn’t private, you can’t scale with good intentions.  Instead, they went live with:

“We started with a single dedicated server with an 8-core Intel i7 CPU, 8 GB of RAM, 2×750 GB harddisks in RAID-1 configuration and a 100 Mbit network connection. This server hosted all components in the above picture on the same machine. We explicitly chose not to use several smaller, virtualized machines in the beginning of the beta period for efficiency reasons: our experience with virtualization is that they impose significant overhead, especially in the area of disk I/O.”

The holy trinity of CPU, memory, and storage can be tough to balance.  For a new database server running a new application, which one needs the most?  In the immortal words of Wesley Snipes, always bet on black memory.  A lot of memory can make up for slow storage, but a lot of slow storage can’t make up for insufficient memory.  When running your database server – even in a private beta – 750GB SATA drives in a mirrored pair is not web scale.

“Update: we didn’t plan on running on a single server forever. The plan was to run on a single server for a week or two, see whether people are interested in Union Station, and if so add more servers for high availability etc. That’s why we launched it as a beta and not as a final.”

Unfortunately, if you go live with just one database server and all your eggs in two SATA drives, you’re going to have a really tough time catching up.  As Phusion discovered, it’s really hard to get a lot of data off SATA drives quickly, especially when there’s a database involved.  They ran into a few issues while trying to bring more servers into the mix.  They would have been better served by starting with three virtual servers, each running a shard, and then separating those virtual machines onto different hosts (and different storage) as they grew.  Instead, when faced with getting over 100GB of user data within 12 hours, they:

“During the afternoon we started ordering 2 additional servers with 24 GB RAM and 2×1500 GB hard disks each, which were provisioned within several hours.”

Now things really start to go wrong.  They’ve gotten 100GB of user data within 12 hours, and they’re moving to a series of boxes with more SATA drives.  They still only used two slow SATA drives, but don’t worry, they had a plan for better performance:

“We setup these new harddisks in RAID-0 instead of RAID-1 this time for better write performance…”

Whoa.  For the part-time DBAs in the crowd, RAID 0 has absolutely zero redundancy – if you lose any one drive, you lose all the data in that array.  Now we’re talking about some serious configuration mistakes based on some very short-term bets.  Phusion had been overwhelmed with the popularity of the new application, and decided to put this “beta” app on servers with no protection whatsoever – presumably to save money.  This makes their scaling challenge even worse, because sooner or later they’ll need to migrate all of this data again to yet another set of servers (this time with some redundancy like RAID 10).  Two SATA drives, even in RAID 0, simply can’t handle serious IO throughput.

“RAID-0 does mean that if one disk fails we lose pretty much all data. We take care of this by making separate backups.”

Pretty much?  No, all data is gone, period.  When they say they’ll make separate backups, I have a hard time taking this seriously when their IO subsystems can’t even handle the load of the existing end user writes, let alone a separate set of processes reading from those servers.

“And of course RAID-0 is not a silver bullet for increasing disk speed but it does help a little, and all tweaks and optimizations add up.”

Even better, try just getting enough hard drives in the first place.  If two SATA drives can’t keep up in one server, then more servers with two SATA drives aren’t going to cut it, especially since you have to get the data off the existing box.  I can’t imagine deploying a web-facing database server with less than 6 drives in a RAID 10 array.  You have to scale exponentially, not in small leaps.

“We’ve learned not to underestimate the amount of activity our users generate.”

I just don’t believe they’ve learned that lesson when they continue to grow in 2-drive increments, and even worse, in RAID 0.  I wish these guys the best of luck, but they need to take radical steps quickly.  Consider implementing local mirrored SSDs in each server like Fusion-IO or OCZ PCI Express drives.  That would help rapidly get the data off the existing dangerous RAID 0 arrays and give them the throughput they need to focus on users and code, not a pyramid of precarious SATA drives.

(Jumping on a plane for a few hours, but had to let this post out.  Will moderate comments when I get back around 5PM Eastern.)

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube

Five Classic Videos Every DBA Should Watch

Every now and then, I get a comment from someone thanking me for one of my older videos.  There’s still a lot of good stuff in here, so I thought I’d put up a reminder – here’s some of my favorite videos from the past:

#5: BLITZ! SQL Server Takeovers

You’re just sitting there, minding your own business, when somebody comes running in out of nowhere and tells you the company’s got a SQL Server hidden under somebody’s desk.  You need to get a quick picture of whether that server is healthy or not, and you don’t have much time to do it.  In this video, I explain how to use my Blitz script.

#4: Top 10 Developer Mistakes That Won’t Scale

At TechEd last year, I covered the most frequent coding performance issues I’d been seeing in the field.  Today, I still see these same issues over and over at client engagements, and I’m sure I’ll continue to see them in the future.  It’s easy to misuse and abuse some of these features.

#3: SQL Server Index Tuning

Microsoft SQL Server constantly tracks which indexes are being used and which indexes should be added.  That data is accessible to us in the form of Dynamic Management Views (DMVs), but those DMVs can be easily misread.  I explain how to get started with index tuning in this video with Kevin Kline:

#2: T-SQL Tuning for Race Car Drivers

Formula 1 drivers live on the edge, pushing their cars as hard as they possibly can.  The concepts in this video can’t be used on every server you have, but when you need to push your server to the limits, these help get you there.

Which brings us to our #1 classic video that every SQL Server database administrator should see…

#1: The Hawaii Chair

This one isn’t my video, but when you’ve mastered the content in those first four videos, you’re going to be a lot more relaxed around the office.  You’ll be less stressed out, you won’t be running from emergency meeting to emergency meeting, and people won’t be bothering you.  While you’re sitting around surfing funny source code comments at StackOverflow, take advantage of that spare time to lose weight with the Hawaii Chair:

As an added benefit, if anybody does come to your cubicle to ask a question, they’ll be so horrified by the Hawaii Chair that they’ll probably leave immediately.  Win!

Brent Ozar

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.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle PlusYouTube