How enabling DMF affects speed of table creation
Perf hit is expected, but looks like currently it's quite a lot.
Say I can create ~500 tables and views (250+250) per second without DMF.
Once I enforce naming conventions (tbl% for tables and vw% for views), the rate of object creation falls to 3 objects per second.
Seems like a pretty high tax.
Also, database that does not subscribe to the policy is experiencing a tangible hit as well (500 -> 200).
Is this expected? Has this been noticed and any conclusions drawn yet? Will there be improvements?
Please let me know if I should file a connect bug.
Results (policy is enabled for Database1 and not enabled for Database2):
With policy enabled:
Test 1: Creating tables and views in database 1
28objects in 10000ms
Test 2: Creating tables and views in database 1 - all in one transaction
34objects in 10000ms; including commit time: 10350ms Test 3: Creating tables and views in database 2
2008objects in 10000ms
Test 4: Creating tables and views in database 4 - all in one transaction
2264objects in 10000ms; including commit time: 10033ms
Policy disabled completely:
Test 1: Creating tables and views in database 1
5592objects in 10000ms
Test 2: Creating tables and views in database 1 - all in one transaction
14086 objects in 10000ms; including commit time: 10220ms
Test 3: Creating tables and views in database 2
7588objects in 10000ms
Test 4: Creating tables and views in database 4 - all in one transaction
14456 objects in 10000ms; including commit time: 10233ms
For reference, here's the test script I used:
/*
USE master
DROP DATABASE DMFTest1
DROP DATABASE DMFTest2
GO
CREATE DATABASE DMFTest1 ON
( NAME = N'DMFTest1_1', FILENAME = N'H:\DMFTest1_1.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
,( NAME = N'DMFTest1_2', FILENAME = N'I:\DMFTest1_2.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
,( NAME = N'DMFTest1_3', FILENAME = N'J:\DMFTest1_3.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
,( NAME = N'DMFTest1_4', FILENAME = N'K:\DMFTest1_4.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
LOG ON
( NAME = N'DMFTest1_log', FILENAME = N'O:\DMFTest1_log.LDF' , SIZE = 100000KB , MAXSIZE = 500000KB , FILEGROWTH = 10%)
GO
CREATE DATABASE DMFTest2 ON
( NAME = N'DMFTest2_1', FILENAME = N'H:\DMFTest2_1.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
,( NAME = N'DMFTest2_2', FILENAME = N'I:\DMFTest2_2.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
,( NAME = N'DMFTest2_3', FILENAME = N'J:\DMFTest2_3.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
,( NAME = N'DMFTest2_4', FILENAME = N'K:\DMFTest2_4.MDF' , SIZE = 10000KB , MAXSIZE = 20000KB, FILEGROWTH = 10%)
LOG ON
( NAME = N'DMFTest2_log', FILENAME = N'O:\DMFTest2_log.LDF' , SIZE = 100000KB , MAXSIZE = 500000KB , FILEGROWTH = 10%)
GO
ALTER DATABASE DMFTest1 SET RECOVERY SIMPLE
ALTER DATABASE DMFTest2 SET RECOVERY SIMPLE
GO
USE DMFTest1
GO
CREATE PROCEDURE DropTablesAndViews
@TablePrefix varchar(20)
,@ViewPrefix varchar(20)
AS
DECLARE @s varchar(max)
BEGIN TRAN
WHILE EXISTS (SELECT TOP 1 Name FROM sys.views where name like @ViewPrefix+'%')
BEGIN
SELECT TOP 1 @s = 'DROP VIEW '+ Name FROM sys.views where name like @ViewPrefix+'%'
EXEC(@s)
END
WHILE EXISTS (SELECT TOP 1 Name FROM sys.tables where name like @TablePrefix+'%')
BEGIN
SELECT TOP 1 @s = 'DROP TABLE '+ Name FROM sys.tables where name like @TablePrefix+'%'
EXEC(@s)
END
COMMIT
GO
USE DMFTest2
GO
CREATE PROCEDURE DropTablesAndViews
@TablePrefix varchar(20)
,@ViewPrefix varchar(20)
AS
DECLARE @s varchar(max)
BEGIN TRAN
WHILE EXISTS (SELECT TOP 1 Name FROM sys.views where name like @ViewPrefix+'%')
BEGIN
SELECT TOP 1 @s = 'DROP VIEW '+ Name FROM sys.views where name like @ViewPrefix+'%'
EXEC(@s)
END
WHILE EXISTS (SELECT TOP 1 Name FROM sys.tables where name like @TablePrefix+'%')
BEGIN
SELECT TOP 1 @s = 'DROP TABLE '+ Name FROM sys.tables where name like @TablePrefix+'%'
EXEC(@s)
END
COMMIT
*/
GO
USE
DMFTest1DECLARE
@TestDurationMSint= 10000DECLARE
@TablePrefixvarchar(20)='tblGood'DECLARE
@ViewPrefixvarchar(20)='vwGood'DECLARE
@iint= 0, @svarchar(max)--cleanup
EXEC
DropTablesAndViews @TablePrefix,@ViewPrefixDECLARE
@StartTimedatetimeDECLARE
@EndTimedatetimeSET
@StartTime=GetDate()SET
@EndTime=DATEADD(ms,@TestDurationMS,@StartTime)SET
@i=0WHILE
GetDate()< @EndTimeBEGIN
SET @s='CREATE TABLE '+@TablePrefix+CONVERT(VARCHAR(20),@i)+' (i INT NOT NULL)'EXECUTE(@s)SET @s='CREATE VIEW '+@ViewPrefix+CONVERT(VARCHAR(20),@i)+' AS SELECT * FROM tblGood'+CONVERT(VARCHAR(20),@i)EXECUTE(@s)SET @i+=1END
EXEC
DropTablesAndViews @TablePrefix,@ViewPrefixSET
@StartTime=GetDate()SET
@EndTime=DATEADD(ms,@TestDurationMS,@StartTime)SET
@i=0BEGIN
TRANWHILE
GetDate()< @EndTimeBEGIN
SET @s='CREATE TABLE '+@TablePrefix+CONVERT(VARCHAR(20),@i)+' (i INT NOT NULL)'EXECUTE(@s)SET @s='CREATE VIEW '+@ViewPrefix+CONVERT(VARCHAR(20),@i)+' AS SELECT * FROM tblGood'+CONVERT(VARCHAR(20),@i)EXECUTE(@s)SET @i+=1END
COMMIT
USE
DMFTest2EXEC
DropTablesAndViews @TablePrefix,@ViewPrefixSET
@StartTime=GetDate()SET
@EndTime=DATEADD(ms,@TestDurationMS,@StartTime)SET
@i=0WHILE
GetDate()< @EndTimeBEGIN
SET @s='CREATE TABLE '+@TablePrefix+CONVERT(VARCHAR(20),@i)+' (i INT NOT NULL)'EXECUTE(@s)SET @s='CREATE VIEW '+@ViewPrefix+CONVERT(VARCHAR(20),@i)+' AS SELECT * FROM tblGood'+CONVERT(VARCHAR(20),@i)EXECUTE(@s)SET @i+=1END
EXEC
DropTablesAndViews @TablePrefix,@ViewPrefixSET
@StartTime=GetDate()SET
@EndTime=DATEADD(ms,@TestDurationMS,@StartTime)SET
@i=0BEGIN
TRANWHILE
GetDate()< @EndTimeBEGIN
SET @s='CREATE TABLE '+@TablePrefix+CONVERT(VARCHAR(20),@i)+' (i INT NOT NULL)'EXECUTE(@s)SET @s='CREATE VIEW '+@ViewPrefix+CONVERT(VARCHAR(20),@i)+' AS SELECT * FROM tblGood'+CONVERT(VARCHAR(20),@i)EXECUTE(@s)SET @i+=1END
COMMIT
SELECT
'Should be 0'=@@trancount
