2013-11-15 4 views
0

У меня есть таблица с 9-миллионной записью Мне нужно прокручивать каждую строку и ее нужно вставлять в несколько таблиц на каждой итерации.MS sql-сервер, проходящий через огромную таблицу

Мой пример запроса

//this is the table with 9 million records 
create table tablename 
(
    ROWID INT IDENTITY(1, 1) primary key , 
    LeadID int, 
Title varchar(20), 
FirstName varchar(50), 
MiddleName varchar(20), 
Surname varchar(50) 
) 


declare @counter int 
declare @leadid int 
Declare @totalcounter int 

set @counter = 1 
Select @totalcounter = count(id) from tablename 
while(@counter < @totalcounter) 
    begin 
    select @leadid = leadid from tablename 
    where ROWID = @counter 

    --perform some insert into multiple tables 
    --in each iteration i need to do this as well 
    select * from [sometable] 
     inner join tablename where leadid = @leadid 

     set @counter = @counter + 1 
    end 

Проблема здесь это занимает слишком много времени, особенно объединения на каждой итерации.

Может кто-то, пожалуйста, помогите мне оптимизировать это.

+1

Пожалуйста, объясните, что вы хотите достичь. Почему нет простого соединения? Почему цикл и счетчики? –

+0

В идеале вы выражаете операции в режиме набора и избегаете циклирования вообще. Но в данный момент мы не можем с этим поделать, потому что все, что вы показываете нам, - это код вашей петлевой инфраструктуры. –

+0

Что это за запрос с 'INNER JOIN' для ????? Это имеет смысл только на последней итерации - если ваша хранимая процедура возвращает ее как результат набора – valex

ответ

0

Да, ваше соединение длится долго, потому что между вашими двумя таблицами не существует условия соединения, поэтому вы создаете декартово произведение. Это определенно займет некоторое время.

Если yuo хочет оптимизировать это, укажите, к чему вы хотите присоединиться к этим таблицам.

Если все еще медленно, взгляните на соответствующие индексы.

0

Похоже, вы пытаетесь найти все строки в sometable, которые имеют одинаковые leadid в виде строк в tablename? Если да, то простое соединение должно работать

select t2.* 
from tablename t2 inner join sometable t2 
    on t1.leadid=t2.leadid 

До тех пор, пока у вас есть индекс по LEAID вы не должны иметь никаких проблем

Что вы на самом деле пытаетесь сделать?

Смежные вопросы