Eu tenho uma tabela contendo 700.000 linhas contendo um campo de id de string com valores como rec-232276-dup-0 e rec-354240-org. O rec- é constante, mas as outras partes do id podem mudar.
Quero dividir essa string para ter apenas a parte inteira e um valor booleano, dependendo se a próxima parte for igual a dup ou org (1 para dup, 0 para org) que inserirei de volta na tabela.
Eu escrevi o seguinte loop para fazer isso e funcionalmente funciona bem, mas quando eu o executo nas 700.000 linhas completas, leva um tempo excessivamente longo (+12 horas e contando).
O que fiz de errado para que demorasse tanto? É a manipulação de string que causa isso? O que posso fazer para melhorar isso?
Obrigado pela ajuda.
Meu roteiro é o seguinte:
select id
into #ControlTable
from [dbo].[original_test_dataset]
declare @TableID varchar(20)
while exists (select * from #ControlTable)
begin
select @TableID = (select top 1 id
from #ControlTable
order by id asc)
declare @duplicate bit
declare @id_only varchar(10)
--1. Find id only
-- Trim off rec-
set @id_only = REPLACE(@TableID,'rec-','')
-- Find position of first - and then take everything before it
set @id_only = LEFT(@id_only,CHARINDEX('-',@id_only,0))
set @id_only = REPLACE(@id_only,'-','')
UPDATE original_test_dataset set id_only = @id_only WHERE id = @TableID;
--2. Find if duplicate
IF(PATINDEX('%dup%',@TableID) = 0)
BEGIN
-- No duplicate so original file
UPDATE original_test_dataset set duplicate = 0 WHERE id = @TableID;
END
ELSE
BEGIN
-- Duplicate
UPDATE original_test_dataset set duplicate = 1 WHERE id = @TableID;
END
delete #ControlTable
where id = @TableID
END
drop table #ControlTable
Definição de tabela adicionada conforme solicitado:
CREATE TABLE [dbo].[original_test_dataset](
[id] [varchar](50) NULL,
[ FirstName] [varchar](50) NULL,
[ LastName] [varchar](50) NULL,
[ Phone1] [varchar](50) NULL,
[ Phone2] [varchar](50) NULL,
[ Phone3] [varchar](50) NULL,
[ No] [varchar](50) NULL,
[ Road] [varchar](50) NULL,
[ Village] [varchar](50) NULL,
[ Town] [varchar](50) NULL,
[ PC] [varchar](50) NULL,
[ County] [varchar](50) NULL,
[ DOB] [varchar](50) NULL,
[id_only] [varchar](10) NULL,
[duplicate] [bit] NULL
) ON [PRIMARY]
GO
/****** Object: Index [PK_ORIGINAL_TEST_DATASET_ID] Script Date: 03/09/2014 07:47:19 ******/
CREATE CLUSTERED INDEX [PK_ORIGINAL_TEST_DATASET_ID] ON [dbo].[original_test_dataset]
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO