Chia Sẻ Trình Bày Các Giải Pháp Tối Ưu Trong Câu Hỏi Truy Vấn Và Giải Thích Chi Tiết - Môn Cơ Sở Dữ Liệu

Thảo luận trong 'Công Nghệ' bắt đầu bởi Alex, 26 Tháng mười một 2023.

  1. Alex

    Alex Member

    Bài viết:
    Tìm chủ đề
    95
    MÔN CƠ SỞ DỮ LIỆU

    TOP CÁC GIẢI PHÁP TỐI ƯU ĐƠN GIẢN


    [​IMG]


    Tối ưu hóa trong câu hỏi truy vấn đơn giản là những cách chiết xuất dữ liệu một cách nhanh, gọn nhất.


    1. Sử dụng tên cột thay vì Select *

    Khi tìm dữ liệu, ta thường sử dụng lệnh Select * để chiết xuất toàn bộ dữ liệu. Nhưng nhược điểm lớn nhất của Select * là có thể làm rò rĩ một số thông tin quan trọng hoặc bị xung đột cột cùng tên, đặc biệt gây khó nhìn với người truy vấn khi lượng thông tin lớn được xiết chuất. Vì thế, dùng cột thể hiện những dữ liệu cần tìm rõ ràng hơn, cụ thể hơn.

    Để tối ưu tìm kiếm những dữ liệu nhỏ cần thiết, ta chỉ cần dùng tên cột để truy vấn.

    Ví dụ: Tìm họ tên, mã nhân viên trong bảng nhân viên.

    [​IMG]

    2. Thay Subquery thành Join


    _ Subquery bản chất là truy vấn con bên trong truy vấn khác. Nhược điểm là hệ thống phải thực hiện nhiều lần bước chạy.

    + Giải thích hệ thống chạy của Subquery khác gì so với hệ thống chạy của Join

    Bản chất của Subquery là truy vấn trong truy vấn. Nghĩa là tìm dữ liệu lớn bên trong dữ liệu con, tìm dữ liệu này sang dữ liệu khác.

    [​IMG]

    Ví dụ khi dùng Subquery tìm họ tên của nhân viên trong mã dự án là NHK - 4123. Hệ thống sẽ dò các mã nhân viên trong bảng phân công ứng với mã dự án NHK - 4123. Sau đó kéo từ mã nhân viên bằng khóa ngoại được liên kết với bảng nhân viên để dò mã nhân viên tương ứng với họ tên nhân viên. Và rồi hệ thống sẽ kết nối lại với nhau và cho ra kết quả.

    Nó sẽ thực hiện từng bước dò tìm một.

    Hình ảnh về Subquery:

    [​IMG]

    Với giải pháp tốt hơn, câu lệnh Join sẽ là một đường dẫn kết nối nhanh hơn. Hệ thống sẽ hợp vị trí mã nhân viên trùng khớp với nhau trong 2 bảng phân công và nhân viên. Tìm mã dự án "NHK - 4123" và cho ra cả kết quả của họ tên nhân viên.

    Nói gọn lại Subquery sẽ thực hiện việc dò tìm dữ liệu từng bước một, từ cách dò dữ liệu trong bảng tìm kiếm này, rồi liên kết dò tìm dữ liệu tương ứng trong bảng tìm kiếm khác được ràng buộc bằng khóa ngoại. Còn đối với Join, nó là phép kết hợp các bảng với nhau, và truy vấn các liên kết ràng buộc.

    Hình ảnh về Join:

    [​IMG]

    - > Join là phép kết nối dữ liệu, xử lý song song các bảng và có ưu điểm là giảm tác vụ thực hiện.

    3. Hạn chế lệnh Distinct

    Distinct là câu lệnh so sánh. Mục đích loại bỏ sự trùng lặp dữ liệu trong truy vấn, để tổng hợp lại những dữ liệu khác nhau trong cùng 1 cột. Vì vậy khi dùng Distinct, ta sẽ không thể nào chiết xuất được toàn bộ dữ liệu.


    Đa phần mọi người sẽ hiểu sai Distinct về hệ thống rằng:

    Ví dụ khi tra năm sinh của tất cả các nhân viên, có khả năng cao một số nhân viên sẽ có năm sinh trùng nhau, như có 5 nhân viên trùng năm sinh 2005. Ta sẽ nhầm hiểu rằng hệ thống sẽ loại bỏ các năm sinh trùng nhau, và chỉ cho ra kết quả 1 nhân viên có năm sinh 2005 duy nhất.

    Tuy nhiên, nhìn vào kết quả bảng sau đây

    [​IMG]
    Rõ ràng, lệnh Distinct sẽ loại bỏ những thông tin giống nhau. Nó sẽ không lấy một nhân viên bất kỳ trong 5 người sinh năm 2005 trùng nhau, mà cho ra kết quả. Nó sẽ xóa những thông tin giống nhau để lấy ra một kết quả duy nhất.

    [​IMG]

    Vì vậy Distinct thường không quá hữu dụng đối với việc truy vấn.

    4. Kết hợp Union All

    Or là câu điều kiện liên kết nhiều dữ liệu khác nhau. Ví dụ trong bảng nhân viên có 3 cột "Mã nhân viên, mã sinh, mã phòng" Ta có thể tìm các nhân viên qua điều kiện của 3 cột đó.

    Ví dụ tìm nhân viên có mã số 2, hoặc là nhân viên có năm sinh 2005.

    [​IMG]

    Union All là 1 phép hợp giữa 2 hoặc nhiều bảng lại cùng nhau. Không giống Union là loại bỏ sự trùng lặp giống lệnh Distinct. Union All lấy luôn dữ liệu giống nhau, có sự trùng lặp.

    Vốn dùng Union All và Or sẽ cho ra kết quả giống nhau. Nhưng Union All có lợi thế hơn là liên kết được nhiều bảng hơn, thích hợp cho việc tìm kiếm những thông tin khác nhau trong các bảng khác nhau. Đa phần, Union All sẽ chạy trên hệ thống nhanh hơn là Or.

    [​IMG]

    5. Lệnh Exist thay cho In, Not In.

    Hệ thống khi sử dụng In, Not In sẽ khi tra dữ liệu sẽ dò toàn bộ danh sách.

    Ví dụ tìm nhân viên có thời gian phân công thực hiện hơn 6 tháng. Hệ thống sẽ dò toàn bộ bảng phân công tìm kiếm bao gồm cả mã nhân viên, và thời gian thực hiện. Để cho ra kết quả.

    [​IMG]

    Khác xa với hệ thống chạy của Exist. Nó sẽ kiểm tra thời gian thực hiện hơn 6 tháng trong bảng phân công có tồn tại hay không. Nếu có thì hệ thống sẽ hiển thị kết quả tương ứng với mã nhân viên. Thao tác thực hiện sẽ được rút ngắn nhiều hơn.

    -> Exist có chức năng kiểm tra sự tồn tại của dữ liệu được truy vấn.

    [​IMG]

    6. Tạo Index

    Index là một bảng nhỏ tương ứng với bảng chính, nó đánh dấu các vị trí dữ liệu trong bảng chính, giống như việc thêm liên kết ràng buộc. Điều này giảm thiểu số lần truy vấn, tăng tốc độ truy cập; dù Index có tính chiếm dụng không gian lưu trữ, khá tốn thời gian để tạo, và để chỉnh sửa.

    Tạo Index cho mã nhân viên trong bảng Nhân Viên:

    Create Index idx_MANV on NHANVIEN(MANV)

    Kết quả chạy của hệ thống: Mã nhân viên được tìm kiếm trực tiếp trong dòng Index, thay vì phải truy cập hết toàn bộ nội dung trong bảng chính để dò . Xuất dữ liệu dựa trên các trường liên quan.

    Sau khi tạo Index xong, chỉ cần dùng lệnh Select * như hình là thành công

    [​IMG]

     

Chia sẻ trang này

Đang tải...