2011-01-29 29 views
7

Tôi không nghĩ rằng có một cách dễ dàng để làm điều này, nhưng trên cơ hội ra rằng có ...Với kết quả mong muốn và thông tin cơ sở dữ liệu, programically xây dựng một truy vấn SQL cung cấp cho những kết quả

tôi đưa ra một số danh sách khoảng 10.000 hồ sơ mỗi từ một bảng kỷ lục 10 triệu. Dữ liệu hiện được tạo bởi các truy vấn trên các phần tử không được lập chỉ mục khác nhau. Tôi muốn tự động tạo các truy vấn cho kết quả tương tự, sử dụng mười trường được lập chỉ mục riêng biệt.

Có một thuật toán đã biết để xây dựng một cái gì đó như thế này không? Ngoài những điều cơ bản về việc bao gồm mỗi 'nút' được lập chỉ mục bằng OR của riêng nó, ý tôi là.

Ví dụ, giả sử dữ liệu muốn là:

Letter, Number 
A, 1 
A, 2 
B, 1 
C, 2 

và cơ sở dữ liệu ban đầu có

Letter, Number 
A, 1 
A, 2 
A, 3 
B, 1 
C, 1 
C, 2 
D, 1 
D, 3 

Tôi muốn một cái gì đó như:

WHERE ((Letter = 'A' OR Letter = 'B') AND (Number = 1 OR Number = 2)) 
OR (Letter = 'C' and Number = 2) 

Hoặc có thể

WHERE (Letter IN ('A', 'B', 'C') AND Number IN (1, 2) 
AND NOT (Number = 1 AND Letter = 'C')) 

Nhưng tôi nghĩ Tôi thà không có

WHERE (Letter = 'A' AND Number = '1') OR 
(Letter = 'A' AND Number = '2') OR 
(Letter = 'B' AND Number = '1') OR 
(Letter = 'C' AND Number = '2') 

- trừ khi các chuyên gia cơ sở dữ liệu ở đây nghĩ rằng đó sẽ là nhiều hơn nữa được tối ưu hóa trong thời gian dài, cho cỡ mẫu chúng ta đang nói về . Thời gian chạy của các truy vấn là quan trọng; thời gian chạy của công cụ chuyển đổi là không. Tôi cũng không nhất thiết phải có câu trả lời 'tốt nhất'; 'đủ tốt' là chấp nhận được.

Kế hoạch hiện tại của tôi là đếm, sắp xếp và lặp lại thông qua tìm kiếm những thứ có thể được nhóm lại với nhau, để cố gắng tạo càng ít 'nhóm' càng tốt; Tôi nghĩ rằng tôi không muốn có mười ngàn (A và B và C và D và E và F và G và H và tôi và J) ORed với nhau.

Suy nghĩ? Lời khuyên chuyên gia?

+0

Bất kỳ ý tưởng nào về cách gắn thẻ thẻ này cũng được đánh giá cao. Nó không thực sự là một câu hỏi SQL, cũng giống như một câu hỏi bất khả tri về ngôn ngữ diễn ra trong một không gian SQL. Tôi có lẽ nên tách riêng suy nghĩ về tối ưu hóa ở một nơi khác; Tôi quan tâm nhiều hơn đến thuật toán, ở đây. – Trevel

+0

Tôi đã thêm thẻ 'thuật toán'. Có thể có một thuật toán cụ thể, được đặt tên hoặc đặt tên là vấn đề phù hợp với điều này, nhưng tôi không biết nó có thể là gì. –

+0

Tất cả các truy vấn đó sẽ dẫn đến một kế hoạch truy vấn tương đương trên hầu hết các cơ sở dữ liệu. DB không thể thực hiện hiệu quả. –

Trả lời

0

Một giải pháp sẽ được sử dụng không áp dụng với các tình huống bạn không muốn:

Select Letter, Number 
From Table 
Except 
    (
    Select 'A', 3 
    Union All 
    Select 'C', 1 
    Union All 
    Select Distinct 'D', Number 
    From Table 
    ) 

Một giải pháp khác sẽ được chỉ đơn giản là cư một bảng tạm thời với danh sách các giá trị loại trừ và sử dụng Trừ chống lại đó.

Addition

Bản chất của thuật toán sử dụng để xác định tiêu chí của bạn là không rõ ràng. Nó sẽ được tìm kiếm các mục để bao gồm hoặc loại trừ? Hai giải pháp ban đầu của tôi cho rằng bạn đang xây dựng danh sách loại trừ. Tuy nhiên, nếu bạn đang xây dựng một danh sách các tạp chất thì rõ ràng bạn có thể sử dụng Intersect thay thế. Ngoài ra, bạn có thể có thể làm cho danh sách nhỏ hơn bằng cách sử dụng các giá trị xây dựng:

Select Letter, Number 
From Table 
Intersect 
Select * 
From (Values('A',1) 
    , ('A',2), ('A',3), ('B',1), ('C',2)) 

Như với Ngoại trừ kịch bản, nó có khả năng sẽ nhanh hơn để cư một bảng tạm thời với sự kết hợp mà bạn muốn và truy vấn so với .

1

Xin lỗi, đây không thực sự là câu trả lời cho câu hỏi của bạn, mà là sự suy nghĩ của tôi về vấn đề này.

Tôi khuyên bạn nên lưu trữ danh sách của mình trong một bảng riêng biệt. Điều đó sẽ cho phép bạn thực hiện một phép nối được chọn từ hai bảng ở cuối. Bạn có thể hoặc không thể sử dụng các chỉ mục trên bảng bộ lọc, tùy thuộc vào các thử nghiệm hiệu suất với dữ liệu của bạn.

Việc triển khai chính xác sẽ khác với các RDMBS cụ thể mà bạn định sử dụng. Trong ví dụ của tôi, tôi sẽ gắn bó với Oracle, vì đó là những gì tôi biết rõ nhất.

CREATE TABLE t_filter_lists (
    f_letter varchar2(1), 
    f_number number 
); 

-- Optionally, create an index: 
CREATE INDEX ix_filter_lists 
ON t_filter_lists (
    f_letter, 
    f_number 
); 

INSERT INTO t_filter_lists (f_letter, f_number) VALUES ('A', 1); 
INSERT INTO t_filter_lists (f_letter, f_number) VALUES ('A', 2); 
INSERT INTO t_filter_lists (f_letter, f_number) VALUES ('B', 1); 
INSERT INTO t_filter_lists (f_letter, f_number) VALUES ('C', 2); 
COMMIT; 

-- (Oracle-specific part) gather statistics on the filter table 
EXEC DMBS_STATS.GATHER_TABLE_STATS(... 

-- Run your query 
SELECT * 
FROM t_your_table t 
    INNER JOIN t_filter_lists f 
     ON f.f_letter = t.t_letter 
     AND f.f_number = t.t_number; 

Lợi ích của giải pháp này được rằng, cho rằng bảng và chỉ số số liệu thống kê đầy đủ và tươi, bạn sẽ không phải đau đầu để lựa chọn theo đúng thứ tự của các vị từ phụ thuộc vào và làm thế nào các cột được lập chỉ mục, trong đó thứ tự, cardinality ước tính của họ là gì vv Người tối ưu hóa sẽ làm việc đó cho bạn, và nó nên khá tốt ở đó.

0

Điều này là không thực sự có thể mà không có nhiều hạn chế về vấn đề này. Có một số lượng giới hạn bộ lọc vô hạn mà bạn có thể sử dụng để chọn một tập hợp các hàng từ cơ sở dữ liệu và đơn giản là không thể đánh giá tất cả chúng. Ví dụ: giả sử chế độ xem được tạo từ các hàng có ID là số nguyên tố hoặc có SHA1 băm kết thúc bằng 0 - bạn có mong đợi hợp lý bất kỳ quy trình tự động nào để có thể khám phá các quy tắc này không?

Hơn nữa, chỉ được cung cấp các hàng phù hợp, không có cách nào đảm bảo bất kỳ quy tắc nào bạn xây dựng cũng sẽ không chọn các bản ghi bổ sung từ cơ sở dữ liệu không khớp - chỉ đơn vị tích cực là không đủ.

+0

Bạn có thông tin cơ sở dữ liệu. Và không, tôi sẽ không mong đợi nó để nhận được trên các số nguyên tố - điểm là, rằng không có một "câu trả lời đúng" có sẵn từ dữ liệu. Đó là một mớ hỗn độn của dữ liệu chủ yếu là ngẫu nhiên và tôi muốn tìm các quy tắc để mô tả nó dựa trên các trường được lập chỉ mục. – Trevel

+0

@Trevel Vì vậy, việc tạo câu trả lời chủ yếu là đúng có thể chấp nhận được không? Là dương tính giả được không? Phủ định sai? Hệ thống nên làm gì nếu không tìm được giải pháp? –

+0

Nhận diện dương/âm có thể nhận dạng sai được chấp nhận, như đang nói "không có câu trả lời hay". – Trevel

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