我在SQL数据库方面有丰富的经验,但主要是在Oracle和MySQL上。
现在我正在处理SQL Server 2012(Management Studio 2008),并遇到了一个我无法解释的奇怪行为。
考虑以下三个查询和一个由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_]
如果我一个接一个地运行它们,它就可以正常运行(总计:约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)构建此类查询包,并需要一种方法来调整其性能。