gpt4 book ai didi

sql-server - 了解 SQL Server 查询执行和事务

转载 作者:行者123 更新时间:2023-12-03 07:29:25 28 4
gpt4 key购买 nike

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

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

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

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_]

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

如果我选择它们并一次运行所有查询,它会运行得很糟糕。 (总计:~60秒)

最后,如果我用事务包装所有内容,它会再次运行正常

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)构建这种查询包,并且我需要一种方法来调整其性能。

最佳答案

所提供的两个代码段之间的唯一区别是,第一个使用默认事务模式,第二个使用显式事务

由于 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;

关于sql-server - 了解 SQL Server 查询执行和事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29119058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com