Hỏi về việc tối ưu câu truy vấn SQL

Chào các cậu. Mình mới học lập trình và đi làm được khoảng vài tháng.

Mình có đi phỏng vấn và họ có gửi một câu để kiểm tra tư duy như sau:

ABC là công ty sale B2B. Bên bộ phận sale của cty ABC đang có sẵn database 1.000.000 bản ghi, mỗi bản ghi gồm có tên cty và domain của công ty đó (.com và .vn).

Công ty ABC thuê một bên khác thu nhập dữ liệu và họ cung cấp cho ABC tầm 5.000.000 bản ghi được lưu trong 20 file cỡ ~ 450MB (Đúng theo chuẩn format trong database hiện có của ABC).

Bài toán đặt ra cho ABC là làm sao để có thể duyệt 20 files kia để so sánh với các dữ liệu hiện có của mình trong database với thời gian nhanh nhất có thể.

Kết quả cuối cùng là lọc ra được những cty nào mới, cty nào đã có. Những cái mới thì sẽ insert vào một bảng khác.

Hiện tại thì mình đang hơi bí hướng giải quyết cho bài toán này. Xin được mọi người chỉ giáo.

Hi @TruongND_SE00392x,

Bao giờ cậu cần trả lời lại câu hỏi phỏng vấn này vậy? :smile:

3 Likes
  • chuẩn format này là gì? excel/csv/sql/json/xml/yaml…?
  • database này là database gì? mysql/mariadb/sqlserver/postgres… tính chất của mỗi loại khác nhau sẽ có giải pháp khác nhau

2 yếu tố trên đều anh hưởng đến cách lựa chọn giải pháp, câu hỏi này không nói rõ thì biết làm gì

3 Likes

Cái này mình tự đề xuất. Họ check luôn hiểu biết về từng công nghệ của mình đó cậu.

Giả sử format là csv.

DB là mysql/postgres/oracle

Cậu có thể nói giúp tớ về sự khác nhau và ưu điểm của từng công nghệ DB ko? Cái này tớ vẫn rất mù mờ.

Ngày mai Lib ạ!!!

1 Like

Có lẽ cậu nên tạo 1 thread riêng cho topic này :smile: Ít nhất để tránh các cuộc trò chuyện off-topic.

Thực ra, tớ có vài câu hỏi liên quan tới task kia.

  1. “Với thời gian nhanh nhất có thể” liên quan tới việc cậu đưa ra solution “được implement nhanh nhất có thể”, hay solution “chạy nhanh nhất có thể”? :smile:
    Ý kiến cá nhân tớ thì là solution implement nhanh nhất có thể, vì solution “chạy nhanh nhất có thể” đôi khi tốn cả tháng trời để optimize cho ra kết quả chạy trong vài s, trong khi solution “được implement nhanh nhất có thể” lại được implement trong 10 phút, và chạy xong trong vài phút.
  2. Cậu sẽ phải làm gì với danh sách những công ty nào đã có? Nếu như không cần thiết, liệu chúng ta có thể bỏ danh sách này đi trong mục kết quả không?

Tớ nghĩ họ không cần hiểu biết về từng công nghệ của trong câu hỏi này đâu :smile: Có lẽ họ chỉ quan tâm tới việc cậu xoay sở thế nào với task này thôi :smile:

Mặt khác, tớ có thể giúp cậu, nhưng nếu cậu pass công ty này với kiến thức chưa phải của cậu, cậu sẽ có quãng thời gian vô cùng tệ hại khi làm các task ở cty đó. Họ sẽ kỳ vọng cậu giải quyết được các bài toán như vậy một cách trơn tru, và cậu phải làm các task ít nhất có độ khó như vậy.
Cậu có chắc cậu muốn bọn tớ giúp bây giờ không? Hay để sau khi phỏng vấn, chúng ta có thể bàn bạc thêm, với mục đích tìm kiếm tri thức đơn thuần? :smile:

5 Likes

những câu hỏi kiểu so sánh các công nghệ rất dễ search ra, quan trọng là bạn có chịu khó đọc hay không mà thôi
ví dụ google: mysql vs postgresql
ngay link đầu tiên đã có
https://developer.okta.com/blog/2019/07/19/mysql-vs-postgres#:~:text=Postgres%20is%20an%20object-relational,more%20closely%20to%20SQL%20standards.

với bài toán này, mình cũng đồng ý theo bác Lib nói, thay vì bỏ ra hàng tuần hàng tháng để làm được một giải pháp chạy trong vài giây, thậm chí vài phút
thì chỉ cần có 3 ngày để làm một giải pháp bình thường rồi chạy giải pháp đó trong vài giờ (hoặc vài chục giờ). cách này có vẻ sẽ hay hơn, vì trong thực tế người ta chỉ cần nhanh có kết quả chứ không cần giải pháp hay
giải pháp hay cũng chỉ để khè nhau, chém gió mà thôi, không phù hợp để đánh đố level fresher/junior đâu

còn về giải pháp cùi bắp nhất và đơn giản nhất là đánh index cho field cần kiểm tra và insert tuần tự theo điều kiện mà thôi

    insert into xxx
    select ...
    from ....
    where not exist (...)

bạn cứ show hết tất cả những gì bạn có thể nghĩ ra được

6 Likes

Bài toán này bao gồm 2 bước.

  1. Làm sao để đọc mớ files text kia?
  2. Câu lệnh nào để kiểm tra nếu chưa có thì insert ?

1. Làm sao “load” text vào DB?

Cái này tùy thuộc vào từng hệ csdl nó hổ trợ khác nhau.
Vd, MySQL có LOAD DATA INFILE chạy khá nhanh. 5 triệu rows chưa kịp uống ly nước là nó load xong rồi. Oracle thì có sqlloader, hoặc dùng luôn external table,…

2. Sau khi đã vô DB rồi, giờ thì xài SQL thể kiểm tra.

Có nhiều cú pháp query có thể dùng, vd như NOT IN, NOT EXISTS, JOIN + WHERE, MERGE,…

Đã gọi là interview thì biết cái nào xài cái đó, nếu biết nhiều hơn 1 cách, chắc chắc sẽ phải trả lời câu hỏi "vậy câu nào nhanh hơn? Tại sao? " :smiley:

4 Likes

Thực ra thì tớ đã trả lời theo những gì mình biết để công ty họ đánh giá đúng năng lực rồi lib à.

Vấn đề ở đây là tớ không hài lòng với câu trả lời của mình lắm nên lên đây nghe ý kiến của mọi người để hoàn thiện câu trả lời.

2 Likes

mình cũng hơi bất ngờ khi được hỏi câu này khi phỏng vấn. Cảm ơn suggest của bạn nhé!

2 Likes

Này thuần về SQL thôi ah, có thông qua tầng application gì không?

3 Likes

Ừ cậu :smile: Như vậy là tốt nhất.


Về chiến lược giải quyết bài toán này, @csdl đã đề cập rất ổn rồi. Tớ chỉ mở rộng lại câu trả lời của cậu ấy chút thôi nha :smile:
Ngoài ra, tớ cũng muốn đưa ra hướng giải quyết theo đúng cách mà cậu nên tiếp cận khi giải quyết vấn đề trong thực tế. Vì câu hỏi mà cậu nhận được là câu hỏi behavior question, mục đích để xem cậu phản ứng và tiếp cận thế nào trước 1 tình huống xác định. Thường không có câu trả lời đúng cho loại câu hỏi này đâu cậu, chỉ có câu trả lời hợp lý thôi :smile:

Ngoài 2 bước chính mà @csdl đã chỉ ra, cậu còn 1 số bước nữa cần làm để giải quyết vấn đề này:

  1. Xác nhận requirement
    Nếu cậu có bất cứ câu hỏi nào về yêu cầu bài toán, cậu phải hỏi.
    Khi tớ train cho các bạn junior, tớ đôi lúc cố tình đưa ra 1 bài toán thiếu thông tin, để kiểm tra việc bạn ấy có hỏi để xác nhận yêu cầu bài toán không.
    Nếu có, bạn ấy là 1 junior tiềm năng. Nếu bạn ấy không hỏi lại, đó sẽ là bài học đầu tiên mà tớ dành cho bạn ấy: luôn xác nhận requirement đầu tiên.
  2. Chuẩn hóa dữ liệu
    Khi cậu làm việc với dữ liệu raw, cậu buộc phải cân nhắc dữ liệu đó đã đúng định dạng chưa. Khi thu thập dữ liệu, có rất nhiều lỗi đánh máy/lỗi tách dữ liệu có thể xảy ra, như thừa dấu cách, thêm ký tự lạ, etc.
  3. Lựa chọn công cụ giải quyết vấn đề
    Cậu cần cân nhắc cậu đã có gì, và muốn làm gì.
    Như cậu thấy, cậu đã có sẵn database, và có kiến thức tốt về SQL query, và 1 triệu record trên DB, vậy nên giải pháp tự nhiên nhất là cậu sẽ load dữ liệu lên database.
    Ngoài ra, cậu có thể cân nhắc cả text processing solution, nếu cậu biết 1 tool nào thực hiện chính xác điều cậu cần trên text file.
  4. Tải dữ liệu
    Cậu hẳn nhiên phải load text file này vào đâu đó để xử lý. Trong TH cậu dùng DB, cậu cũng có thể phải chuẩn hóa dữ liệu cho đúng format để load vào DB.
    Trong TH cậu dùng text processing approach, cậu có thể tìm cách load dữ liệu từ DB ra một file text khác để thực hiện sàng lọc.
  5. Sàng lọc dữ liệu
    Trong TH cậu dùng DB approach, cậu cần phải kiểm tra tất cả các index của bảng hiện có, và đánh index nếu cần. Lý do là vì cậu sẽ cần search rất nhiều trên đó.
    Khi cậu có index rồi, cố gắng tìm kiếm sử dụng index đó. Sẽ không có nhiều khác biệt giữa các câu query cậu sử dụng để phân loại khi cậu có index, nhưng sẽ có khác biệt rất lớn nếu cậu không có index.
    Phần còn lại sẽ là phần dễ nhất cho cậu: viết ra câu query để xác nhận công ty mới và công ty trùng lặp.
    Trong TH cậu dùng text processing approach, cậu sẽ không có index, nhưng nếu cậu biết cách dùng tool hợp lý, cậu có thể có được solution được cài đặt tương đối nhẹ nhàng trong 1 thời gian reasonable.
  6. Tổng hợp báo cáo và dọn dẹp hiện trường
    Cậu cần cleanup các bảng tạm, các file gốc được load ở đâu đó.

Hi vọng cách giải quyết trên sẽ giúp cậu hình dung phần nào cách tiếp cận vấn đề. Cũng sẽ rất tốt nếu cậu có thể cho bọn tớ biết solution mà cậu đã đưa ra, tớ nghĩ nó sẽ rất có ích cho các bạn khác :smile:

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