sql-server-2008-r2 – 行使sp_启动用户存储进程的名称如故错误
我的一位同事在我们的SQL Server 2008 R2数据库sp_something中定名了一个存储进程.当我看到这个时,我立即想到:“那是错的!”并开始搜刮我的书签 this online article,这表明白为什么它是错误的,以是我可以向我的同事提供一个表明. 在文章(Brian Moran)中,表明白为存储进程提供sp_前缀使SQL Server查察主数据库中的已编译打算.由于sp_sproc不驻留在哪里,SQL Server将从头编译该进程(而且必要一个独有的编译锁,导致机能题目). 文章中给出了以下示例,以表现两个进程之间的区别: USE tempdb; GO CREATE PROCEDURE dbo.Select1 AS SELECT 1; GO CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1; GO EXEC dbo.sp_Select1; GO EXEC dbo.Select1; GO 运行此呼吁,然后打开Profiler(添加存储进程 – > SP:CacheMiss变乱)并再次运行存储进程.您应该看到两个存储进程之间的差别:sp_Select1存储进程将天生比Select1存储进程多一个SP:CacheMiss变乱(该文章引用SQL Server 7.0和SQL Server 2000.) 当我在SQL Server 2008 R2情形中运行该示例时,我得到了两个进程(在tempdb和另一个测试数据库中)沟通数目的SP:CacheMiss变乱. 以是我想知道: >我可以在执行示例时做错了吗? 很是感激您对此的观点! 编辑 我在msdn上为SQL Server 2008 R2找到了Creating Stored Procedures (Database Engine),它答复了我的第二个题目:
这里没有提到行使sp_前缀导致的机能题目.我想知道是否如故云云,可能他们是否在SQL Server 2000之后修复它. 办理要领这很轻易测试本身.让我们建设两个很是简朴的进程:CREATE PROCEDURE dbo.sp_mystuff AS SELECT 'x'; GO CREATE PROCEDURE dbo.mystuff AS SELECT 'x'; GO 此刻让我们构建一个包装器,它可以执行多次,包括和不包括模式前缀: CREATE PROCEDURE dbo.wrapper_sp1 AS BEGIN SET NOCOUNT ON; DECLARE @i INT = 1; WHILE @i <= 1000 BEGIN EXEC sp_mystuff; SET @i += 1; END END GO CREATE PROCEDURE dbo.wrapper_1 AS BEGIN SET NOCOUNT ON; DECLARE @i INT = 1; WHILE @i <= 1000 BEGIN EXEC mystuff; SET @i += 1; END END GO CREATE PROCEDURE dbo.wrapper_sp2 AS BEGIN SET NOCOUNT ON; DECLARE @i INT = 1; WHILE @i <= 1000 BEGIN EXEC dbo.sp_mystuff; SET @i += 1; END END GO CREATE PROCEDURE dbo.wrapper_2 AS BEGIN SET NOCOUNT ON; DECLARE @i INT = 1; WHILE @i <= 1000 BEGIN EXEC dbo.mystuff; SET @i += 1; END END GO 功效: 结论: >行使sp_前缀较慢 更重要的题目:为什么要行使sp_前缀?你的同事祈望从中得到什么?这不该该是你必需证明这更糟糕,它应该是关于他们证明为体系中的每个存储进程添加沟通的三字母前缀.我没有看到甜头. 另外,我在以下博客文章中对此模式举办了一些很是普及的测试: http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |