【问题标题】:Understanding SQL Server query execution and transactions了解 SQL Server 查询执行和事务
【发布时间】:2015-03-18 10:03:12
【问题描述】:

我对 SQL 数据库非常有经验,但主要是使用 Oracle 和 MySQL。

现在我正在处理 SQL Server 2012 (Management Studio 2008) 并面临我无法解释的奇怪行为。

考虑这 3 个查询和一个由 400k 行组成的原始表:

SELECT ID_TARJETA 
INTO [SGMENTIA_TEMP].[dbo].[borra_borra_] 
FROM [DATAMART_SEGMENTIA].[DESA].[CLIENTES]

ALTER TABLE [SGMENTIA_TEMP].[dbo].[borra_borra_] 
  ADD PRIMARY KEY (ID_TARJETA)

SELECT COUNT(*) 
FROM [SGMENTIA_TEMP].[dbo].[borra_borra_]

如果我一个接一个地运行它们,它运行正常。 (总计:~7sec)。

如果我全部选择它们并运行所有查询一次它运行不好。 (总计:~60sec

最后,如果我把它全部包装起来用一个事务它再次运行正常

BEGIN TRANSACTION;

SELECT ID_TARJETA 
INTO [SGMENTIA_TEMP].[dbo].[borra_borra_] 
FROM [DATAMART_SEGMENTIA].[DESA].[CLIENTES]

ALTER TABLE [SGMENTIA_TEMP].[dbo].[borra_borra_] 
ADD PRIMARY KEY(ID_TARJETA)

SELECT COUNT(*) 
FROM [SGMENTIA_TEMP].[dbo].[borra_borra_]

COMMIT;

整个画面对我来说毫无意义,考虑到创建事务看起来相当昂贵,第一个场景应该是一个缓慢的场景,而第二个场景应该工作得更好,我错了吗?

这个问题对我来说非常重要,因为我正在以编程方式 (jdbc) 构建这类查询包,我需要一种方法来调整其性能。

【问题讨论】:

  • 请检查查询选项 -> 高级对话框中的 SET STATISTICS IO 和 SET STATISTICS TIME。另外,查看实际的执行计划。

标签: sql-server transactions


【解决方案1】:

提供的两个 sn-p 之间的唯一区别在于,第一个使用默认事务模式,第二个使用 Explicit Transaction

由于 SQL Server 默认事务模式是自动提交事务每个单独的语句都是一个事务

您可以找到更多关于交易模式的信息here

你可以试试这个,看看它是否也能在 60 秒内运行:

BEGIN TRANSACTION;

SELECT ID_TARJETA 
INTO [SGMENTIA_TEMP].[dbo].[borra_borra_] 
FROM [DATAMART_SEGMENTIA].[DESA].[CLIENTES];

COMMIT;

BEGIN TRANSACTION;

ALTER TABLE [SGMENTIA_TEMP].[dbo].[borra_borra_] 
ADD PRIMARY KEY(ID_TARJETA);

COMMIT;

BEGIN TRANSACTION;

SELECT COUNT(*) 
FROM [SGMENTIA_TEMP].[dbo].[borra_borra_]

COMMIT;

【讨论】:

  • 毫无疑问,它与transtractions有关。但是为什么如果我在另一个(3 个事务)运行得非常好(7 秒加上它们的独立时间)之后执行一个查询,并且如果我选择 + 一起执行它们(1 个事务?)它运行得非常慢(60 秒)?。跨度>
  • @IvanArrizabalaga 处理 3 个事务而不是一个似乎是一个很好的理由。考虑执行 BEGIN TRANSACTION / COMMIT 3 次而不是 1 次。
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 2011-08-22
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多