2012-06-11 33 views
7

Tôi có một truy vấn SQL với cấu trúc sau:Tối ưu hóa một cuộc gọi chức năng lưu trữ trong điều khoản SELECT và ĐÂU

SELECT *, storedfunc(param, table.field) as f 
FROM table 
WHERE storedfunc(param, table.field) < value 
ORDER BY storedfunc(param, table.field); 

Có cách nào để tối ưu hóa này loại bỏ một số cuộc gọi chức năng? Hoặc MySQL thực hiện tối ưu hóa như vậy đằng sau hiện trường? Trong thực tế, hàm được khai báo là xác định.

Tôi cũng cần đề cập đến các tham số chức năng một phần từ các cột của bảng đã chọn. Tôi đã thay đổi ví dụ một chút để phản ánh điều này.

+0

là 'param' một trong bảng hoặc tham số? –

Trả lời

7

Rewrite và thử nghiệm cái nào thực hiện nhanh hơn:

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
WHERE storedfunc(param, table.column) < value 
ORDER BY f ; 

SELECT * 
FROM 
    (SELECT *, storedfunc(param, table.column) AS f 
    FROM table 
) AS tmp 
WHERE f < value 
ORDER BY f ; 

Trong MySQL, bạn thậm chí có thể viết như thế này (cảnh báo: không chuẩn SQL cú pháp):

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
HAVING f < value 
ORDER BY f ; 
+0

Kỳ lạ thay, tôi đã thử sau nhưng MySQL đã hiển thị lỗi. Sẽ thử lại lần nữa. – Stan

+0

Bạn có thể đăng chính xác những gì bạn đã thử không? Và thông báo lỗi là gì? –

+0

Trong thực tế, tôi đã thử f trong mệnh đề 'where', không phải trong' có', đây là lý do tại sao nó tạo ra lỗi. Dù sao, MySQL có đồng nhất tự động tối ưu hóa không, do khai báo hàm 'xác định'? – Stan

Các vấn đề liên quan