Quest Software – Benchmark Factory – v7


Back in May 2014, Kevin Stern of Quest reached out to me and let me in on the fact that they have released a new version of Quest Benchmark Factory.

This was through a comment he posted @

Since then I have wanted to download the new version and kick it around a bit.

In this post, I will talk a bit about my experience.


Database – Preparation


Database – Sample

We will use the AdventureWorks Database.  Unfortunately, our target database is SQL Server Express and that product version does not ship with sample databases.  And, so we downloaded a version from Microsoft; specifically


Restore Database

USE [master]
RESTORE DATABASE [AdventureWorks2014] 
FROM DISK = N'C:\Downloads\AdventureWorks2014.bak' WITH FILE = 1
  , MOVE N'AdventureWorks2014_Data' TO N'E:\DATA\AdventureWorks2014_Data.mdf'
  , MOVE N'AdventureWorks2014_Log' TO N'F:\LOG\AdventureWorks2014_Log.ldf'
  , STATS = 5


Database – Objects

As we have an entire pre-written database for our use, we will need very minimal modifications.
Actually, we will simply add two stored procedure that serve same purpose; which is to query the person table.

The Stored Procedures will accept two arguments firstname and lastname and will filter against the person.person table based on the argument contents.





Here is SP 1, it exclusively uses the or clause.


use [AdventureWorks2014]

if object_id('dbo.usp_PersonFetchFilteredOnName_1') is null
    exec('create procedure dbo.usp_PersonFetchFilteredOnName_1 as select 1/0 as [shell]')

alter procedure dbo.usp_PersonFetchFilteredOnName_1
      @Firstname nvarchar(50) = null
    , @Lastname  nvarchar(50) = null

    set nocount on;

    select *
    from   [Person].[Person]
                       (@Firstname is null)
                    or (@Firstname = '')
                    or (Firstname = @Firstname)
                       (@Lastname is null)
                    or (@Lastname = '')
                    or (Lastname = @Lastname)






Here is SP 2, it uses the case clause.

use [AdventureWorks2014]

if object_id('dbo.usp_PersonFetchFilteredOnName_2') is null

    exec('create procedure dbo.usp_PersonFetchFilteredOnName_2 as select 1/0 as [shell]')

alter procedure dbo.usp_PersonFetchFilteredOnName_2
      @Firstname nvarchar(50) = null
    , @Lastname  nvarchar(50) = null

    set nocount on;

    select *
    from   [Person].[Person]

                        Firstname = 
                                        when (@Firstname is null) then Firstname
                                        when (@Firstname = '') then Firstname
                                        else @Firstname


                        Lastname = 
                                        when (@Lastname is null) then Lastname
                                        when (@Lastname = '') then Lastname
                                        else @Lastname


Database – Sample Data

To get representative test data, we will use bcp to get data out of our database.


bcp "select '\"' + Firstname + '\"' as Firstname, '\"' + Lastname + '\"' as Lastname, Count(*) as Cnt from [AdventureWorks2014].[Person].[Person] group by Firstname, Lastname order by count(*) desc " queryout person.txt -S.\SQLEXPRESS_V2014  -E -T -c -t","

if not exist c:\sqlserver\data mkdir c:\sqlserver\data
xcopy C:\Personal\DanielAdeniji\Blog\QuestSoftware\BenchmarkFactory\v7\DatabaseScripts\GenerateTestData\person.txt  c:\sqlserver\data /Q /y /D



ODBC Data Source

System Data Source

We created a System ODBC Data Source.




Data Source Name and SQL Server



Database Connection Detail



Quest Benchmark Factory





Here is a table that shows our Benchmark Factory (BF) Script:


Scenario Parameter  Value
Transaction 1
 SQL exec AdventureWorks2014.dbo.usp_PersonFetchFilteredOnName_1  ?,?
 Param1=@Firstname  $BFFileArray(“C:\sqlserver\data\person.txt”,SEQUENTIAL,1)
 Param2=@lastname  $BFFileArray(“C:\sqlserver\data\person.txt”,SEQUENTIAL,2)
Transaction 2
 SQL exec AdventureWorks2014.dbo.usp_PersonFetchFilteredOnName_2  ?,?
 Param1=@Firstname  $BFFileArray(“C:\sqlserver\data\person.txt”,SEQUENTIAL,1)
 Param2=@lastname  $BFFileArray(“C:\sqlserver\data\person.txt”,SEQUENTIAL,2)




Transaction Mix

Here is our Transaction Mix




Transaction SQL



Transaction Bind Parameters









Here is what our User-load looks like.

We will start with a single user, and move on to 5, 10, 15, and 20 users.








Here is what the Agent Screen looks like initially.










The change between the Before and After is that we checked our computer name to indicate it is part of our test.



If you do not make that test, you will see a warning that reads


Missing Agents To Use For Testing









Our test result is pasted below:


Userload 20 Results




Metric SP-1 SP-2
 Avg Response Time  0.014  0.018
 Avg. Transaction Time  0.014  0.018
 Executions  1771  1766
 Rows  8712  8707
 Errors  0  0



Quick Explanation


  • The second stored procedure is a bit slower
  • SP 1 executed 1771 times, while SP2 executed a slightly smaller 1766; so when allocated identical time scope we were able to accomplish slightly more with SP1
  • As we iterated a bit more with SP1, we returned a bit more records



SQL Sentry Plan Explorer

In all truth, though second Stored Procedure is a tad bit slower, I still could not tell why.

And, so I installed and launched Huntersville’s own SQL Sentry Plan Explorer.  See how I little know it took a young lady on Bart to tell me that Huntersville is a suburb of Charlotte, North Carolina.


Estimated Plan





Actual Plan


To get the Actual Plan I entered the query.


 Test Query:

      @Firstname nvarchar(50) 
    , @Lastname  nvarchar(50) 

      @Firstname = 'Laura'
    , @Lastname  = 'Norman'

exec dbo.usp_PersonFetchFilteredOnName_1
      @Firstname = @Firstname
    , @Lastname  = @Lastname

exec dbo.usp_PersonFetchFilteredOnName_2
      @Firstname = @Firstname
    , @Lastname  = @Lastname


Actual Plan

Actual Plan







Metric SP-1 SP-2
Estimated Cost 6.2% 93.8%
Duration 14 20
CPU 15 32
Reads 124 128
Estimated I/O  5.5%  94.5%
Est Rows  1  632
Actual 124 128
Estimated I/O  5.5%  94.5%
Est Rows  1  632
Actual Rows 5 5
Key Look up 1 1
Index Scan  1 1



In summary, SQL Server thinks the second query is much worse than it ended up been.




There are so many tools one can use to dig a bit deeper into queries.  Quest Software certainly earns its honorable role and belong in the tool-bag of SQL aficionados.


Microsoft – SQL Server – Profiler – Database ” cannot be opened because it is offline


For some odd reason, I ended up in Microsoft SQL Server Profiler land looking at session traces.


Database cannot be opened

As I dug deeper, I noticed quite a few repeating entries bearing:

Database 'DBLabInMemory' cannot be opened because it is marked offline.






Got me thinking where is the error coming from?

  • Another Application on my machine
  • SQL Server Agent
  • Internet Parlance


I tried everything:

  • Using “SQL Server Configured Manager”, disabled TCP/IP Network Protocol for the SQL Instance
  • Using Services Management Console, determined that SQL Sever Agent is not enabled to run
  • Using MS Network Monitor, captured network traffic – No 1433
  • Using Netstat.exe, captured and analyzed network traffic
  • Reviewed SQL Server Error Log – Knowing that Microsoft has done a very good job writing much more detailed connectivity errors into its errorlog


Nada.  Nothing lined up.




Create a new database

Created a new database unknown to the world and no other application

create database [DBOffline];

alter database [DBOffline] set offline;


Monitor SQL Server Profiler

Monitor SQL Server Profiler and see if same issue occurs for this new database.

DatabaseCannotBeOpened - DB Name -  DBOffline

And, yes it does.




Column Interpretation
Login Name = sa sa
spid < 50 System process has spid less than 50
ClientProcessID is blank Internal Session


It is an internal SQL Server Session and not anything we are doing.  One of the Internal processes is trying to perform ‘housekeeping’ and it is not checking the status of the DB, before trying to access\open it.



It is my humble opinion that SQL Server Internal processes should not surface errors caused by an Administrators’s intentional act of having a database offline.



James Taylor


Ever since Usher we have all been confessing.  So let me join in.


J.T. Taylor

I never quite liked James Taylor.  I think the reason is that he was James Taylor before “Kool and The Gang’s” J.T. Taylor.  I really like Kool and Gang and wanted it’s front man to have that name.


James Taylor

But then I like Indie.Arie and loved her rendition of “Secret of Life”:

Secret of Life


And, this morning heard Dixie Chick’s “Shower the People” and James and Mark Knopfler’s – “Sailing to Philadelphia”:


Shower The People


Mark Knopfler & James Taylor – Sailing to Philadelphia


And, yes you read that right the same Mark Knopfler of Dire Strait’s fame.

There are some people that make it hard to root against them, James Taylor is one of them.

A quick read of the links that are noted in the Reference section talks about the healing grace of family, friends, and music.

In public, I am happy to oblige James Taylor and allow him his name.



James Taylor


Jeremiah Dixon



VLC on CentOS – Installation


Time was one would have to search around to find Video and Audio codec files to play videos on a personal computer.  But, like Mase and Brandy “I have sat on top of the World” since someone introduced me to VLC.

From that time till now, that is all I use on MS Windows, Apple OSX, and Linux.



Googled for tested paths towards installing VLC on CentOS.  The links that came up are:

The instructions basically states that we should avail the EPEL repository along with the RPMForge repository.


Repository – EPEL

The EPEL repository contains prerequisite files.

# EPEL6 is an add on repository for RHEL and it's variants. It contains packages that
# are not shipped
sudo yum localinstall --nogpgcheck

# epel-release-6-8.noarch.rpm
sudo rpm -Uvh


Repository – RPMForge

The RPMForge repository contains the VLC RPM.

We will prepare our system for RPMForge installs by doing the following:

  • Install the repository GPG Key
  • Download the rmpg-release package
  • Verify the downloaded package
  • Install the package
  • Review the installed package


Based on the instructions available @ – Additional Resources >> Repositories >> RPMForge ( ), here is a quick script that we used.


# Install RPMForge

#Install DAG's GPG key
sudo rpm --import

#Download the package (x64)
sudo wget -O "rpmforge-release-0.5.3-1.el6.rf.i686.rpm"  ""

#Download the package (x32)
sudo wget -O "rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm" ""

#Verify the package you have downloaded
rpm -K rpmforge-release-0.5.3-1.el6.rf.*.rpm

#Install the package
sudo rpm -i rpmforge-release-0.5.3-1.el6.rf.*.rpm

#Review Package
sudo rpm -qa | grep -i rpmforge


Ensure VLC RPM Package Availability

Using “yum info“, let us make sure that everything is in place for a good install.


Sample :

sudo yum info vlc

Output :




Install VLC


Install VLC via rpm.

Sample :

sudo yum install vlc






Once installed, one can initiate the app from the terminal mode by issuing VLC.

Or via the desktop menu – Sounds & Video \ “VLC Media Player”.




I experienced a couple of problems preparing the repositories. I was able to scale them through others well lighted path.

I have documented those steps below:


Error: Cannot find a valid baseurl for repo: rpmfusion-free


sudo yum localinstall –nogpgcheck


sudo yum localinstall –nogpgcheck


But, got the same error:

Error: Cannot find a valid baseurl for repo: rpmfusion-free


Solution Guide

How to fix rpmfusion-(non)free repo error in CentOS 6.4


The steps are:

  • Identify the Repository that rpmfusion is using
  • Remove Fedora RPM Fusion files
  • Install Prerequisite (EPEL 6)


Which Repo is rpmfusion* using?

Query active repositories by issuing “yum repolist enabled” request:

yum repolist enabled | grep -i rpmfusion


listRepos for rpmFusion

We can see that rpmFusion is using the one for Fedora 6.

Remove Fedora Files

Remove installed rpmfusion repositories

#RPM Fusion for Fedora 6 - Free
sudo rpm -e rpmfusion-free-release

#RPM Fusion for Fedora 6 - Free - Updates
sudo rpm -e rpmfusion-free-updates-release   



Identify Redhat CentOS ( EL ) Files

Identify the files that we need:

Visit and be sure to identify the URL to the files that we need for EL (Enterprise Linux ).




Install CentOS Files

Here is the script that we used for installing the RPMFusion files:


# EPEL6 is an add on repository for RHEL and it's variants. It contains packages RHEL.
# yum local install
sudo yum localinstall --nogpgcheck

# epel-release-6-8.noarch.rpm
sudo rpm -Uvh

# Install RPMFusion - v6 - free - works on 32/64 bit
sudo yum localinstall --nogpgcheck 

# Install RPMFusion - v6 - nonfree - works on 32/64 bit
sudo yum localinstall --nogpgcheck




Error: ERROR 22 – “The requested URL returned error: 403 Forbidden”



sudo yum localinstall –nogpgcheck
But, got the error: [Errno 14] PYCURL ERROR 22 – “The requested URL returned error: 403 Forbidden”

Trying other mirror.

Error: Cannot retrieve repository metadata (repomd.xml) for repository: CentALT. Please verify its path and try again


Validate Problem

Review the current contents of the /etc/yum.repos.d/centalt.repo file.



cat /etc/yum.repos.d/centalt.repo






Solution Guide

Here is the link we will follow to hopefully repair the problem.

repository metadata (repomd.xml) for repository: mratwork-centalt

which states to change from a specific URL to a mirrored one.

In essence we are changing the baseurl from$basearch/ to$basearch/.




# mkdir /etc/yum.repos.d/deprecated/20140823
sudo mkdir -p /etc/yum.repos.d/deprecated/20140823

#backup file
sudo cp /etc/yum.repos.d/centalt.repo /etc/yum.repos.d/deprecated/20140823

#Change baseurl from old to new$basearch/$basearch/ 
sudo sed -i 's/\/centalt/g' /etc/yum.repos.d/centalt.repo



References – Linux Installation Tools

References – Tool – YUM


References – Tool – RPM


References – Tool – Generic


References – Repository

References – Repository – epel


References – RPMForge


References – Linux Commands


References – Linux Commands – sed


References – VLC – Installation


References – VLC – Installation – Q&A



References – Repository – Installation – Errors


References – Error – Repository Metadata (respond.xml) for repository – CentAlt


References – Error – Fix rpmfusion


Microsoft – Internet Information Server (IIS) – Include Files


Here is a follow-up post to an earlier one titled “Microsoft – Internet Information Server – Error – An error occurred on the server when processing the URL. Please contact the system administrator”  ( )


Error Message


Th error message read:


An error occurred on the server when processing the URL. Please contact the system administrator.


An error occurred on the server when processing the URL


Failed Request Tracing Rules

Here is the important data we uncovered through “Failed Request Tracing Rules”.






Source Code


We can resolve the problem by replacing “include virtual” with “include file”.

Here is our included file.


	Const CompanyName = "Dell"
	Const VersionNumber = "v 1"




Here is the Source Code that unsuccessfully attempts to incorporate the included file using “include virtual


<!-- #include virtual ="/customize/" -->


	Response.Write "Hello - My name is Sam"




Here is the Source Code that successfully incorporates the included file using “include file“.


<!-- #include file = "customize/" -->


	Response.Write "Company Name:  " + CompanyName + "</BR>"
Version #: <%= VersionNumber %>



Top Level Web Site


We can also address the problem by making our web site a top level web site.

And, so we create the site as a top level web site.

In the image below that site is known as LabVDIR.



Site Bindings

Once we create a new top level website, we will likely have conflicts with our existing web site.

To address let us change the new site’s bindings.

To do so, please follow the following sequence:

  • Select the web site
  • Right click on your selection and from the drop-down menu select “Edit Bindings”





As we will like to keep using the default HTTP port of 80, we will avoid conflicts by invoking a unique “Host name“.

The usual path is that one chooses an host name and then create corresponding aliases name using DNS or host file entries.

But, we will go with the new novel thoughts that have public DNS domain names that point to localhost.

The public DNS name that came by via Goggling is  Please visit and read more.

Here is where we arrive:





Include File” works, but it is a bit restrictive as one has to maintain strict folder structures.

Top Level Web Site” works, as well.  But, keep in mind that you are essentially creating a distinct web site and duplicating some configuration changes.

ASP.Net uses web.config files and so hopefully some of the configurations will carry over.





References – LocalHost

Microsoft – Internet Information Server – Error – An error occurred on the server when processing the URL. Please contact the system administrator.


Playing around with a Vendor’s web site and found an unhelpful error.


Error Message

Error Message

An error occurred on the server when processing the URL. Please contact the system 

If you are the system administrator please click here to find out more about this 

Error Image


Create Lab Web Site


Let us go create a small website and see if we can reach same error, troubleshoot and re-mediate it.


Create Web Application


Let us create a new Application.  We will use the instructions at:

Create a Web Application (IIS 7)





Create Virtual Directory


Let us create a new Application.  We will use the instructions at:

Create a Virtual Directory (IIS 7)


Add Virtual Directory

Here is what we we did:

  • Select the web site
  • Right click on your selection and from the drop down menu, select “Add Virtual Directory”
  • In the “Add Virtual Directory” window, enter the following information
    • Alias :- customize
    • Physical path :- E:\DanielAdeniji\website\Lab\LabVDIR\customize





List Virtual Directories

  • Select the web site
  • Access the Actions pane
  • Click on “Access Virtual Directories”





Source Code

Let us create a couple of Classic ASP Files:



A simple hello world ASP Page.


	Response.Write "Hello - My name is Sam"




A bit more complex ASP Page that includes an “header” file.

<!-- #include virtual ="/customize/" -->


	Response.Write "Hello - My name is Sam"




Here is the header file.

Const CompanyName = "Sallie Mae"














Let us use Failed Request Tracing Rules to attempt to trouble shoot.


Failed Request Tracing Rules



Launch the Failed Request Tracing Rules configuring by accessing our Web Application, switching to the “Features View”, and selecting the “Failed Request Tracing Rules” icon.




Specify Content To Trace

In the “Specify Content to Trace” window, for completeness, let us choose “All Content (*)”



Define Trace Conditions

In the “Define Trace Conditions” window, for fullness, let us enter 100-999 as our “Status code(s)”

Specify Trace Providers

In the “Define Trace Provider” window, we will choose all Providers “ASP”/”ASPNET” / “ISAPI Extension”, “WWW Server”.




We will still notice an Alert window that states “Failed request tracing is not enable for this website”:


To address, please do the following:

  • Access the top level Web Site
  • In the Access panel, in the Configure sub panel, access the Failed Request option


Please ensure that the “Enable” choice is made and hopefully choose a non-system folder with plenty of room.





Once fully configured, we will launch our browser and retry.  Got same error, but now we also have generated diagnostic files.




The error states that IIS is looking for our included file underneath the “E:\WebSiteEmpty\Customize\headerinc” folder.

It is in effect looking under our main web site and not underneath our web application.

There are a couple of ways to address this.  They include making our web site a top level web site and not just a web application.




Life is good as everywhere I need to be is still Bart-able and I just finished reading a sincere love story.  It is Barbara Delinsky’s “The Carpenter’s Lady“.


References – Microsoft – IIS

Microsoft – Management Studio – Data Grid – Entering Special Characters


As much as I love working with Management Studio there are still areas that perplex me.


Data Entry

Here I am trying to correct some rows that has “bad data” in them, but Data-grid is spitting back at me.

For example, the data reads “Café Lower Level Eest” & “Café Lower Level Wast” , but Caf&#233 should have read Café; #233 is the ASCII Code for é





SQL Update Statements

The easiest path will be to write a simple, straight forward SQL Update statements, but I do not feel like it.



In Data Entry pane, I tried many a times to correct by entering ALT-233.  But, no go.

BTW, why 232?

Well, if one accesses the ASCII table @ ASCII-Code,com ( ), one will see that é maps to 232.





Character Map

  • Launched Accessories \ System Tools \ Character Map
  • Chose the right font – not that it matters in this case
  • Select the Character you want
  • Access the Select button
  • Access the Copy button
  • Return to Management Studio and paste your selection


Latin Small Letter E with Acute



Entering data in another tool and copying and pasting works.






Management Studio Tips