小编pet*_*ter的帖子

如何分析存储过程

我正在使用 SQL Server 2012 并且想知道如何分析存储过程

例如,探查器可以捕获存储过程中的每个单独的 SQL 语句,它是什么,运行需要多长时间等?

我正在尝试诊断合并复制存储过程,这必须是合并代理完整运行的一部分。似乎不可能抓住有性能问题的存储过程并再次运行它,因为在这一点上它并不慢。

sql-server sql-server-2012

31
推荐指数
2
解决办法
7万
查看次数

如何删除正在恢复的数据库

我正在使用 SQL Server 2008 R2 运行日志传送。

我遇到了辅助数据库驱动器空间不足且未应用日志传送事务日志的情况。

我想解决这个问题的方法是删除辅助数据库并从头开始配置日志传送。

我现在遇到的问题是我的辅助数据库处于恢复状态,我无法删除它们。我该如何继续?

例如,如果我尝试让它们离线,我会收到错误消息,

ALTER DATABASE is not permitted while the database is in the Restoring state.
Run Code Online (Sandbox Code Playgroud)

sql-server log-shipping

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

使用函数调用的估计与实际查询计划

我在 SQL 服务器上有这个查询,一个合并复制查询:

SELECT DISTINCT
    b.tablenick,
    b.rowguid,
    c.generation,
    sys.fn_MSgeneration_downloadonly
    (
        c.generation,
        c.tablenick
    )
FROM #belong b
LEFT OUTER JOIN dbo.MSmerge_contents c ON 
    c.tablenick = b.tablenick
    AND c.rowguid = b.rowguid;
Run Code Online (Sandbox Code Playgroud)

估计的查询计划包括 3 个查询的信息:

  1. 上面的查询
  2. 对 fn_MSgeneration_downloadonly 的函数调用
  3. fn_MSArticle_has_downloadonly_property 的函数调用

实际的查询计划仅包括以下信息:

  1. 上面的查询

没有关于功能。为什么实际方案中缺少功能信息?

我尝试了这些选项:

SET STATISTICS PROFILE ON
SET STATISTICS XML ON
Run Code Online (Sandbox Code Playgroud)

它创建了一个实际计划,但它缺少第 2 部分和第 3 部分,这与我在 Management Studio 中使用实际查询计划选项时相同。

例如,如果我要使用 Profiler 来捕获有关函数调用的信息,我会选择哪些事件?


没有找到与查询计划特别相关的答案,但我分析了 SP:StmtStarting 和 SP:StmtCompleted 并显示了函数调用。

sql-server execution-plan functions merge-replication

11
推荐指数
1
解决办法
2172
查看次数

在没有事务日志的情况下备份数据库

当我备份数据库时,有没有办法排除该备份中的事务日志?或者我在想这个错误并恢复原始数据库需要事务日志的内容?

我无法缩小事务日志,因为数据库正在使用复制,我将不得不中断复制。

如果我发出此命令然后恢复数据库,它会返回一个 50 GB 的日志文件:

BACKUP DATABASE DatabaseName TO DISK = 'c:\temp\Database.bak'
Run Code Online (Sandbox Code Playgroud)

我必须将恢复的数据库更改为简单,然后在释放 50GB 之前缩小日志文件。我无法将原始数据库更改为 simple,因为它是复制副本。

sql-server-2008

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

如何优化查询

我有一个与此类似的数据库结构,

CREATE TABLE [dbo].[Dispatch](
    [DispatchId] [int] NOT NULL,
    [ContractId] [int] NOT NULL,
    [DispatchDescription] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Dispatch] PRIMARY KEY CLUSTERED 
(
    [DispatchId] ASC,
    [ContractId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[DispatchLink](
    [ContractLink1] [int] NOT NULL,
    [DispatchLink1] [int] NOT NULL,
    [ContractLink2] [int] NOT NULL,
    [DispatchLink2] [int] NOT NULL
) ON [PRIMARY]

GO
INSERT [dbo].[Dispatch] ([DispatchId], [ContractId], [DispatchDescription]) VALUES (1, 1, N'Test') …
Run Code Online (Sandbox Code Playgroud)

performance sql-server query-performance

9
推荐指数
1
解决办法
361
查看次数

优化器未选择索引联合计划

为什么下面的查询很慢?

select count(*) 

from [dbo].[mt_dispatch_link] 
   , [dbo].[_mt_dispatch] [_mt_dispatch]

where   (mt_dispatch_link.contract_id_1 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_1 = _mt_dispatch.dispatch_id)

   or   (mt_dispatch_link.contract_id_2 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_2 = _mt_dispatch.dispatch_id)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这需要 10 多分钟,然后我倾向于在那个时候停止它。我的问题更多是关于如何理解查询计划。

查看查询计划,我可以看到底部聚集索引扫描返回大约 250000 条记录,但成本为 0% 并且它正在放入临时表中。

顶部索引扫描大约是 25000 条记录。

但是 95% 的成本来自嵌套连接。我应该从中得出什么结论?

上面的查询计划显示了两次索引扫描,是说它在做 25000 + 250000 次索引扫描,还是说它在做 25000 * 250000 次索引扫描?

如果我将查询更改为此(添加FORCESEEK):

select count(*) 

from [dbo].[mt_dispatch_link] 
   , [dbo].[_mt_dispatch] [_mt_dispatch] 

    WITH (FORCESEEK)

where   (mt_dispatch_link.contract_id_1 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_1 = _mt_dispatch.dispatch_id)

   or   (mt_dispatch_link.contract_id_2 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_2 = _mt_dispatch.dispatch_id)
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个更好的计划,查询立即运行:

在此处输入图片说明

我在两个表上运行了更新统计信息。可惜没修好。表设计不是很好,所以我认为 SQL Server 并不真正理解,因此提出了一个糟糕的查询计划。有关 …

sql-server optimization execution-plan

7
推荐指数
1
解决办法
366
查看次数

为什么复制删除需要系统管理员访问

我正在使用 SQL 2012 运行合并复制。

在 SQL 2012 中为复制添加的删除触发器似乎有一个令人讨厌的后果。

在删除触发器里面是这样的,

select @xe_message = CAST('replica_id: ' + convert(nvarchar(100), @replnick) + ', article_id: ' + convert(nvarchar(100), @tablenick) + ', rowguid: ' + case when @article_rows_deleted = 1 then convert(nvarchar(100), @rowguid) else N'0' end + ', generation: ' + case when @is_mergeagent = 1 then N'0' else convert(nvarchar(100), @newgen) end + ', Reason: -1' AS varbinary(1000));
        exec master..sp_repl_generateevent 1, N'Event : ppm_insert', @xe_message
Run Code Online (Sandbox Code Playgroud)

如果某人不在系统管理员角色中进行删除,则会发生错误,

Msg 8189, Level 14, State 10, Procedure sp_repl_generateevent, Line 1 …
Run Code Online (Sandbox Code Playgroud)

replication sql-server merge-replication

7
推荐指数
1
解决办法
1207
查看次数

减少键查找

我正在使用 SQL 服务器,并且我一直在仔细研究关键查找的概念,

http://blog.sqlauthority.com/2009/10/07/sql-server-query-optimization-remove-bookmark-lookup-remove-rid-lookup-remove-key-lookup/

因此,如果您有一个键查找,您可以创建一个带有“包含”列的索引,以覆盖您在 select 语句中的非索引列。

例如,

SELECT ID, FirstName FROM OneIndex WHERE City = 'Las Vegas'
GO
Run Code Online (Sandbox Code Playgroud)

该索引将包括一个键查找,

CREATE NONCLUSTERED INDEX [IX_OneIndex_City] ON [dbo].[OneIndex]
(
[City] ASC
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

但是这个将删除密钥查找,

CREATE NONCLUSTERED INDEX [IX_OneIndex_Include] ON [dbo].[OneIndex]
(
City
) INCLUDE (FirstName,ID) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

我的意思是这对性能有多大影响?键查找的运算符成本为 0.295969 (99%),但这究竟意味着什么?

你怎么知道你在那里需要第二个索引,什么时候会变成你试图添加太多索引而不值得的情况?

在我看来,有些查询可以包括索引扫描、键查找,而且似乎仍然执行得非常快。

performance sql-server-2008 sql-server bookmark-lookup

6
推荐指数
2
解决办法
9746
查看次数

解决合并复制中的过滤问题

我正在为我们的数据库定义合并复制发布的过滤器。

我遇到的问题是合并复制有这些规则,我不喜欢称它们为限制,因为我可以理解其目的。

1) 创建文章过滤器时不能包含子查询,或者至少不应该包含。如果你这样做,它会在你第一次同步时出现,但如果子查询表中的某些内容发生变化,则不会重新评估过滤器。

2) 使用连接过滤器时,您只能将两个表连接在一起。

我遇到的问题是我们数据库中的关系比这更复杂。例如这里是我们的关系之一,

user <- regions selected <- STREET LIGHTS -> settings (are we syncing street lights) -> user
Run Code Online (Sandbox Code Playgroud)

这是一个示例表结构,可以更详细地解释上述内容,

用户表,

Id    Username
1     petermc
Run Code Online (Sandbox Code Playgroud)

UserRegion 表,(把它想象成一个安全表,允许特定用户查看哪个区域)

Id    UserId    RegionId
1     1         2
1     2         4
Run Code Online (Sandbox Code Playgroud)

同步设置表,

Id    UserId    Table
1     1         StreetLight
Run Code Online (Sandbox Code Playgroud)

区域表(这只是显示一些示例区域的查找表)

Id    Region Name
1     North Auckland
2     South Auckland
3     Central Auckland
4     Great Barrier Island
Run Code Online (Sandbox Code Playgroud)

路表,

Id    RegionId    Name
1     1           Rosedale Rd
2     1           North Shore Rd
Run Code Online (Sandbox Code Playgroud)

路灯桌

Id    RoadId …
Run Code Online (Sandbox Code Playgroud)

sql-server merge-replication

6
推荐指数
1
解决办法
2131
查看次数

使用合并复制复制没有数据的表结构

我正在将合并复制与 SQL 2012 一起使用。

我有一个表,将该表传播给订阅者会很有用,但只是表结构,而不是实际数据。

表格中的数据按会话填充,即当您登录软件时将数据添加到表格中,然后在退出软件时删除。

这意味着不应将表中的数据从发布复制到订阅者,或从订阅者复制到发布。但是最好复制表结构,这样我们就不必在订阅者处手动运行脚本。

sql-server sql-server-2012 merge-replication

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