2009-06-02 32 views
12

Tôi đã đọc rằng người ta không nên phân tích một bảng tạm thời, vì nó vít lên bảng thống kê cho người khác. Điều gì về một chỉ mục? Nếu tôi đặt chỉ mục trên bảng trong suốt thời gian chương trình của tôi, các chương trình khác có thể sử dụng bảng bị ảnh hưởng bởi chỉ mục đó không?Có an toàn khi đặt chỉ mục trên Bảng tạm thời của Oracle không?

Chỉ mục có ảnh hưởng đến quy trình của tôi và tất cả các quy trình khác sử dụng bảng không? hoặc nó có ảnh hưởng đến quy trình của tôi không?

Không có câu trả lời nào có thẩm quyền, vì vậy tôi đang cung cấp hối lộ.

Trả lời

13

Có một chỉ số ảnh hưởng đến quá trình của tôi, và tất cả các quá trình khác sử dụng bảng? hoặc nó có ảnh hưởng đến quy trình của tôi không?

Tôi giả sử chúng ta đang nói đến các bảng GLOBAL TEMPORARY.

Hãy suy nghĩ về một bảng tạm thời như nhiều bảng được tạo và giảm theo từng quy trình khi đang bay từ mẫu được lưu trữ trong từ điển hệ thống.

Trong Oracle, DML của một temporary table ảnh hưởng đến tất cả các quy trình, trong khi dữ liệu trong bảng sẽ chỉ ảnh hưởng đến một quá trình sử dụng chúng.

Dữ liệu trong một temporary table chỉ hiển thị trong phạm vi phiên. Nó sử dụng TEMPORARY TABLESPACE để lưu trữ cả dữ liệu và chỉ mục có thể có.

DML cho temporary table (ví dụ: bố cục của nó, bao gồm tên cột và chỉ mục) hiển thị với mọi người có đủ đặc quyền.

Điều này có nghĩa là sự tồn tại của chỉ mục sẽ ảnh hưởng đến quy trình của bạn cũng như các quy trình khác sử dụng bảng theo nghĩa là bất kỳ quá trình nào sửa đổi dữ liệu trong temporary table cũng sẽ phải sửa đổi chỉ mục.

Dữ liệu chứa trong bảng (và trong chỉ mục), ngược lại, sẽ chỉ ảnh hưởng đến quá trình tạo chúng và thậm chí sẽ không hiển thị với các quy trình khác.

NẾU bạn muốn một trong quá trình sử dụng chỉ số và một số khác không sử dụng nó, làm như sau:

  • Tạo hai temporary tables với cách bố trí tương tự cột
  • Index trên một trong số họ
  • Sử dụng bảng được lập chỉ mục hoặc không được lập chỉ mục tùy thuộc vào quá trình
9

Tôi giả sử bạn đang đề cập đến các bảng tạm thời thực sự của Oracle và không chỉ là một bảng thông thường được tạo tạm thời và sau đó bị loại bỏ. Có, nó là an toàn để tạo ra các chỉ mục trên các bảng tạm thời và chúng sẽ được sử dụng theo các quy tắc tương tự như một bảng và các chỉ mục thông thường.

[Chỉnh sửa] tôi thấy bạn đã tinh chế câu hỏi của bạn, và đây là một câu trả lời có phần tinh tế:

Từ:.

Oracle® Database Administrator's Guide 
10g Release 2 (10.2) 
Part Number B14231-02 

"chỉ số có thể được tạo ra trên bảng tạm Họ cũng chỉ là tạm thời và dữ liệu trong chỉ mục có cùng phạm vi phiên hoặc phạm vi giao dịch dưới dạng dữ liệu trong bảng cơ bản. "

Nếu bạn cần chỉ mục để xử lý hiệu quả trong phạm vi giao dịch thì tôi sẽ tưởng tượng bạn sẽ phải gợi ý rõ ràng trong truy vấn vì thống kê sẽ không hiển thị các hàng cho bảng.

+0

có các bảng tạm thời thực sự. – EvilTeach

+0

Chỉ mục sẽ tồn tại cho tất cả các phiên (vì vậy có thể tác động đến quá trình xử lý của chúng và có thể gây ra sự cố cho chúng nếu đó là chỉ mục duy nhất và chúng mong đợi dữ liệu không phải là duy nhất hoặc thậm chí nếu nó chỉ làm chậm quá trình chèn/cập nhật). Ngoài ra, việc thêm/bớt chỉ mục sẽ đưa ra một khóa ngắn trên bảng Tương tự bạn có thể thu thập số liệu thống kê trên bảng tạm thời, nhưng chúng sẽ được giả định áp dụng cho tất cả các truy vấn trên bảng có thể hoặc không phù hợp với tình hình. –

+1

> Gary Không, chỉ mục được lưu trữ chính xác giống như bảng - riêng trong mỗi phiên, do đó bạn không thể nhận được xung đột giữa các phiên ngay cả khi chỉ mục là duy nhất. Rõ ràng việc thêm/bớt các chỉ mục có một khóa trên bàn, nhưng bạn có thường xuyên thêm/bớt các chỉ mục không? Có, thống kê áp dụng trên toàn cầu cho các bảng tạm thời, đó là lý do tại sao đôi khi bạn cần sử dụng gợi ý CARDINALITY khi truy vấn GTT. –

6

Bạn đang hỏi về hai thứ, chỉ mục và thống kê khác nhau. Đối với các chỉ mục, có, bạn có thể tạo các chỉ mục trên các bảng tạm thời, chúng sẽ được duy trì như bình thường.

Đối với thống kê, tôi khuyên bạn nên đặt rõ ràng thống kê của bảng để thể hiện kích thước trung bình của bảng khi được truy vấn. Nếu bạn chỉ cho phép oracle thu thập số liệu thống kê, quy trình thống kê sẽ không tìm thấy gì trong bảng (do định nghĩa, dữ liệu trong bảng là cục bộ cho giao dịch của bạn), vì vậy nó sẽ trả về kết quả không chính xác.

ví dụ: bạn có thể làm:

exec dbms_stats.set_table_stats(user, 'my_temp_table', numrows=>10, numblks=>4)

mũi nữa là nếu kích thước của bảng tạm thời thay đổi rất nhiều, và trong phạm vi giao dịch của bạn, bạn biết có bao nhiêu hàng trong bảng tạm thời, bạn có thể giúp đỡ tôi ưu hoa bởi cho nó thông tin đó. Tôi thấy điều này sẽ giúp ích rất nhiều nếu bạn đang tham gia từ bảng tạm thời đến các bảng thông thường.

ví dụ, nếu bạn biết bảng temp có khoảng 100 dòng trong nó, bạn có thể:

SELECT /*+ CARDINALITY(my_temp_table 100) */ * FROM my_temp_table

+0

Tôi chỉ hỏi về các chỉ mục. Tôi hiểu về số liệu thống kê. Bảng tạm thời có thể được sử dụng nhiều lần trong một quá trình. Đặt số liệu thống kê trên bảng có thể có tác động tiêu cực. – EvilTeach

+0

Tôi sẽ kiểm tra việc sử dụng gợi ý cardinality. Cảm ơn bạn rất nhiều +1 – EvilTeach

2

Vâng, tôi đã cố gắng nó ra và chỉ số đã có thể nhìn thấy và sử dụng bởi phiên thứ hai. Tạo một bảng tạm thời toàn cầu mới cho dữ liệu của bạn sẽ an toàn hơn nếu bạn thực sự cần một chỉ mục.

Bạn cũng không thể tạo chỉ mục trong khi bất kỳ phiên nào khác đang truy cập vào bảng.

Dưới đây là các trường hợp thử nghiệm Tôi chạy:

--first session 
create global temporary table index_test (val number(15)) 
on commit preserve rows; 

create unique index idx_val on index_test(val); 

--second session 
insert into index_test select rownum from all_tables; 
select * from index_test where val=1; 
1

Bạn cũng có thể sử dụng gợi ý lấy mẫu động (10g):

chọn/* + DYNAMIC_SAMPLING (3) */val từ index_test trong đó val = 1;

Xem Ask Tom

0

Bạn không thể tạo một chỉ mục trên một bảng tạm thời trong khi nó đang được sử dụng bởi phiên khác, vì vậy câu trả lời là: Không, nó không thể ảnh hưởng đến bất kỳ quá trình khác, bởi vì nó không phải là có thể.

Chỉ mục hiện tại chỉ ảnh hưởng đến phiên hiện tại của bạn, bởi vì đối với bất kỳ phiên nào khác, bảng tạm thời xuất hiện trống, vì vậy nó không thể truy cập bất kỳ giá trị chỉ mục nào.

Phần 1:

SQL> create global temporary table index_test (val number(15)) on commit preserve rows; 
Table created. 
SQL> insert into index_test values (1); 
1 row created. 
SQL> commit; 
Commit complete. 
SQL> 

Phần 2 (trong khi phiên 1 vẫn kết nối):

SQL> create unique index idx_val on index_test(val); 
create unique index idx_val on index_test(val) 
           * 
ERROR at line 1: 
ORA-14452: attempt to create, alter or drop an index on temporary table already in use 
SQL> 

Trở về phiên 1:

SQL> delete from index_test; 
1 row deleted. 
SQL> commit; 
Commit complete. 
SQL> 

Đợt 2:

SQL> create unique index idx_val on index_test(val); 
create unique index idx_val on index_test(val) 
           * 
ERROR at line 1: 
ORA-14452: attempt to create, alter or drop an index on temporary table already in use 
SQL> 

vẫn không thành công, trước tiên bạn phải ngắt kết nối phiên 1 hoặc bảng phải được cắt ngắn.

Phần 1:

SQL> truncate table index_test; 
Table truncated. 
SQL> 

Bây giờ bạn có thể tạo ra các chỉ mục trong Đợt 2:

SQL> create unique index idx_val on index_test(val); 
Index created. 
SQL> 

Chỉ số này tất nhiên sẽ được sử dụng bởi bất kỳ phiên.

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