认为这已通过以下链接解决 - 解决方法有效 - 但补丁没有。与 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 索引。在我确定触发器是问题之前,我尝试了很多不同的事情。
触发器
该表有 3 个触发器(插入、更新和删除操作各一个)。我修改了删除触发器的代码以使其返回,然后选择一个以查看它被触发了多少次。它在整个操作过程中只触发一次(如预期的那样)。
ALTER TRIGGER [dbo].[TR_MAIN_RD] ON [dbo].[MAIN]
AFTER DELETE
AS
SELECT 1
RETURN
Run Code Online (Sandbox Code Playgroud)
回顾
我注意到 SQL Server 2008 r2 express 的一个奇怪行为:
通常我的查询执行时间约为 650 毫秒,但如果我打开 Management Studio 并运行任何简单查询(例如SELECT * FROM Something),执行时间将变为 ~40 毫秒。如果我关闭管理工作室这个值恢复正常~650ms
并且无论在何处执行查询:来自 Management Studio 或我的应用程序(它使用 ADO.Net)
ARITHABORT 设置无效
为什么会这样?
我有一些.bak来自 SQL Server 2005 转储的大文件。
我可以在不使用 SQL Server 的情况下将这些恢复到 PostgreSQL、MySQL 或纯文本文件吗?
开源解决方案将是最有用的。
我的 SQL Server 2008 R2 有 323 个数据库,在我的 C: 驱动器上消耗了大约 14 GB,这是一个快速的 SSD。
因为我想回收 C: 驱动器上的一些空间,所以我想将它们移动到我的 D: 驱动器。
我找到了这篇 MSDN 文章,但这似乎是只移动一个数据库的过程。
是否有自动方式或脚本一次移动我的所有数据库?
我们有一个 SQL Server 2005 数据库,临时数据库已满。通过进入 SQL Server Management Studio,我可以看到 tempdb 中的所有临时表。是否可以判断哪个会话持有哪个临时表?理想情况下,一个查询将列出每个会话使用的临时表。
谢谢,
我们真的需要 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 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 的已知问题吗?发送此邮件的任何其他可能步骤?
我有以下查询:
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
存储大小
小于 3 的精度为 6 个
字节。精度 3 和 4 为 7 个
字节。所有其他精度需要 8 个字节。
datetime2(0)、datetime2(1)、的大小datetime2(2)使用相同的存储量(6 字节)。
我是否正确地说,我可能会datetime2(2)在没有任何额外尺寸成本的情况下使用并获得精度的好处?
请注意:
datetime2(0)在 where 子句中使用或通过索引查找时,cpu 效率会更高吗?
这是一个庞大的表,因此最小的优化将产生很大的不同。
我现在负责 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 ×10
performance ×2
ado.net ×1
backup ×1
c# ×1
datetime2 ×1
delete ×1
exists ×1
optimization ×1
restore ×1
ssms ×1
t-sql ×1
tempdb ×1
transaction ×1
trigger ×1