The True Test of a Good DBA

By Bill Wunder

 

There are a number of reasons why good DBA’s tend to be among the better paid folks in a software development shop and always considered among the least expendable in a any intensive production computing environment. A good DBA is hard to find. The requirements of exceptional professionalism, thoughtfulness, mentoring and business process enforcement abilities, a breadth of savvy across the realms of hardware and software technologies are unlike the requirements of any other person in the shop. A long reaching view of the big picture and an enlarged view of the microscopic details are mandatory skills. A continual ability to learn, innovate, and lead on into the unknown in implicit. With such a breadth of required skills its no wunder that there are far more people calling themselves DBAs than there are true DBA’s in this world. So when it’s time to try to hire a good DBA it is imperative to come up with an extraordinary way to effectively and efficiently identify the real article from the pretenders.

 

Perhaps there are people in a hiring role that can distinguish between top quality DBA, a diamond in the rough, and a used car sales associate. I don't believe I've met that person, but I have had opportunities to make the acquaintance of many of those latter types as they search for good job in an always tough DBA job market. Relying on any interview process to find a highly specialized technical profession like a DBA will always be a spin of roulette wheel. What’s worse, the house odds will not belong to the organization or the applicant. It is absolutely mandatory to allow a DBA applicant to show what they can do and then evaluate the results. And it is important for all that this is accomplished in an hour rather than in a month or two on the job if at all possible. The best way to accomplish this when hiring a DBA is to set them in front of a database and have them demonstrate some of the key skills that they will need to bring to the organization in order to be effective. Some sort of a test that aids in leveling the playing field and pre-screens applicants as to meeting a minimum standard even before everyone invests larger amounts of time in interviews, discussions, and negotiations.

 

I’ve used a simplistic written test with only a few questions and I’ve used a more exhaustive evaluation. I’ve tried simply asking for verbal descriptions, writing answers on paper, and hands on - set at a keyboard - do these things tests. Far and away, in my experience, the best way to determine the skill level of an applicant is to give them an 30 minutes to an hour at the keyboard. I suppose it wouldn’t have worked a few years ago – before the bust – but in today’s employment market folks are keen to do what ever it takes to land a good job. Letting them show their stuff on a SQL Server is unbelievably effective.

 

Recently I found myself looking for an experienced DBA to grow my team of one to a team of two. I sat down for a half an hour and came up with a series of tasks that exemplified what a DBA does in our shop and then I worked at it another half an hour to create a process that I wouldn’t have to reconfigure each time someone “took the test”. I created and populated a couple of small databases. I detached one and I backed up the other. I made a just in case copy of the backup and the detached db but I did not have to use them. Applicants would come in, we’d show them around and then we’d set them at a desk near me, give them a few minutes of explanation and off they’d go solving some SQL problems. Of worthy note, I would also make sure this SQL Server was disconnected from the company's network as a precaution against the unpredictable. 

 

The results of the hiring round that used this exam are a testament to the efficacy of the exam. It’s interesting how many things people will put on a resume that they can’t do. And it’s interesting how hard people will resist admitting they are in over their head. And most of all it’s amazing how well the person that did the best on the hands on evaluation is working out in our shop.

 

Below is the exam I used with some annotations to give you an idea of what it really took to get to the end. I put in a few surprises because that’s what I needed. Someone that can work through a few surprises. I be interested in hearing your thoughts on this exam. Too Hard? Too Easy? Would you apply for a job that required you to take a test like this?

 

Bill

 

first, here's the script I used to set up the test. I then restored a backup of this database with the name of database B, dropped table t1, and fixed the data file and log file size at 10MB to create some problems to solve as the test progresses. 


 

create database A

go

use A

go

if object_id('t1') is not null

      drop table t1

if object_id('t2') is not null

      drop table t2

 

create table t1

      (c1 int not null,

      c2 int not null,

      c3 varchar(10) not null,

      c4 varchar(100) not null)

 

create table t2

      (c1 int not null,

      c2 int not null,

      c3 varchar(10) not null,

      c4 uniqueidentifier not null)

 

create clustered index ixc_t2__c3__c2 on t2 (c3,c2)

 

declare @i int, @j int, @k int

set nocount on

set @j = 1

while @j < 1000

      begin

            set @i = 1

            while @i < 92

                  begin

                        select @k = floor(rand()*10000000)

insert t1 (c1, c2, c3, c4)

values (@i*@j,

      @k,

      case when @k&5=5 then 'red'

            when @k&3=3 then 'green'

            else 'blue'

            end,

      cast(newid() as varchar(100)))

                        set @i = @i + 1

                  end

            set @j = @j + 1

      end

     

select c1, count(c1) from t1 group by c1 having count(c1) > 1

select c2, count(c2) from t1 group by c2 having count(c2) > 1

select c3, count(c3) from t1 group by c3 having count(c3) > 1

select c4, count(c4) from t1 group by c4 having count(c4) > 1

insert t2

select * from t1

order by c1

 

dbcc showcontig ('t1')

dbcc showcontig ('t2')

 

go


 

And here's the exam paper:

 

 

Name: ___________________________________________       Date: __________________

 

 

Instructions: You may use SQL Server "Books on Line" and all other help files located on this server. Use Query Analyzer when possible. Save all work completed with Query Analyzer to a file using the question number as the name and .sql as the extension. (for example: 1.sql, 2.sql, etc). Save all results from work completed with Query Analyzer to a file using the question number as the name and .txt as the extension. (for example: 1.txt, 2.txt, etc) If you do not use Query Analyzer to complete a task, please indicate what tool you used. Partial credit may be given for all problems attempted. You may ask questions at any time.

 

Watch the applicant complete 1 and 2 then leave them to it

 

1.    Start the SQL Server service and the SQL Agent service  (5 points)

 

Service Manager 5 points

EM 5 points

Services console 2 points

 

 

2.    Detach database A     (2.5 points)

 

A bit of a set up here. Detaching will cause problem for restore in 4

 

3.    Drop database B        (2.5 points)

 

reverse set up, the statement needed is the question

 

4.       Restore database A from the backup file c:\back\A.bak (10 points – 5

      points extra credit for using SQL Litespeed restore and backup file

      c:\back.A.sls)

 

- 3 if not done by QA

will have to delete or move detached files first

 

5.                Attach Database B (10 points)

 

      Copy file c:\save\B_Log.ldf from to c:\mssql\Log\B_Log.ldf        

      Copy file c:\save\B_Data.mdf to c:\mssql\data\B_Data.mdf

      Attach database B to the SQL Server using the files c:\mssql\Log\B_Log.ldf    and c:\mssql\data\B_Data.mdf

 

 

6.    Check for table t1 in database B and drop if found. (5 points)

 

      There is no table t1 in database B

 

7.    Load a table from a flat file. (10 points)

 

Create table t1 as defined below in database B and load data from file c:\save\data.csv into table t1 in database B

     

      table name : t1

            column name       data type                     required

            ------------      ------------------------      ---------

            c1                integer                       yes

            c2                integer                       yes

            c3                from 1 to 10 characters       no

            c4                from 1 to 100 characters      yes

 

Can do 6 and 7 all in the DTS package

Or

use B

create table B.dbo.t1

      (c1 int not null,

      c2 int not null,

      c3 varchar(10) not null,

      c4 varchar(100) not null)

 

 

something along the lines of this necessary to get it to load:

truncate table b.dbo.t1

backup log b with truncate_only

 

alter database B

modify file ( NAME = 'B_Data',

   MAXSIZE = UNLIMITED)

alter database B

modify file ( NAME = 'B_Log',

   MAXSIZE = UNLIMITED)

 

 

 

8.       Add a primary key to table t1 in database B on the unique column. (5 points)

 

alter table b.dbo.t1

add constraint pk_t1__c4

primary key (c4)

 

9.       Index maintenance (10 points)

 

Determine the fragmentation of table t2 in database A.

Remove the fragmentation from table t2 in database A.

Confirm that the fragmentation in table t2 of database A has been removed.

      Explain as necessary (use back of this page if necessary).

     

Before image will document that database A was restored in 4

 

 

 

10.            Server Configuration (5 points)

 

Select @@version

Determine the service pack level of the operating system    _________     

 

Determine the service pack level of the SQL Server          _________

 

Compaq Array Configuration Utility

Determine the number of physical discs, and the RAID level for the drive where the transaction log files of database A reside.

 

Number of Discs   _________

 

RAID level        _________

 

 

11.   T-SQL (15 points - 5 points extra credit for using the "Create Procedure

Basic Template")

 

Create a stored procedure in database A owned by dbo named “get_results” that returns the min and max value for column c2 of table t1 in database B and the name of the user executing the procedure in a single row.

 

      Example output:

            min         max         user

            ----------  ----------  --------------------   

                    12         147  Bill

 

select min(c1), max(c1), suser_sname() from B.dbo.t1

 

12.   List the stored procedures in database A. (5 points)

 

select Name from a.dbo.sysobjects where type = ‘P’

 

13.Security (10 points)

 

Add a SQL user named with your first name. Give this user the correct

permissions necessary to execute the procedure “get_results”.

 

sp_helprotect ‘dbo.get_results’

 

14.   Log in as this user in Query Analyzer and execute the stored procedure

“get_results”.  (2.5 points)

 

output should be :

 

min         max         user 

----------- ----------- --------------

1           90909       <name>

 

15.Stop the SQL Agent Service. (2.5 points)

 

Important to make sure it was started in 1. If it;s off when they leave you know they did both.