Filter và import data trong sql, đây có phải là cách nhanh nhất chưa?

Chào mọi người, em có một bài toán thế này, giả sử có một cơ sở dữ liệu mới và một cơ sở dữ liệu cũ, cơ sở dữ liệu cũ bao gồm tất cả dữ liệu từ trước tới nay, ví dụ từ 2015-2020; và cơ sở dữ liệu mới chỉ có dữ liệu từ 2018-2020, bài toán đặt ra là làm thế nào để import từ CSDL cũ vào CSDL mới này một cách nhanh nhất.
Em làm thế này:

INSERT INTO TAB_INIT (
SELECT * FROM TAB_FINAL 
WHERE COL_1 NOT IN (SELECT COL_1 FROM TAB_INIT))

Em có trình bày cách này với anh leader, anh ấy chỉ bảo là về suy nghĩ thêm.
Em có tạo thử 2 tab trên db2 trên cloud và test thử tốc độ thế nào, tab_1 gồm 1 triệu rows và 23 col, tab_2 gồm 1 tr 50k row và 23 col. Kết quả là nó chạy mất 10 giây


Em không biết thực tế người ta làm thế nào, muốn tham khảo ý kiến của các anh, em xin cảm ơn ạ.

Thứ nhất, bạn không nói bạn đang dùng CSDL nào, nên không thể nói một cách cụ thể câu lệnh nào để chạy nhanh nhất.

Về lý thuyết thì có 2 cách:
- Cách 1: đó là cách bạn làm ở trên, nhưng bỏ mệnh đề WHERE trong câu query đi. Có 2 lý do:

  • Tại sao phải WHERE trong khi miền dữ liệu của 2 table là khác nhau ?
  • Với dữ liệu lớn thì mệnh đề WHERE kia sẽ làm câu query chạy …tới Tết chưa xong!

Nếu bạn dùng Oracle thì thêm hint Append vào trong câu trên để chuyển nó thành direct-path insert (nhanh hơn nhiều lần so với conventional-path insert).

*INSERT /*+ append / …

- Cách 2: Nếu database của bạn hổ trợ Partitioning.
Lúc này bạn chỉ cần tạo partition table, sau đó dùng kỷ thuật Exchange-Partition với 2 tables kia. Mỗi table hiện tại sẽ thành 1 partition trong partition table mới.
Bước chuẩn bị có thể tốn chút thời gian, nhưng lệnh exchange/switch partition chỉ tốn chưa tới 1 second!

1 Like

Bằng cách nào đó tớ miss câu hỏi này :sweat:

Trong thực tế thì giải pháp thường phụ thuộc chủ yếu vào:

  • 2 DB của cậu có thể kết nối được với nhau không.
    Cách của cậu chỉ chạy nếu 2 database này kết nối được với nhau.
  • Mong muốn của cậu. “Nhanh nhất” là về thời gian thực thi solution, hay thời gian xây dựng và cài đặt solution?

Trong thực tế, solution đơn giản và nhanh nhất (về mặt cài đặt), có thể áp dụng vào bất cứ TH nào, thường là drop luôn table đích, export dữ liệu từ table nguồn và import vào table đích. Bất cứ database nào cũng support cách import/export dữ liệu từ table (IBM DB2 mà cậu đang dùng có import/export utility, hoặc UNLOAD utility với big data set).

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?