Câu hỏi liên quan

buffer giảm bộ nhớ cache truy cập cho một query gây ra vấn đề hiệu suất ngẫu nhiên


0 Phiếu
Đã hỏi 25/5/2016 bởi images3148 (650 điểm)
We have an UPDATE in production(below) which processes more or less the same number of rows each day but with drastically different runtimes. Some days the query finishes in 2 minutes, while other days, the query might take 20 minutes. Per my analysis of the AWR data, the culprit was I/O wait time and whenever the query slows down, the cache hit ratio goes down due to increased physical reads. The outline of the query itself is below:
update /*+ nologging parallel ( a 12 )  */ huge_table1 a  
set   col = 1
where  col1 > 'A'
  and    col2 < 'B'
  and    exists ( select /*+ parallel ( b 12 ) */ 1
                from   huge_table2 b
                where  b.col3 = a.col3 );
huge_table1 and huge_table2 contains about 100 million rows and the execution statistics are below:
Day     EXECUTIONS ELAPSED_TIME_S_1EXEC CPU_TIME_S_1EXEC IOWAIT_S_1EXEC ROWS_PROCESSED_1EXEC BUFFER_GETS_1EXEC  DISK_READS_1EXEC DIRECT_WRITES_1EXEC
------- ----------- -------------------- ---------------- -------------- -------------------- ----------------- ----------------- -------------------
      1           1              133.055           69.110         23.325          2178085.000       3430367.000         90522.000           42561.000
      2           1              123.580           65.020         20.282          2179404.000       3341566.000         86614.000           38925.000
      3           1             1212.762           72.800       1105.084          1982658.000       3131695.000        268260.000           38446.000
      4           1             1085.773           59.600        996.642          1965309.000       2954480.000        200612.000           26790.000
As seen above, the LIO has remained almost the same in each case, although the elapsed time has increased in the 3rd and 4th days due to increased IO waits, which if my assumption is correct was caused by increase in the PIO. Per Tom Kyte, tuning should be focused on reducing the LIO instead of PIO and as LIO reduces, so will PIO. But in this case, the LIO has been constant throughout, but the PIO has been varying significantly. My question - What tuning strategy could be adopted here?

3 Câu trả lời

0 Phiếu
Đã trả lời 28/5/2016 bởi VsEska (340 điểm)
Tôi nào:-> kiểm tra các kế hoạch thực hiện cho cả hai trường hợp. -> Phòng IO hệ thống y tế. -> Giám sát server thời gian chạy và đảm bảo rằng IO sybsystem không bão hòa bởi một tiến trình khác. Ngoài ra, những loại I/O đang dẫn đầu đọc sự kiện? Tuần tự, song song, rải rác?... tại đây bạn có thể ge sau đây là một chỉ dẫn của chiến lược các kế hoạch để thực hiện các Cập Nhật... Bộ nhớ cache của buffer được thay đổi kích cỡ? một bộ nhớ cache nhỏ và lạnh buffer được thay đổi kích cỡ trong thời gian thực hiện lớn này có thể dẫn đến khối cần được đọc vào bộ nhớ cache buffer để cập nhật chúng. Một số ý tưởng dựa trên data bạn cho thấy,... xin vui lòng cho chúng tôi biết những gì đi ra!
Đã bình luận 28/5/2016 bởi modifying_Ma (120 điểm)
Tôi không chắc chắn những gì bạn có ý nghĩa của LIO / PIO ở đây, nhưng nó có vẻ lạ rằng bạn đang tập trung vào query và điều chỉnh chiến lược. Bạn _know_ query không phải là vấn đề. Từ các thông tin cung cấp, tôi đồng ý với phân tích của bạn, vấn đề của bạn là chờ đợi I/O. Vì vậy, tại sao bạn có như vậy dài chờ đợi? Như query không phải là vấn đề những yếu tố môi trường có thể gây ra điều này? Những gì người khác đang chạy cùng một lúc?
Đã bình luận 29/5/2016 bởi gbbforA (120 điểm)
LIO / PIO là hợp lý/vật lý lần đọc tương ứng. Tôi đã kiểm tra và không có gì đáng kể (tức là dài chạy/chờ đợi) khác với UPDATE này đang chạy cùng một lúc.
0 Phiếu
Đã trả lời 04/6/2016 bởi Gains8745 (620 điểm) 1 Phản ánh
Gần đây tôi đã có vấn đề mà bản Cập Nhật lớn. Tôi tìm thấy giải pháp dựa trên function pipelined song song, giảm thời gian cập nhật một cách đáng kể. Đề xuất của tôi là không chính xác những gì bạn yêu cầu, nhưng có lẽ phương pháp tiếp cận này có thể cung cấp cho bạn thời gian ngắn và ổn định trong ngày người:
  1. tạo loại:
    CREATE type test_num_arr AS TABLE of INTEGER;
    /
    
  2. thực hiện việc Cập Nhật pipelined function (bạn có thể ofcourse điều chỉnh):
    create or replace FUNCTION test_parallel_update (
    test_cur IN SYS_REFCURSOR
    ) 
    RETURN test_num_arr
    PARALLEL_ENABLE (PARTITION test_cur BY ANY)
    PIPELINED
    IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    test_rec HUGE_TABLE1%ROWTYPE;
    TYPE num_tab_t IS TABLE OF NUMBER(38);
    pk_tab NUM_TAB_T;
    cnt INTEGER := 0;
    BEGIN
    LOOP
        FETCH test_cur BULK COLLECT INTO pk_tab LIMIT 1000;
        EXIT WHEN pk_tab.COUNT() = 0;
        FORALL i IN pk_tab.FIRST .. pk_tab.LAST
            UPDATE HUGE_TABLE1
            set   col = 1
            where  col1 > 'A'
            and    col2 < 'B'
            and    exists ( select 1
                            from   huge_table2 b
                            where  b.col3 = a.col3 
                           )
            AND ID = pk_tab(i);
        cnt := cnt + pk_tab.COUNT;
    END LOOP;
    CLOSE test_cur;
    COMMIT;
    PIPE ROW(cnt);
    RETURN;
    END;
    
  3. cuối cùng, chạy Cập Nhật của bạn:
    SELECT * FROM TABLE(test_parallel_update(CURSOR(SELECT id FROM huge_table1)));
    
phương pháp tiếp cận dựa trên: http://www.orafaq.com/node/ 2450
0 Phiếu
Đã trả lời 04/6/2016 bởi Cryptog (170 điểm)
Để trả lời câu hỏi của bạn về các chiến lược, tất nhiên phải chọn LIO. Hàng access ở buffer là nhanh hơn nhiều so với đĩa hoạt động. Đối với vấn đề của bạn, thấy rằng những ngày đầu tiên thời gian thực hiện rất tốt và những ngày cuối cùng nó không phải là. Nếu bạn sử dụng lập chỉ mục trên cột = b.col3 a.col3 và có rất nhiều tính năng chèn ở các bảng. Có lẽ họ đang hết hạn và như vậy query của bạn không còn có thể sử dụng các chỉ mục và đọc thêm các khối. Bởi vì trong kế hoạch thực hiện của bạn, chúng tôi thấy sự gia tăng trong lần đọc đĩa. Trong case này, nó sẽ là cần thiết để: EXEC DBMS _ STATS .gather_table_stats (schema, table_name); Bạn nên thu thập số liệu thống kê định kỳ với trình lập lịch biểu. tùy thuộc vào của bạn data thay đổi về khối lượng. Bạn có thể lập lịch trình trong ngày chỉ cần một tập chỉ số thống kê với: DBMS_STATS.GATHER_INDEX_STATS và buổi tối: DBMS _ STATS. GATHER_ TABLE _ STATS phù thủy tập hợp các số liệu thống kê table và cột (và chỉ số). Ngoài các câu hỏi của bạn về khả năng cũng là sự thay đổi của mô hình data . Trên khối lớn bảng partitioned là một aproach tốt trong việc giảm IO. Hy vọng rằng ca có thể giúp

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...