Xác định các cấu phần xử lý truy vấn

Đã hoàn thành

Có bốn giai đoạn riêng biệt để thực hiện truy vấn. Theo thứ tự thực hiện các giai đoạn này là:

  1. Phân tích
  2. Chuyển đổi (Viết lại)
  3. Kế hoạch
  4. Thực hiện

Trình phân tích cú pháp

Trình phân tích cú pháp chịu trách nhiệm kiểm tra chuỗi truy vấn về cú pháp hợp lệ. Phân tích cú pháp có hai phần chính:

  • gram.y được tạo thành từ một tập hợp các quy tắc ngữ pháp và hành động tương ứng.
  • scan.1lexer, công nhận mã định danh và từ khóa SQL. Mỗi từ khóa hoặc mã định danh kích hoạt một mã thông báo đang được tạo và đưa cho phân tích cú pháp.

Trình phân tích cú pháp xây dựng một cây truy vấn, phân tách truy vấn thành các phần có thể nhận dạng để hiểu bảng nào có liên quan, bộ lọc nào được áp dụng, v.v. Các phần của cây truy vấn là:

  • Loại lệnh - SELECT, INSERT, UPDATE hoặc DELETE.
  • Mục nhập bảng phạm vi (RTE) - một danh sách các mối quan hệ, ie bảng, truy vấn con, kết quả của các kết nối, v.v. Trong câu lệnh SELECT, các mục này xuất hiện sau từ khóa FROM.
  • Mối quan hệ kết quả - mối quan hệ kết quả cho các lệnh INSERT, UPDATE và DELETE, là bảng hoặc dạng xem nơi các thay đổi sẽ có hiệu lực.
  • Danh sách đích - kết quả của truy vấn, được xác định giữa các từ khóa SELECT và FROM. Các lệnh DELETE không tạo ra kết quả, vì vậy trình lập kế hoạch sẽ thêm một mục nhập đặc biệt để cho phép người thực thi tìm hàng bị xóa. Các lệnh INSERT xác định các hàng mới cần đi vào quan hệ kết quả. Đối với các lệnh UPDATE, danh sách đích mô tả các hàng mới sẽ thay thế các hàng cũ.
  • Qualification - giá trị Boolean chỉ định thao tác cho hàng kết quả cuối cùng có nên được thực hiện hay không. Câu lệnh này tương ứng với mệnh đề WHERE của một câu lệnh SQL.
  • Cây nối - cây này có thể là danh sách các mục FROM. Có thể thực hiện nối theo bất kỳ thứ tự nào hoặc thực hiện theo một thứ tự cụ thể, chẳng hạn như nối ngoài.
  • Khác - các mục không liên quan ở giai đoạn này, chẳng hạn như mệnh đề ORDER BY.

Người viết lại

Đầu ra của trình phân tích cú pháp được chuyển sang quy trình chuyển đổi hoặc ghi lại, trừ khi tìm thấy lỗi trong trường hợp đó thông báo lỗi được trả về.

Trình ghi lại truy vấn sẽ viết lại văn bản truy vấn bằng cách áp dụng các quy tắc cho nó. Người viết lại xem xét các quy tắc, rồi truyền truy vấn đã sửa đổi đến trình lập kế hoạch truy vấn. Bảo mật cấp hàng được thực hiện ở giai đoạn này.

Ví dụ: các quy tắc trên SELECT luôn được áp dụng như bước cuối cùng, bao gồm truy vấn INSERT, UPDATE và DELETE. Quy tắc cũng có nghĩa là truy vấn UPDATE không ghi đè lên các hàng hiện có, thay vào đó sẽ chèn một hàng mới và hàng cũ sẽ được ẩn. Sau khi cam kết giao dịch, quá trình chân không có thể loại bỏ hàng ẩn.

Trình lập kế hoạch

Công việc của trình lập kế hoạch là áp dụng các quy tắc truy vấn và hiểu rõ những cách thực thi truy vấn khác nhau nào là nhanh nhất.

Trình lập kế hoạch tạo ra một cây kế hoạch, với các nút đại diện cho các hoạt động vật lý trên dữ liệu.

PostgreSQL sử dụng trình tối ưu hóa truy vấn dựa trên chi phí để tìm kế hoạch tối ưu cho truy vấn. Trình lập kế hoạch đánh giá các kế hoạch thực thi khác nhau và ước tính mức độ cần thiết của các tài nguyên bắt buộc, chẳng hạn như chu kỳ CPU, hoạt động I/O, v.v. Ước tính này sau đó được chuyển đổi thành đơn vị, được gọi là chi phí kế hoạch. Gói có chi phí thấp nhất được chọn.

Tuy nhiên, khi số lượng liên kết tăng lên, số kế hoạch có thể tăng theo cấp số mũ. Không thể đánh giá mọi kế hoạch khả thi ngay cả đối với các truy vấn tương đối đơn giản. Heuristics và thuật toán được sử dụng để giới hạn số lượng các kế hoạch có thể. Kết quả là kế hoạch đã chọn có thể không phải là kế hoạch tối ưu. Tuy nhiên, nó gần tối ưu và được chọn trong một thời gian hợp lý.

Chi phí là ước tính tốt nhất của planner. Mục đích của ước tính chi phí là để so sánh các kế hoạch thực hiện khác nhau cho cùng một truy vấn trong cùng một điều kiện. Trình lập kế hoạch sử dụng thống kê được thu thập trên bảng và hàng để tạo ra ước tính chi phí cho truy vấn. Để ước tính chi phí chính xác, thống kê phải được cập nhật.

Thống kê cập nhật

Cấu phần planner của trình tối ưu hóa truy vấn sử dụng thống kê về bảng và hàng để tạo ra ước tính chi phí chính xác.

ANALYZE thu thập thống kê về bảng cơ sở dữ liệu và lưu trữ kết quả trong ca-ta-lô pg_statistic thống nhất. Bạn cần chạy ANALYZE, nếu:

  • Bạn đã tắt tính năng tự động kiểm nhập (mà thường phân tích bảng tự động)
  • Bạn đã tắt tính năng tự động bỏ chọn và gần đây không chạy ANALYZE
  • Một trong hai câu lệnh trước đó và có nhiều câu lệnh INSERTS, UPDATES hoặc DELETE.

Ước tính chi phí dựa trên up-toliệu thống kê ngày tháng và nếu thống kê không cập nhật và kế hoạch không hiệu quả có thể được chọn. Khi không có tham số nào được chuyển tới ANALYZE, mọi bảng trong cơ sở dữ liệu sẽ được kiểm tra.

Cú pháp cho ANALYZE là:

ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]

VERBOSE hiển thị thông báo tiến độ để hiển thị bảng nào đang được phân tích cùng với một số thống kê.

Lên lịch VACUUM và ANALYZE để chạy hàng ngày trong thời gian sử dụng thấp. PHÂN TÍCH có thể chạy song song với các hoạt động khác vì nó chỉ yêu cầu khóa đọc trên bảng đích.

Người thực thi

Giai đoạn này lấy kế hoạch được tạo ra bởi trình lập kế hoạch và xử lý nó đệ quy để trích xuất tập hợp các hàng được yêu cầu. Mỗi khi một nút kế hoạch được gọi là người thực thi phải cung cấp một hàng, hoặc báo cáo lại để nói rằng nó đã hoàn tất.

Trình thực thi đánh giá tất cả bốn kiểu truy vấn SQL:

  • CHỌN
  • CHÈN
  • CẬP NHẬT
  • XÓA

Đối với SELECT, người thực thi trả mỗi hàng về lại máy khách như tập kết quả.

Đối với INSERT, mỗi hàng được trả về sẽ được chèn vào bảng đã xác định. Tác vụ này được thực hiện trong một nút kế hoạch mức cao nhất đặc biệt được gọi là ModifyTable.

Đối với UPDATE, mỗi hàng được tính toán bao gồm tất cả các giá trị cột được cập nhật, cùng với ID hàng của hàng đích. Dữ liệu được gửi đến một nút ModifyTable, tạo ra một hàng được cập nhật và đánh dấu hàng cũ là đã xóa.

Đối với DELETE, cột duy nhất được gói trả về là ID hàng. Nút ModifyTable sử dụng ID hàng để đánh dấu hàng là đã xóa.