So I passed the Microsoft Certification Exam 70-451. I know, I know. This blog post seems like a rerun. Wasn’t it only two weeks ago that I passed this exam? What gives?
Actually no. Two weeks ago, I passed the 70-433. That was a prerequisite for this one. To recap:
- Pass the 70-433 exam and you’re a MCTS (Microsoft Certified Technology Specialist) in SQL Server 2008 Database Development.
- Pass the 70-451 exam and you’re a MCITP (Microsoft Certified IT Professional) Database Developer 2008.
(As long as those titles seem, it’s not longer than the name of my bachelors degree written out. Ask me about it some time).
The motivation behind getting the certification was simple. I was asked to get it for work:
I was asked “Can you get the cert in a month?”
“Umm… let’s see. Yep, the testing center has seats available, I’ll give it a try.”
So I did. Other people have different motivations for certification. I’m not sure if I would have gotten these without some prompting. But on the other side, now that I’ve gotten it, I’m glad I did.
But the preparation for these exams meant a ton of studying. I’m pretty confident in my skills, but I realize that the happy ending was not guaranteed. So that meant work. If I was going to fail, it wasn’t going to be because I didn’t prepare enough. (Remember that in the Hare and the Tortoise the real moral of the story is not slow and steady… but actually don’t get cocky).
So I was nervous. I went into the test and started answering questions. About 15 questions in I realized that I was going to be okay and I relaxed a bit. I finished with time to spare and reviewed the questions I was fuzzy on. I clicked submit and BAM, I passed with a score of 914. They tell you your mark immediately.
In an article of his, Brent Ozar reminded me recently about Scott Adams’ champagne moments. In that article he talks about how important an event has to be before it’s worth popping open a bottle of champagne. Like Brent, I have a low threshold for these “champagne-worthy” moments and Monday was one of those days.
I was surprised at how glad I was to get the certification. And that’s worth recognizing.
The Study Guide I Used
So I created a study guide for myself earlier and what’s shown here is a straight dump of that; I include it as-is. That is, I don’t provide links and some of the resources you might not have access to.
I started out making the study guide a list of things to do, and not a list of things to learn. (Just like homework or an assignment).
Designing a Database Strategy (13 percent)
- Create SQL Server agent jobs, steps & schedules (through ui and sp_)
- Set up DB Mail and use. Notify self when a job is done.
- Create a linked server (through ui and sp_)
- Review normalization articles
- Create an application that uses the Entity Framework
- Security Strategies. Put the following terms somewhere into security triples: (prinicpal, object, permission)
- Application Roles
- Schema Ownership
- Execution context
- Window vs SQL Authentication
- Permissions and DB Roles
- Security Strategies.
- Create and implement a demonstration of the ideas listed above, both with the UI and with t-sql.
- Service Broker
- Go through tutorial, review rusanu’s asynchronous job service broker.
- Look through following ideas for ideas not yet covered
- Message types
- Remote service binding
- For ideas not yet covered. Create and implement a demonstration of the ideas listed. Both with the UI and with t-sql
Designing Database Tables (16 percent)
- Implement and use data types from C# application
- Geography: Implement an app that tells you how close the nearest x is.
- Geometry: Review “Birth of Venus”
- HierarchyId: Review
- Can you get value of current node?
- Date, time, datetime2, datetimeoffset
- Watch Kendra Little’s 24HOP session on dates.
- Varbinary (max) (Wasn’t this around in 2005?)
- Filestream ughh…
- Size the data types. Review each.
- In row data blobs, Create a table that stores data in row by default, and out of row by default. (What is the unspecified default?)
- Create some persisted computed columns. Review Determinism, precision etc…
- Data integrity ,Enforce some constraints the following way:
- Dml triggers,
- Null/not null
- Default (???)
Designing Programming Objects (17 percent)
- Stored Procedures
- Create procedure exercising different execution contexts (EXECUTE AS)
- Review TVP example, Also create sproc to pass tables between tsql and sproc
- Write sproc that returns data (using RETURN?), using OUTPUT param, using result sets. Are there others?
- Look at interaction of RECOMPILE (table level vs. sproc level)
- Look for Error handling examples, start with Rusanu’s asynch script. Look for TRY CATCH examples. Update sp_blockedprocess* with error handling
- Create views again, CTEs
- What’s a partitioned view.
- Review with check option again (it means updating views shouldn’t violate the view criteria)
- Read BOL on WITH SCHEMABINDING
- What permissions are there on udfs? flavors of security here: GRANT, DENY, REVOKE versus EXECUTE AS
- What is schemabinding on udf?
- what are the three (four?) kinds of functions
- Review inline table-valued functions vs. views, multi-statement table-valued functions, determinism \
- CLR Stuff (This was my favorite part of studying if not the most useful)
- Implement a regex “match” in CLR
- Implement “Concatenate” aggregate in CLR
- Implement “first” aggregate in CLR (if possible)
- Impelement “times table” sproc in CLR (gives times table as resultset from 1 to 12)
- Explore PERMISSION_SET.
- Implement Regex as a clr UDType
- Look out for Bobby Tables:
- too bad we can’t use sys.fn_quotefourpartname
- Especially look out for EXEC or sp_executesql… distrust any parameter values!
Designing a Transaction and Concurrency Strategy (14 percent)
- Locking granularity levels (Something I’ve always avoided in the past.)
- Review the different locking granularity hints.
- Understand memory consumption of each.
- Implicit transactions vs explicit transactions
- Nested transactions, using XACT ABORT, Nesting levels, (damn, where’d I put my totem). Dive deep into these. Which severity of error is enough to kick you up a level? I know how TRY CATCH behaves, is this affected by aborted transactions?
- Save points, (review sudoku solution)
- Use SET IMPLICIT_TRANSACTION ON setting
- Read Kendra’s poster
- Review my own series.
- How do are these affected by rowversion datatype?
Designing an XML Strategy (8 percent)
- Watch MCM video on xml by Bob Beauchemin
Designing Queries for Performance (17 percent)
- Optimize and Tune
- Review what’s sargable
- Look at temp storage (find a definitive blog post on difference between temp table and table variable.
- Find Itzik’s posts on sqlmag.com for GROUP BY (grouping sets, cube, rollup)
- Execution plans
- Review my post on table access operators
- Look at join operators,
- Review those fuzzy ones (table spool, parallelism, others)
- Row based vs Set based operations
- Enumerate as many non-set based things (cursors, WHILE),
- Do ctes count? or subqueries in SELECT, WHERE clauses count as non-set based?
- Look at batching methods, splitting implicit transactions (this is Rowcount(), top(x), while)
Designing Queries for Optimal Performance (15 percent)
I have no better advice in this section than to point you to his posts http://ericwisdahl.wordpress.com/tag/70-451/.
I found those posts very valuable and I want to end this post by saying thank you Eric!