03 September 2007 12:19 Alex_Kuznetsov

The price of not qualifying stored procedure's names with schema names

Just a very brief example:

1. Create 10K stored procedures. 

DECLARE @i INT, @SQL NVARCHAR(300)
SELECT @i = 0
WHILE @i < 10000 BEGIN
  SET @i = @i + 1
  SET @SQL = 'CREATE PROCEDURE dbo.DummyProc' + CAST(@i AS NVARCHAR(10)) + ' AS RETURN 0'
  EXEC sp_executesql @SQL
END
GO

 2. Run them.

DECLARE @i INT, @j INT, @d DATETIME, @SQL NVARCHAR(300), @SQL_to_run NVARCHAR(300)
SELECT @i = 0, @j = 0, @d = getdate()
WHILE @j < 3 BEGIN
  SET @j = @j + 1
  IF @j = 1 BEGIN
    SET @SQL = 'EXEC DummyProc'
  END ELSE BEGIN
    SET @SQL = 'EXEC dbo.DummyProc'
  END
  WHILE @i < 10000 BEGIN
    SET @i = @i + 1
    SET @SQL_to_run = @SQL + CAST(@i AS NVARCHAR(10))
    --PRINT @SQL_to_run
    IF @j <3 BEGIN
      EXEC sp_executesql @SQL_to_run
    END
  END
  SELECT DATEDIFF(ms, @d, GEtdate()) as ms
  SELECT @i = 0, @d = getdate()
END
GO

 3. Clean up.

DECLARE @i INT, @SQL NVARCHAR(300)
SELECT @i = 0
WHILE @i < 10000 BEGIN
  SET @i = @i + 1
  SET @SQL = 'DROP PROCEDURE dbo.DummyProc' + CAST(@i AS NVARCHAR(10))
  EXEC sp_executesql @SQL
END
GO

The results:

ms - no schema names
-----------
3860

(1 row(s) affected)

ms - with schema names
-----------
640

(1 row(s) affected)

ms - the overhead of running the loop without sp_executesql calls
-----------
46

 

 However, if you repeatedly call one and the same procedure, you will not notice much difference one way or another:

CREATE PROCEDURE dbo.DummyProc
AS
RETURN 0
GO
CREATE PROCEDURE dbo.Run_SQL_100K_times
  @SQL NVARCHAR(30)
AS
DECLARE @i INT, @d DATETIME
SELECT @i = 0, @d = getdate()
WHILE @i < 100000 BEGIN
  SET @i = @i + 1
  EXEC sp_executesql @SQL
END
SELECT DATEDIFF(ms, @d, GEtdate()) as ms, @SQL AS SQL
GO
EXEC dbo.Run_SQL_100K_times 'EXEC DummyProc'
EXEC dbo.Run_SQL_100K_times 'EXEC dbo.DummyProc'
GO
DROP PROCEDURE dbo.Run_SQL_100K_times
DROP PROCEDURE dbo.DummyProc
GO

ms          SQL
----------- ------------------------------
2330        EXEC DummyProc

(1 row(s) affected)

ms          SQL
----------- ------------------------------
2310        EXEC dbo.DummyProc

(1 row(s) affected)

Comments

# re: The price of not qualifying stored procedure's names with schema names

04 September 2007 05:55 by Uri Dimant

Hi Alex

On what version you tested this script ? On SQL Server 2005 Dev Edition (SP2) i get almost the same figuries...

Some good information

http://sqlblog.com/blogs/linchi_shea/archive/2007/07/05/performance-impact-of-procedure-calls-without-owner-qualification-sql-server-2000.aspx

# re: The price of not qualifying stored procedure's names with schema names

04 September 2007 15:06 by Alex_Kuznetsov

Hi Uri,

The version:

Microsoft SQL Server 2005 - 9.00.1399.06 (X64)

Oct 14 2005 00:35:21

Copyright (c) 1988-2005 Microsoft Corporation

Developer Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 1)

Yes, we are not on sp2.

There is a difference between Linchi Shea's benchmarks and mine:

Linchi Shea calls the same procedures over and over again, I call different ones, and each procedure is called only once. Yet when I fixed a major problem with my benchmarking:

DECLARE @i INT, @j INT, @d DATETIME, @SQL NVARCHAR(300), @SQL_to_run NVARCHAR(300)

SELECT @i = 0, @j = 0, @d = getdate()

WHILE @j < 5 BEGIN

 SET @j = @j + 1

 IF @j IN (1,3) BEGIN

   SET @SQL = 'EXEC DummyProc'

 END ELSE BEGIN

   SET @SQL = 'EXEC dbo.DummyProc'

 END

 WHILE @i < 10000 BEGIN

   SET @i = @i + 1

   SET @SQL_to_run = @SQL + CAST(@i AS NVARCHAR(10))

   --PRINT @SQL_to_run

   IF @j <5 BEGIN

     EXEC sp_executesql @SQL_to_run

   END

 END

 SELECT DATEDIFF(ms, @d, GEtdate()) as ms

 SELECT @i = 0, @d = getdate()

END

I got results almost identical to his. False alarm. Sorry for that.

My original difference was caused by compilation of 10K stored procedures in the first run.