标签: sql-server

启用触发器时缓慢删除记录

认为这已通过以下链接解决 - 解决方法有效 - 但补丁没有。与 Microsoft 支持一起解决。

http://support.microsoft.com/kb/2606883

好的,所以我有一个问题,我想把它扔给 StackOverflow,看看是否有人有想法。

请注意,这是 SQL Server 2008 R2

问题:启用触发器时,从包含 15000 条记录的表中删除 3000 条记录需要 3-4 分钟,禁用触发器时只需 3-5 秒。

表设置

我们将称为 Main 和 Secondary 的两个表。Secondary 包含我要删除的项目记录,因此当我执行删除操作时,我会加入到 Secondary 表中。在删除语句之前运行一个进程,以使用要删除的记录填充辅助表。

删除声明:

DELETE FROM MAIN 
WHERE ID IN (
   SELECT Secondary.ValueInt1 
   FROM Secondary 
   WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7'
);
Run Code Online (Sandbox Code Playgroud)

这个表有很多列和大约 14 个不同的 NC 索引。在我确定触发器是问题之前,我尝试了很多不同的事情。

  • 开启页面锁定(我们默认已关闭)
  • 手动收集统计数据
  • 禁用自动收集统计信息
  • 已验证的索引运行状况和碎片
  • 从表中删除聚集索引
  • 检查执行计划(没有任何显示为缺少索引,实际删除的成本为 70%,记录的连接/合并成本为 28%

触发器

该表有 3 个触发器(插入、更新和删除操作各一个)。我修改了删除触发器的代码以使其返回,然后选择一个以查看它被触发了多少次。它在整个操作过程中只触发一次(如预期的那样)。

ALTER TRIGGER [dbo].[TR_MAIN_RD] ON [dbo].[MAIN]
            AFTER DELETE
            AS  
                SELECT 1
                RETURN
Run Code Online (Sandbox Code Playgroud)

回顾

  • 使用 …

trigger performance sql-server delete sql-server-2008-r2

17
推荐指数
2
解决办法
4498
查看次数

管理工作室关闭时 SQL Server 性能不佳

我注意到 SQL Server 2008 r2 express 的一个奇怪行为:

通常我的查询执行时间约为 650 毫秒,但如果我打开 Management Studio 并运行任何简单查询(例如SELECT * FROM Something),执行时间将变为 ~40 毫秒。如果我关闭管理工作室这个值恢复正常~650ms

并且无论在何处执行查询:来自 Management Studio 或我的应用程序(它使用 ADO.Net)

ARITHABORT 设置无效

为什么会这样?

sql-server ssms

17
推荐指数
1
解决办法
1471
查看次数

我可以在没有 SQL Server 的情况下还原 SQL Server .bak 文件吗?

我有一些.bak来自 SQL Server 2005 转储的大文件。

我可以在不使用 SQL Server 的情况下将这些恢复到 PostgreSQL、MySQL 或纯文本文件吗?

开源解决方案将是最有用的。

sql-server backup restore

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

一次将多个数据库从 C: 移动到 D:

我的 SQL Server 2008 R2 有 323 个数据库,在我的 C: 驱动器上消耗了大约 14 GB,这是一个快速的 SSD。

因为我想回收 C: 驱动器上的一些空间,所以我想将它们移动到我的 D: 驱动器。

我找到了这篇 MSDN 文章,但这似乎是只移动一个数据库的过程。

是否有自动方式或脚本一次移动我的所有数据库?

sql-server sql-server-2008-r2 alter-database

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

查找哪个会话持有哪个临时表

我们有一个 SQL Server 2005 数据库,临时数据库已满。通过进入 SQL Server Management Studio,我可以看到 tempdb 中的所有临时表。是否可以判断哪个会话持有哪个临时表?理想情况下,一个查询将列出每个会话使用的临时表。

谢谢,

sql-server-2005 sql-server tempdb

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

我们是否需要在 C# 代码和存储过程中处理事务

我们真的需要 C# 中的事务处理以及双方的数据库存储过程吗?

C#:

Using(transaction with transaction scope)
{
     Execute stored proc;
     Transaction. Complete;
}
Run Code Online (Sandbox Code Playgroud)

SQL存储过程:

Create process
As
Begin try
    Begin transaction
    Commit
End try
Begin catch
    Rollback
End catch
Run Code Online (Sandbox Code Playgroud)

sql-server ado.net t-sql transaction c#

17
推荐指数
1
解决办法
9994
查看次数

SQL Server 2016 DB 邮件未发送

我在 SQL Server 2016 上玩得很开心……我的数据库邮件没有发送,而且我已经没有地方可以查看了。我仔细检查了 DBmail 可执行文件的 SQL 帐户权限 - 它已读取并执行。我输入了防火墙出站端口 587 的规则。我尝试了另一个邮件帐户和配置文件,但遇到了相同的未发送问题。日志(db 邮件日志)中唯一的条目是服务的开始和结束。我能找到的任何地方都没有错误。电子邮件似乎只是进入发送队列,永远不会离开它。这些帐户可以自己发送和接收电子邮件,也可以从另一台计算机上的 SQL Server 2014 实例发送和接收电子邮件。

我有一个发送状态为“未发送”的项目队列,除了一长串未发送的邮件外,我还检查了所有正常位置和预期结果:

SELECT * FROM msdb..sysmail_event_log order by log_id DESC

SELECT * FROM dbo.sysmail_mailitems

SELECT * FROM dbo.sysmail_sentitems

USE msdb
SELECT sent_status, *
FROM sysmail_allitems

 SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';

 EXECUTE msdb.dbo.sysmail_help_status_sp
Run Code Online (Sandbox Code Playgroud)

我曾尝试将其关闭并再次打开......所以我是否错过了可以阐明这种情况的 DMV 等?这是我搜索中没有的 SQL Server 2016 的已知问题吗?发送此邮件的任何其他可能步骤?

sql-server database-mail sql-server-2016

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

在 IF EXISTS 中包装查询使其非常慢

我有以下查询:

select databasename 
from somedb.dbo.bigtable l where databasename ='someval' and source  <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
Run Code Online (Sandbox Code Playgroud)

上述查询在三秒内完成。

如果上面的查询返回任何值,我们希望存储过程退出,因此我将其重写如下:

If Exists(
select databasename 
from somedb.dbo.bigtable l where databasename ='someval' and source  <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
Run Code Online (Sandbox Code Playgroud)

但是,这需要 10 分钟。

我可以像下面这样重写上面的查询,它也可以在不到 3 秒的时间内完成:

  select databasename 
from somedb.dbo.bigtable l where databasename ='someval' and source  <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 exists query-performance

17
推荐指数
1
解决办法
8864
查看次数

datetime2(0) 与 datetime2(2)

根据文档datetime2 (Transact-SQL):

存储大小
小于 3 的精度为 6 个
字节。精度 3 和 4 为 7 个
字节。所有其他精度需要 8 个字节。

datetime2(0)、datetime2(1)、的大小datetime2(2)使用相同的存储量(6 字节)。

我是否正确地说,我可能会datetime2(2)在没有任何额外尺寸成本的情况下使用并获得精度的好处?

请注意:

  • 该列用PK进行索引,形成复合聚集索引(用于表分区)
  • 我不在乎毫秒

datetime2(0)在 where 子句中使用或通过索引查找时,cpu 效率会更高吗?

这是一个庞大的表,因此最小的优化将产生很大的不同。

sql-server datetime2 sql-server-2016

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

同事说永远不要在 SQL 中使用 OR 语句,这是真的吗?

我现在负责 SQL 开发的同事说我永远不应该使用OR语句,因为它会弄乱查询优化器并忽略产生慢查询的表索引。我在谷歌搜索时找不到任何这样的例子。以下查询的替代方案变得非常难看,其中有十几个代码块看起来几乎相同(对于示例)使用 if else 语句为每个变量状态。请注意检查为短路的变量,如果值为 2,则返回所有结果,否则按字段过滤。

我询问了一些包含这些关于为什么不使用OR语句的声明的资源,并收到了以下链接(我们使用的是 MS SQL Server)。

这些示例似乎都不像当前的实现,如下所示。我发现很难相信这段代码有问题,但如果有问题,请告诉我。我还想了解更多信息,其中关于不使用的评论OR实际上可能适用以及为什么如此,以便更好地理解该问题。

SELECT
    e.EmployeeName,
    e.DepartmentName,
    crs.Title,
    c.Name as CompanyName
FROM Employee E
Left Outer Join Company c ON c.Id = @companyId
    INNER JOIN Department d on e.DepartmentId = d.Id 
WHERE   
    c.Id = @companyId           
    AND (@Active = 2 OR  crs.IsActive = @Active)
    AND (@Dot = 2 OR IsDot = @Dot)
    AND crs.CompanyId = @companyId
    AND d.CompanyId = @companyId
ORDER BY EmployeeName, Title, …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization query-performance

17
推荐指数
2
解决办法
2648
查看次数