Helpex - Trao đổi & giúp đỡ Đăng nhập
3

Tôi hy vọng một số nhà phát triển cơ sở dữ liệu / dwh hoặc DBA có kinh nghiệm hơn có thể cân nhắc vấn đề này:

Nhóm của tôi đang sử dụng OBIEE làm công cụ giao diện người dùng để thúc đẩy báo cáo đặc biệt do các đơn vị kinh doanh của chúng tôi thực hiện.

Có rất nhiều độ trễ khi tạo ra các tổ máy tương đối nhỏ. Chúng tôi đang phải đối mặt với ~ 1 giờ để tạo ra ~ 50k bản ghi.

Tôi đã xem xét một trong những truy vấn đang hoạt động theo cách này và tôi rất ngạc nhiên khi thấy rằng tất cả các bảng đang được tham chiếu đang được nối chéo và sau đó các bộ lọc đang được áp dụng trong WHEREmệnh đề.

Vì vậy, để minh họa, các truy vấn có xu hướng như sau:

SELECT ...
FROM tbl1
    ,tbl2
    ,tbl3
    ,tbl4
WHERE tbl1.col1 = tbl2.col1
and tbl3.col2 = tbl2.col2
and tbl4.col3 = tbl3.col3

thay vì như thế này:

SELECT ...
FROM tbl1
INNER JOIN tbl2
    ON tbl1.col1 = tbl2.col1
INNER JOIN tbl3
    ON tbl3.col2 = tbl2.col2
INNER JOIN tbl4
    ON tbl4.col3 = tbl3.col3

Bây giờ, từ những gì tôi biết về thứ tự của các hoạt động truy vấn, FROMmệnh đề được thực hiện trước WHEREmệnh đề, vì vậy ví dụ đầu tiên sẽ hoạt động chậm hơn nhiều so với ví dụ sau. Tôi có đúng không (vui lòng chỉ trả lời nếu bạn biết câu trả lời trong ngữ cảnh của Oracle DB)? Rất tiếc, tôi không có quyền quản trị viên để chạy theo dõi đối với 2 phiên bản khác nhau của truy vấn.

Có lý do gì để thiết lập truy vấn theo cách đầu tiên, liên quan đến cách giao diện OBIEE hoạt động không? Hãy nhớ rằng, truy vấn là kết quả của việc người dùng kéo và thả các thuộc tính vào một hộp cát, từ một 'ngân hàng' các thuộc tính. Việc chọn bất kỳ sự kết hợp nào của các thuộc tính sẽ tạo ra đầu ra (nếu dữ liệu tồn tại). Các thuộc tính đến từ nhiều bảng khác nhau. Tôi không có bất kỳ kinh nghiệm nào trong việc thiết kế mecahnism tạo ra SQL dựa trên loại lựa chọn thuộc tính đặc biệt này, vì vậy tôi không biết liệu thiết kế truy vấn trong ví dụ đầu tiên có cần thiết để phục vụ loại công cụ báo cáo này hay không.

3 hữu ích 2 bình luận 808 xem chia sẻ
4

Đừng lo lắng, trước đây Oracle đã sử dụng ký hiệu đầu tiên cho các phép nối bên trong nhưng sau đó dựa trên các tiêu chuẩn ANSI SQL được thông qua.

Các kết quả về hiệu suất và các tập bản ghi trả về là hoàn toàn giống nhau, các phép nối 'dấu phẩy' ngầm không vượt qua tập kết quả mà tích hợp các WHEREbộ lọc một cách hiệu quả . Nếu bạn nghi ngờ điều đó, hãy chạy một EXPLAIN SELECTlệnh cho cả hai truy vấn và bạn sẽ thấy các thuật toán ẩn sẽ giống hệt nhau.


Mở rộng câu trả lời này, bạn có thể nhận thấy trong tương lai ký hiệu tương tự (+) thay cho các phép nối bên ngoài. Câu trả lời này cũng sẽ đúng trong bối cảnh đó.

Vấn đề thực sự xảy ra khi cả hai ký hiệu (liên kết ngầm định và rõ ràng) được trộn lẫn trong cùng một truy vấn. Điều này sẽ gây rắc rối lớn trong thời gian, nhưng tôi nghi ngờ bạn sẽ tìm thấy một trường hợp như vậy trong OBIEE.

4 hữu ích 5 bình luận chia sẻ
1

Đó là các phép nối bên trong, không phải phép nối chéo, chúng chỉ sử dụng cú pháp cũ để thực hiện nó chứ không phải ANSI như bạn mong đợi.

Hầu hết các truy vấn nối đều chứa ít nhất một điều kiện nối, trong mệnh đề FROM hoặc mệnh đề WHERE. ( Tài liệu Oracle )

Đối với một truy vấn đơn giản như trong ví dụ của bạn, việc thực thi phải giống hệt nhau.

Khi bạn đã đặt các phép nối bên ngoài (trong phép nối mô hình kinh doanh), bạn sẽ thấy OBI tạo ra một truy vấn trong đó các phép nối bên trong được thực hiện trong mệnh đề WHERE và các phép nối bên ngoài được thực hiện ANSI trong câu lệnh FROM - chỉ để làm cho mọi thứ thực sự khó gỡ lỗi !

SELECT ...
FROM tbl1
    ,tbl2
    ,tbl3 left outer join
         tbl4 on tbl3.col1 = tbl4.col2
WHERE tbl1.col1 = tbl2.col1
and tbl3.col2 = tbl2.col2
and tbl4.col3 = tbl3.col3
1 hữu ích 3 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql database oracle database-design obiee , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading