Skip to content

Commit 42b5b10

Browse files
committed
Simple benchmarks for query plan reuse.
1 parent 5b573d9 commit 42b5b10

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ group :development do
1919
gem 'rake', '>= 0.8.7'
2020
gem 'mocha', '0.9.8'
2121
gem 'shoulda', '2.10.3'
22+
gem 'bench_press'
2223
platforms :mri_18 do
2324
gem 'ruby-prof', '0.9.1'
2425
gem 'ruby-debug', '0.10.3'

test/profile/query_plan_complex.rb

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
=begin
2+
3+
Query Plan Complex
4+
==================
5+
Author: Ken Collins
6+
Date: May 22, 2011
7+
Summary: Benchmark complex cached query plan reuse in SQL Server.
8+
9+
System Information
10+
------------------
11+
Operating System: Mac OS X 10.6.7 (10J869)
12+
CPU: Quad-Core Intel Xeon 2.66 GHz
13+
Processor Count: 4
14+
Memory: 24 GB
15+
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.6.0], MBARI 0x6770, Ruby Enterprise Edition 2011.03
16+
17+
"Simple - Query Plan Reuse" is up to 88% faster over repetitions
18+
-----------------------------------------------------------------
19+
20+
Simple - Query Plan Reuse 0.230067014694214 secs Fastest
21+
Simple - Dynamic SQL 1.99195981025696 secs 88% Slower
22+
23+
=end
24+
25+
require 'rubygems'
26+
require 'bundler'
27+
Bundler.setup
28+
require 'tiny_tds'
29+
require 'bench_press'
30+
31+
extend BenchPress
32+
33+
author 'Ken Collins'
34+
summary 'Benchmark complex cached query plan reuse in SQL Server.'
35+
reps 500
36+
37+
@client = TinyTds::Client.new :host => 'mc2008', :username => 'rails'
38+
39+
40+
measure "Simple - Dynamic SQL" do
41+
sql = "
42+
SELECT TOP (1) [companies].id
43+
FROM [companies]
44+
LEFT OUTER JOIN [companies] [clients_using_primary_keys_companies] ON [clients_using_primary_keys_companies].[firm_name] = [companies].[name]
45+
AND [clients_using_primary_keys_companies].[type] IN (N'Client', N'SpecialClient', N'VerySpecialClient')
46+
WHERE [companies].[type] IN (N'Firm')
47+
AND [companies].[id] = #{rand(1000000)}
48+
GROUP BY [companies].id
49+
ORDER BY MIN(clients_using_primary_keys_companies.name)"
50+
@client.execute(sql).do
51+
end
52+
53+
measure "Simple - Query Plan Reuse" do
54+
sql = "
55+
EXEC sp_executesql N'
56+
SELECT TOP (1) [companies].id
57+
FROM [companies]
58+
LEFT OUTER JOIN [companies] [clients_using_primary_keys_companies] ON [clients_using_primary_keys_companies].[firm_name] = [companies].[name]
59+
AND [clients_using_primary_keys_companies].[type] IN (N''Client'', N''SpecialClient'', N''VerySpecialClient'')
60+
WHERE [companies].[type] IN (N''Firm'')
61+
AND [companies].[id] = @0
62+
GROUP BY [companies].id
63+
ORDER BY MIN(clients_using_primary_keys_companies.name)',
64+
N'@0 int',
65+
@0 = #{rand(1000000)}"
66+
@client.execute(sql).do
67+
end
68+

test/profile/query_plan_simple.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
=begin
2+
3+
Query Plan Simple
4+
=================
5+
Author: Ken Collins
6+
Date: May 22, 2011
7+
Summary: Benchmark simple cached query plan reuse in SQL Server.
8+
9+
System Information
10+
------------------
11+
Operating System: Mac OS X 10.6.7 (10J869)
12+
CPU: Quad-Core Intel Xeon 2.66 GHz
13+
Processor Count: 4
14+
Memory: 24 GB
15+
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.6.0], MBARI 0x6770, Ruby Enterprise Edition 2011.03
16+
17+
"Simple - Query Plan Reuse" is up to 58% faster over repetitions
18+
-----------------------------------------------------------------
19+
20+
Simple - Query Plan Reuse 0.20799994468689 secs Fastest
21+
Simple - Dynamic SQL 0.49638819694519 secs 58% Slower
22+
23+
=end
24+
25+
require 'rubygems'
26+
require 'bundler'
27+
Bundler.setup
28+
require 'tiny_tds'
29+
require 'bench_press'
30+
31+
extend BenchPress
32+
33+
author 'Ken Collins'
34+
summary 'Benchmark simple cached query plan reuse in SQL Server.'
35+
reps 500
36+
37+
@client = TinyTds::Client.new :host => 'mc2008', :username => 'rails'
38+
39+
40+
measure "Simple - Dynamic SQL" do
41+
@client.execute("SELECT TOP(1) * FROM [posts] WHERE [id] = #{rand(1000000)}").do
42+
end
43+
44+
measure "Simple - Query Plan Reuse" do
45+
@client.execute("EXEC sp_executesql N'SELECT TOP(1) * FROM [posts] WHERE [id] = @0', N'@0 int', @0 = #{rand(1000000)}").do
46+
end
47+

0 commit comments

Comments
 (0)