如何改进 SQL Server 'INSERT INTO' 查询运行时间?

问题描述 投票:0回答:1

我有大约 2400 万行数据,需要将它们插入到具有标准化格式的表中。该数据是原始数据,来自客户。

我的插入查询如下:

SELECT ...
INTO TABLE2
FROM TABLE1

这通常是我执行此任务的方式,并且运行时没有出现任何问题,直到现在,我的查询可以运行大约一个小时,但仍然无法完成。以前,这样的查询只需要我几分钟(不到 10 分钟),但也可能是因为我不必处理超过 500 万行的任何内容。

在我的查询中,也许值得注意的是,我也对数据进行了多种形式的操作(由于如上所述的标准化要求)。例如,前几行如下所示:

SELECT 'XXX' AS [ID],
        REPLACE([Column 1], 'ABC', 'DEF) AS [Column 1],
        CASE WHEN [Column 2] = '1' THEN 'X'
             WHEN [Column 2] = '2' THEN 'Y'
             ELSE NULL
        END AS [Column 2]
...

因此,基本上我在

SELECT INTO
查询中使用了各种函数,例如
REPLACE
CASE WHEN
IIF
LEFT
。我还使用计算函数,例如
FLOOR
CONVERT
以及两列之间的划分。我的
SELECT INTO
查询中总共有 73 列,其中一些可以修复,
NULL
也是如此。

我的问题是,有什么办法可以加快我的查询速度吗?我在工作中经常使用 SQL,但在大学里并没有正式学习它,所以我确实知道执行计划概念的存在,但我不太确定它是如何工作的。我觉得这与这里的运行速度慢有关吗?特别是,如果我要在没有所有计算/标准化的情况下执行我的

SELECT INTO
查询,然后在第二个查询中执行这些操作,这会更有意义(就总运行时间而言)吗?

最后,也许还有一些值得注意的细节:

  1. 此表在我的
    SELECT INTO
    查询之前不存在,因此我使用查询创建它。
  2. SELECT INTO
    查询之前已经完成了很多数据清理和处理步骤,如果需要更改其中任何步骤,那么我将不得不再次运行此操作,在我看来,这对此非常低效特殊情况,因此,我的问题是询问是否有任何方法可以加快速度。
  3. 我使用的是 SQL Server 2016。

一个附带问题

仍然是查询运行时的主题,但有点离题,我还注意到同一查询的运行时可能有很大的差异。当运行时间一般都很小时,这显然并不重要,但例如在这个查询中,今天运行了 43 分钟,而昨天甚至在一个多小时后才完成。造成这种差异的原因是什么?


我也从更广泛的角度发布这篇文章,因为我真的很好奇,从概念上讲,这是否不是将数据插入表的理想方式,以便我可以改进自己的未来流程。

我将非常感谢任何直观的建议:)

sql sql-server insert sql-insert
1个回答
0
投票

完全明白了,让我们用通俗的话来分解一下:

问题:您有来自客户端的一堆数据(2400 万行)。你通常把它放到一个表中,但它突然变得超级慢。

您的方法:您使用的查询从一个表(我们称之为表 1)中获取数据并将其放入另一个表(表 2)中。此查询还对数据执行一些奇特的操作,例如替换单词和进行计算。

您的问题

  1. 如何加快速度?:您想知道是否有办法让这一切变得更快。
  2. 为什么速度不同?:有时快,有时慢。你很好奇为什么。

加快速度的方法

  1. 思考计划:SQL 计划事情的方式会影响速度。您可能想深入研究一下,但它可能很复杂。

  2. Split It Up:您可以先将数据放入 Table2,而不用做所有花哨的事情。然后,在第二步中,应用替换和计算。这可能会更快。

  3. 让您的电脑保持愉快:确保您的计算机有足够的电量来完成这项艰巨的任务。可以将其想象为确保您的汽车有足够的汽油进行长途驾驶。

  4. 检查您的清理步骤:确保您在此查询之前所做的数据清理是有效的。如果没有,它会减慢速度。

为什么速度不同?:

有时,为什么相同的查询花费不同的时间就像一个谜。这可能是因为您的计算机正在后台执行其他操作或您的数据库服务器正忙。

更大的图景

您还想知道将来是否有更好的方法来做到这一点。嗯,处理数据总是有不同的方法,这取决于具体情况。你所做的不一定是错的;它可能只需要一些调整来加快速度。

希望这可以帮助您应对数据挑战! 🚀

© www.soinside.com 2019 - 2024. All rights reserved.