2009-02-19 38 views
1

查詢是:更新與內部連接到同一個表的優化

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。不同的結果與否,我(再次)學到了新的東西。謝謝。 – 2009-02-19 11:54:35

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