2009-02-19 3 views
1

запрос является:Update с внутренним соединением к той же таблице оптимизаций

CREATE TABLE logfile (
    sequence_number BIGINT, 
    start_time DECIMAL, 
    finish_time DECIMAL, 
    irp_major VARCHAR(100), 
    offset BIGINT, 
    length BIGINT, 
    filename VARCHAR(2000), 
    is_seq BIT 
    ); 
//bulk insert 120 000 rows 
CREATE CLUSTERED INDEX IX_logfile ON logfile(sequence_number); 
UPDATE dbo.logfile SET is_seq = (
SELECT CASE WHEN a.offset = (b.offset + b.length) THEN 1 ELSE 0 END AS seq 
FROM dbo.logfile a 
     LEFT JOIN dbo.logfile b 
      ON a.sequence_number = b.sequence_number + 1 
WHERE a.sequence_number = logfile.sequence_number) 

Есть в любом случае я могу улучшить производительность запроса обновления?

ответ

1
MERGE 
INTO logfile l 
USING (
    SELECT sequence_number + 1 AS pseq, 
     p.* 
    FROM logfile p 
) pl 
ON l.sequence_number = pseq 
WHEN MATCHED THEN 
    UPDATE 
    SET is_seq = CASE WHEN l.offset = (pl.offset + pl.length) THEN 1 ELSE 0 END 
+0

@Quassnoi. Разный результат или нет, я (снова) узнал что-то новое. Спасибо. –

+0

ahh нашел ошибку: sequence_number - 1 должен быть sequence_number + 1. Отлично работает сейчас, скорость более или менее эквивалентна @lievens, на порядок лучше, чем у меня :) – devzero

+0

Конечно, пропустил. – Quassnoi

1

Возможно, это обновление будет быстрее

UPDATE dbo.LogFile SET is_seq = 0 
UPDATE dbo.LogFile SET is_seq = 1 
FROM dbo.LogFile f 
    INNER JOIN (
     SELECT f2.sequence_number 
     FROM dbo.LogFile f1 
      INNER JOIN dbo.LogFile f2 ON f2.sequence_number = f1.sequence_number + 1  
     WHERE f1.Offset <> f2.Offset + f2.Length 
    ) f2 ON f2.sequence_number = f.sequence_number 
Смежные вопросы