加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server-2008-r2 – 行使sp_启动用户存储进程的名称如故错误

发布时间:2021-05-20 18:24:05 所属栏目:编程 来源:网络整理
导读:我的一位同事在我们的SQL Server 2008 R2数据库sp_something中定名了一个存储进程.当我看到这个时,我立即想到:“那是错的

我的一位同事在我们的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变乱.

以是我想知道:

>我可以在执行示例时做错了吗?
>在新版本的SQL Server中,’不要定名用户sproc sp_something’adagium如故有用吗?
>假如是这样,是否有一个很好的例子表现它在SQL Server 2008 R2中的有用性?

很是感激您对此的观点!

编辑

我在msdn上为SQL Server 2008 R2找到了Creating Stored Procedures (Database Engine),它答复了我的第二个题目:

We recommend that you do not create any stored procedures using sp_ as
a prefix. SQL Server uses the sp_ prefix to designate system stored
procedures. The name you choose may conflict with some future system
procedure. […]

这里没有提到行使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

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读