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 (编辑:天瑞地安资讯网_保定站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sqlserver日志传送有何优点?怎样运用?
- sql-server – SQL Server PDF全文搜索无法在FileStream PD
- sql-server – 将每日时间表分组为[开始日期;结束日期]与工
- sql-server – 只获取每天TSQL中多个条目的最后一行
- 我可以通过使用参数来避免所有SQL注入攻击吗?
- sql-server – 如何通过数据库获取特定实例的CPU使用率?
- sql-server – SQLCMD命令无法插入重音符
- SQL查询如果匹配另一个表中的条目(例如假日日期),则排除记录
- 通过分析SQL语句的执行计划优化SQL
- sql-server – 使用SSD时,数据库设计中聚集索引的概念是否合

