Bình đẳng toán học của hai câu lệnh SQL


9

Có cách nào để kiểm tra sự bằng nhau toán học của hai câu lệnh SQL không?

Tôi có hai câu lệnh SQL:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

Chạy cả hai câu lệnh trên dữ liệu và so sánh đầu ra không giúp ích gì cả.

Các toán học tập hợp đằng sau các câu lệnh cần được đánh giá, giống như một bộ giải phương trình.

Trong phạm vi câu hỏi của tôi là những thứ như:

  • so sánh khác sau đó bình đẳng (lớn hơn, nhỏ hơn, THÍCH, ...)
  • thủ tục lưu trữ, hoặc kích hoạt
  • Biểu thức bảng chung (VỚI)

Trong phạm vi:

  • Các lựa chọn phụ: WHERE other_id IN (CHỌN id TỪ nơi khác ...)
  • THAM GIA

Một giải pháp một phần sẽ là so sánh các kế hoạch thực hiện của 2 truy vấn. Nếu các kế hoạch thực hiện là như nhau, thì chúng bằng nhau. Tuy nhiên, mối quan hệ không hoạt động cả hai cách. Có thể có 2 truy vấn tương đương logic có các kế hoạch thực hiện khác nhau.
BuahahaXD

1
@BuahahaXD: điều đó không đúng. select * from foo where id = 4chắc chắn sẽ có cùng một kế hoạch thực hiện nhưselect * from foo where id = 2
a_horse_with_no_name

@a_horse_with_no_name Tôi đã thử nghiệm nó trên SQL Server và nhận được 2 tệp XML khác nhau. Các tham số được bao gồm dưới dạng nút <ParameterList> trong tệp XML. Trực quan, các kế hoạch này là giống hệt nhau (quét bảng + chọn). Nhưng tôi tin rằng bạn có thể đúng khi so sánh các kế hoạch thực hiện.
BuahahaXD

1
@a_horse_with_no_name là chính xác khi nói đến các khóa duy nhất. Đối với tất cả những người khác, có thể có select * from foo where id = 4select * from foo where id = 2có hai kế hoạch thực hiện khác nhau nếu 1) các số liệu thống kê chỉ số không được cập nhật và 2) ngay cả khi các số liệu thống kê chỉ số được cập nhật, phân phối khóa của id bị sai lệch (cung cấp id không phải là một khóa duy nhất).
RolandoMySQLDBA

Câu trả lời:


6

Bình đẳng toán học của hai câu lệnh SQL là gì? Đối với tôi hai truy vấn là tương đương nếu, khi được cung cấp cả hai cùng một dữ liệu, chúng sẽ trả về cùng một tập kết quả.

Như bạn đã chỉ ra, các truy vấn SQL, một siêu đại số của đại số quan hệ , có thể rất phức tạp. Chúng tôi có thể trộn các truy vấn con, sử dụng các thủ tục và hàm được lưu trữ ( xác định hay không) sẽ khiến cho truy vấn của bạn trông giống mã thực hơn . Nếu bạn đang nói về các loại truy vấn này thì nó sẽ thực sự khó khăn. Trong thực tế, nó có lẽ không khác gì vấn đề "là hai thuật toán tương đương".

Trong những điều kiện đó có lẽ là không thể.

Tuy nhiên...

... thể khả thi nếu hai truy vấn bạn muốn so sánh là các thao tác được đặt nghiêm ngặt. Nếu vậy, bạn có thể chuyển đổi các truy vấn thành đại số quan hệ và sau đó thực hiện theo các quy tắc tương đương . Nếu bạn có một lựa chọn / hạn chế với các điều kiện boolean không cần thiết thì cuối cùng bạn có thể cần phải chứng minh hơn các điều kiện của họ cũng tương đương. Sau đó, bạn sẽ cần phải dựa vào đại số boolean và cuối cùng bạn có thể sẽ làm một bảng chân lý .

Như bạn có thể thấy đây sẽ là rất nhiều công việc và, theo như tôi biết, không có gì tồn tại để tính toán tất cả những điều đó một cách tự động. Tuy nhiên, tôi đã tìm thấy một số công cụ mà bạn có thể thấy hữu ích nếu bạn muốn giải quyết công việc:


Câu hỏi của tôi chỉ là về hoạt động thiết lập. Tôi cập nhật câu hỏi. Nó liên quan đến vấn đề "là hai thuật toán tương đương". Nhưng bối cảnh là giới hạn, chỉ có các hoạt động cơ bản của tập hợp, tham gia, chọn phụ nằm trong phạm vi của tôi.
guettli

3

Theo định nghĩa, không thể kiểm tra tính tương đương ngữ nghĩa trong thời gian hữu hạn, xem định lý của Rice :

đối với bất kỳ thuộc tính không tầm thường nào của các hàm một phần, không có phương pháp chung và hiệu quả nào để quyết định liệu thuật toán có tính toán một hàm với thuộc tính đó hay không.


2
Đây chỉ là một bình luận. Bạn có thể mở rộng khả năng ứng dụng của Rice vào bối cảnh này không?
Michael Green

Ngay cả khi về mặt lý thuyết có thể, cú pháp tiêu chuẩn SQL hiện tại rất đơn giản, thực tế là không thể
James Anderson

1
Với lời giải thích của OP, có vẻ như câu hỏi liên quan đến sự tương đương logic hơn là sự tương đương về ngữ nghĩa. Câu hỏi thực sự là: chúng ta có thể chuyển đổi các câu lệnh SQL thành một biểu thức toán học và sau đó đánh giá tính tương đương logic không?
Tha thứ

2

người dùng dba Lennart đã chỉ cho tôi dự án này:

http://cosette.cs.washington.edu/

Cosette là một prover tự động để kiểm tra tương đương của các truy vấn SQL. Nó chính thức hóa một đoạn đáng kể của SQL trong Coq Proof Assistant và máy ảo tượng trưng Rosette. Nó trả về một bằng chứng chính thức về sự tương đương hoặc một ví dụ mẫu cho một cặp truy vấn đã cho.


1

Một cách để làm điều đó là xây dựng một trình phân tích cú pháp, hoặc tốt hơn, sử dụng một trình phân tích hiện có. Tôi tin rằng C # có lớp TSQLParser và có phương thức Parse (). Trình phân tích cú pháp sẽ ngắt truy vấn của bạn thành các lớp con mà sau đó bạn có thể so sánh.


1

Nếu bạn đang tìm kiếm một bài kiểm tra tương đương dựa trên Lý thuyết tập hợp, cách tốt nhất của bạn là chuyển đổi bất kỳ WHEREđiều kiện nào có thể được chuyển đổi thành một loại JOIN(bên trong hoặc bên ngoài) và được tái cấu trúc câu lệnh. Điều này bao gồm IN subselectEXISTS subselectvà bất kỳ điều kiện nào khác trong WHEREmệnh đề có chứa từ đó SELECT. Nếu bạn thực hiện điều này trên cả hai câu lệnh SQL, bạn sẽ có một FROMmệnh đề mới đại diện cho logic / toán học dựa trên tập hợp mà bạn quan tâm. Sau đó, bạn có thể so sánh trực quan hai câu lệnh. Nếu bạn đang tìm kiếm một cách tự động để làm tất cả những điều này, tôi không biết về một công cụ có thể làm chính xác điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.