我有大约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]表中。希望现在更加清楚。
答案 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
您似乎也忽略了字符串匹配中的大写/小写。我不清楚您是否需要更仔细地考虑这一点。