SQL查询的执行时间似乎过多

时间:2018-08-29 23:58:33

标签: sql-server

我有大约3300万行和20列的数据集。列之一是原始数据选项卡,我正在使用该选项卡从中提取相关数据,包括ID和帐号。

我将用户ID的列提取到一个临时表中,以修剪用户ID的空格。我现在正在尝试使用以下代码将修剪后的“用户ID”列添加回原始数据集中:

SELECT * 
FROM [dbo].[DATA] AS A
INNER JOIN #TempTable AS B ON A. [RawColumn] = B. [RawColumn]

对于每个查询,提取用户ID和修剪空格大约需要一分钟。但是,运行此最后一个查询的时间是2小时,而整个数据集的访问距离仅为2%。

是否有更好的方法来运行查询?

我正在SQL Server 2014 Management Studio中运行查询

谢谢

更新:

我继续让它运行一整夜。当我重新投入工作时,在3300万行中,只有600万行已完成。我取消了执行,并尝试使用以下方法添加一个较小的主键(我只能在表上看到的另一个键是[RawColumn],这是一个很长的字符串):

ALTER TABLE [dbo].[DATA]
ADD ID INT IDENTITY(1,1)

现在我要执行死刑一个小时了。 接下来,我打算使用

使其成为主键
ALTER TABLE dbo.[DATA]
ADD CONSTRAINT PK_[DATA] PRIMARY KEY(ID) 

我对使用索引不熟悉。我尝试在Stack Overflow上查找如何创建索引,但是从我的阅读中看来,创建索引所需的时间与创建索引所需的时间一样长。运行此查询。我对此有误吗?

对于RawColumn数据的上下文,它看起来像这样:

FirstName: John   LastName: Smith     UserID: JohnS   Account#: 000-000-0000

更新#2:

我现在知道使用“ ALTER TABLE”是个坏主意。我应该对如何向表添加主键进行更多的研究。

更新#3

这是我用来从“ RawColumn”数据中提取“ UserID”代码的代码。

DROP #TEMPTABLE1
GO
SELECT [RAWColumn],
SUBSTRING([RAWColumn], CHARINDEX('USERID:', [RAWColumn])+LEN('USERID:'), CHARINDEX('Account#:', [RAWColumn])-Charindex('Username:', [RAWColumn]) - LEN('Account#:') - LEN('USERID:')) AS 'USERID_NEW'
INTO #TempTable1
FROM [dbo].[DATA]

接下来,我修剪了临时表中的数据

DROP #TEMPTABLE2
GO
SELECT [RawColumn],
LTRIM([USERID_NEW]) AS 'USERID_NEW'
INTO #TempTable2
FROM #TempTable1

因此,现在我正尝试将#TEMPTABLE2中的数据返回到我的原始[DATA]表中。希望现在更加清楚。

1 个答案:

答案 0 :(得分:0)

所以我认为您的解析代码有点错误。这是一种不假定值以任何特定顺序出现的方法。它确实假定标题/标签名称在冒号后面有一个空格,并且假定该值在后续的空格字符后结束。这是一个可操纵单个值的代码段。

denormalization

要在没有临时变量的单个查询中使用它,最直接的方法是用原始表达式替换“ @idx”的每个实例:

declare @dat varchar(128) = 'FirstName: John   LastName: Smith     UserID: JohnS   Account#: 000-000-0000';
declare @tag varchar(16) = 'UserID: ';

/* datalength() counts the trailing space character unlike len() */
declare @idx int = charindex(@tag, @dat) + datalength(@tag);
select substring(@dat, @idx, charindex(' ', @dat + ' ', @idx + 1) - @idx) as UserID

作为declare @tag varchar(16) = 'UserID: '; select RawColumn, substring( RawColumn, charindex(@tag, RawColumn) + datalength(@tag), charindex( ' ', RawColumn + ' ', charindex(@tag, RawColumn) + datalength(@tag) + 1 ) - charindex(@tag, RawColumn) + datalength(@tag) ) as UserID from dbo.DATA; ,它看起来像这样:

update

您似乎也忽略了字符串匹配中的大写/小写。我不清楚您是否需要更仔细地考虑这一点。