我的一位同事在我们的SQL Server 2008 R2数据库中命名了一个存储过程sp_something
。当我看到此消息时,我立即想到:“那是错误的!” 并开始在我的书签中搜索此在线文章,该文章解释了错误的原因,因此我可以向我的同事提供解释。
在这篇文章(由Brian Moran撰写)中,解释了给存储过程一个sp_前缀使SQL Server可以在master数据库中查看已编译的计划。由于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
存储过程将比存储过程生成一个更多的SP:CacheMiss
事件Select1
(本文引用了SQL Server 7.0和SQL Server 2000。)
当我在SQL Server 2008 R2环境中运行该示例时SP:CacheMiss
,两个过程都得到相同数量的事件(在tempdb和另一个测试数据库中)。
所以我想知道:
- 我可以在执行示例时做错什么吗?
sproc sp_something
在新版本的SQL Server中,“不命名用户” adagium是否仍然有效?- 如果是这样,是否有一个很好的示例显示其在SQL Server 2008 R2中的有效性?
非常感谢您对此的想法!
编辑
我在msdn上为SQL Server 2008 R2 找到了创建存储过程(数据库引擎),它回答了我的第二个问题:
我们建议您不要使用sp_作为前缀创建任何存储过程。SQL Server使用sp_前缀来指定系统存储过程。您选择的名称可能与将来的某些系统过程冲突。[...]
但是,这里没有提及使用前缀引起的性能问题sp_
。我很想知道是否仍然如此,或者他们是否在SQL Server 2000之后解决了问题。
sp_
?这与为表添加前缀一样有用tbl
。为什么要首先让系统搜索主系统(即使它的性能可以忽略不计或没有性能差异)以允许您使用这种无意义的命名约定?
dbo.sp_Author_Rename
比更好dbo.Author_Rename
。我想不出一件有意义的事。
sp_
版本的开销稍大(需要检入主数据库和用户数据库,因为它优先考虑系统进程master
->用户数据库中的进程->非系统)在特效master
)