小编mar*_*c_s的帖子

优化:将变量声明移至程序顶部

在优化一些存储过程时,我与 DBA 坐下来讨论了一些具有高阻塞和/或高读/写活动的存储过程。

DBA 提到的一件事是我应该TABLE在存储过程的顶部声明所有变量(尤其是变量)以避免重新编译。

这是我第一次听说这个,并且在重新访问我们拥有的所有不同存储过程之前正在寻找一些确认。他称其为“延迟查看代码”,而重新编译正在锁定将导致阻塞的模式。

将所有变量声明移到存储过程的顶部是否会减少重新编译?

sql-server stored-procedures optimization sql-server-2008-r2

15
推荐指数
1
解决办法
2147
查看次数

SQL Server 2012 Management Studio“Express”有什么不同吗?

与 SQL Server 2012 Enterprise Installer 和 SQL Server 2012 Express Management Studio 中的 SSMS 版本有什么不同吗?

ssms sql-server-2012

15
推荐指数
1
解决办法
1万
查看次数

用于集成测试的 SQL Server 数据库快照

我正在尝试定义一种使用测试数据库(在 SQL Server 中)进行集成测试的方法。

我的想法是在启动集成测试程序集时执行以下步骤:

  • 创建一个完全空的数据库
  • 运行“创建数据库对象”脚本以创建所有相关的数据库对象(表、视图、序列等)
  • 填充“基础数据”(查找值等)
  • 拍摄一个称为(db)_Basis“基线”的数据库快照,用于未来的集成测试

现在,在每个测试类(包含 1-n 个测试)之前,我计划简单地执行“从快照恢复”以恢复到定义明确的、或多或少的数据库“空”状态。到目前为止,它就像一个魅力。

但是,有一组集成测试需要在大型测试数据库上运行 - 所以我希望在每个测试装置(具有 n 个单独测试的类)之前执行此操作

  • (db)_Basis快照恢复数据库
  • 将那 50'000 多行数据插入到数据库中
  • 创建另一个快照(db)_With_Testdata快照

然后对于每个测试,将数据库重置为明确定义的(db)_With_Testdata快照版本,运行测试,验证结果等等。

问题是:我似乎无法同时拥有两个数据库快照 - 一旦我这样做了,我就无法将我的数据库恢复到其中任何一个......我不断收到此错误:

消息 3137,级别 16,状态 4,第 9 行
数据库无法恢复。主要或快照名称指定不正确,所有其他快照尚未删除,或者缺少文件。

消息 3013,级别 16,状态 1,第 9 行
RESTORE DATABASE 异常终止。

这真的是 SQL Server 数据库快照的工作方式吗??似乎非常限制..... 如果我不能直接回到原始的“(db)_Basis”快照我会理解 - 但仅仅因为我现在有两个快照,我什至不能回到最近的一个?!?!?

sql-server snapshot

14
推荐指数
1
解决办法
2601
查看次数

SQL Server EXECUTE AS 问题

我在尝试让我的存储过程使用时遗漏了一些东西EXECUTE AS。存储过程正在从中读取数据source_db、聚合数据并将结果存储在 中target_db

sp 本身在target_db. 我有一个专用的登录名并将它映射到用户source_dbtarget_dbsp 的所有者(所以有一个用户app_agentsource_dbtarget_db登录app_agent)。

如果我以 身份登录app_agent并执行

EXEC target_db.app_agent_schema.import_data
Run Code Online (Sandbox Code Playgroud)

一切正常。但如果我改变

ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 
Run Code Online (Sandbox Code Playgroud)

并尝试执行它,它抛出

服务器主体“app_agent”无法在当前安全上下文下访问数据库“source_db”。

我正在使用 SQL Server 2008。

有人能指出我的错误吗?

谢谢

更新 经过一些研究,我发现ALTER DATABASE target_db SET TRUSTWORTHY ON解决了问题,但这对我来说似乎不是正确的解决方案......

sql-server-2008 security

13
推荐指数
1
解决办法
2万
查看次数

在 SQL Server Profiler 中进行跟踪时,是否可以在过程调用中记录传入参数值?

使用 SQL Server Profiler(我使用的是 SQL Server 2012),我试图生成一个有用的跟踪来显示参数值,而不仅仅是带有变量名的 SQL。存储过程遍历大量库存数据以生成一些非常有价值的结果,我正在尝试记录现有行为,以便我可以对其进行单元测试,准确定义它,然后将其重构为合理的东西。

我有一个存储过程,它在一个循环中执行一个 54 个参数的子过程,其中存储过程创建一个游标然后执行一个 while 循环。这是一个简化的视图:

CREATE PROCEDURE 
   [dbo].[OuterProcedure]       
   (  @ProductCode varchar(8),          
     -- 41 more parameters omitted
   )
AS            
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED   
  SET NOCOUNT ON           
 DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
 -- OMIT ABOUT 10 temporary table declarations.
 DECLARE  aCursor CURSOR FAST_FORWARD FOR         
   SELECT [ID],bkno,  -- about 40 fields omitted.
              FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins         
              WHERE  (about_80_boolean_expressions AND omitted_here)
        ORDER BY some,keys,like,this

OPEN aCursor          
FETCH NEXT FROM aCursor /* Get …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures profiler sql-server-2012

13
推荐指数
1
解决办法
4360
查看次数

如果我不删除临时 MEMORY 表,它会持续多久(MySQL)

我在 MySQL 中使用递归存储过程来生成一个名为 的临时表id_list,但我必须在后续选择查询中使用该过程的结果,所以我不能DROP在过程中使用临时表...

BEGIN;

/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);

/* uses the results of the stored procedure in the WHERE */
SELECT a.User_ID
FROM usr_relationships r 
INNER JOIN usr_accts a ON a.User_ID = r.User_ID 
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list) 
GROUP BY r.User_ID;

COMMIT;
Run Code Online (Sandbox Code Playgroud)

调用过程时,第一个值是我想要的分支的顶部 ID,第二个值是tier过程在递归过程中使用的ID 。在递归循环之前,它会检查tier = 0它是否运行以及是否运行:

DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS …
Run Code Online (Sandbox Code Playgroud)

mysql stored-procedures memory temporary-tables

13
推荐指数
1
解决办法
5万
查看次数

SQL Server:哪个角色授予执行所有存储过程的权限?

哪个数据库角色成员资格授予在 SQL Server 2012 中执行所有现有存储过程的权限?

我尝试为每个用户添加一个用户,但仍然无法执行存储过程。我不想EXECUTE单独授予每个存储过程,我想将用户添加到角色并且他能够执行其中的任何一个。

security sql-server permissions sql-server-2012

13
推荐指数
2
解决办法
3万
查看次数

多少存储过程参数太多了?

我刚刚开始在 SQL Server 2008 中编写存储过程,并且有 30 多个参数。我从来没有写过一个参数超过 10 个的,这让我开始思考……什么时候参数太多了?

对于背景...这个程序基本上将INSERT单列成一个单一的表。也会有一个非常相似的;虽然有点小;在同一个表上执行UPDATE 的版本。大多数列相对较小,混合了 int 和 string (varchar(200) )。

有哪些问题;是好是坏; 有一个包含大量参数的程序,我应该开始考虑其他模式的阈值是多少?

performance sql-server-2008 database-design optimization

12
推荐指数
1
解决办法
6373
查看次数

处理 CXPACKET 等待 - 设置并行成本阈值

作为我之前关于对 Sharepoint 站点进行性能故障排除的问题的后续问题,我想知道我是否可以对 CXPACKET 等待做些什么。

我知道下意识的解决方案是通过将 MAXDOP 设置为 1 来关闭所有并行性 - 听起来是个坏主意。但另一个想法是在并行开始之前增加成本阈值。执行计划成本的默认值 5 相当低。

所以我想知道是否已经写了一个查询,可以找到执行计划成本最高的查询(我知道你可以找到那些执行持续时间最长的查询等等 - 但是执行计划成本是否可以在某处检索,也是?),这也会告诉我这样的查询是否已并行执行。

有没有人手头有这样的脚本,或者可以向我指出相关的 DMV、DMF 或其他系统目录视图的方向以找出这一点?

performance sql-server-2008 parallelism query-performance performance-tuning

12
推荐指数
1
解决办法
3028
查看次数

是否建议使用 Identity 作为主键的替代?

我们可以声明一个Identitylikeid_numid_num增加唯一的数字。

CREATE TABLE new_employees
(
  id_num int IDENTITY(1,1),
  fname varchar (20),
  minit char(1),
  lname varchar(30)
)
Run Code Online (Sandbox Code Playgroud)

是否建议将其Identity用作替代方案,Primary key因为Identity为每一行提供了唯一编号?

sql-server primary-key identity

11
推荐指数
2
解决办法
4万
查看次数