Advertisement
Guest User

t6_zd.sql

a guest
Apr 4th, 2020
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 12.24 KB | None | 0 0
  1. -- ZADANIE 1
  2. CREATE OR REPLACE PROCEDURE test_timing_of_queries_z1 (
  3.     p_repeat NUMBER
  4. ) IS
  5.  
  6.     timestart    TIMESTAMP;
  7.     timeend      TIMESTAMP;
  8.     timesecond   NUMBER;
  9.     TYPE t_queries_type IS
  10.         TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(20);
  11.  
  12.   -- declare a variable of the t_capital_type
  13.     t_queries    t_queries_type;
  14.     l_index      VARCHAR2(20);
  15. BEGIN
  16.     t_queries('PARTITION BY') := 'SELECT
  17.                                        soh.salesorderheaderid
  18.                                        , soh.customerid
  19.                                        , soh.orderdate
  20.                                        , round(max(soh.orderdate) over (partition by soh.customerid) - soh.orderdate, 0) days_date_diff
  21.                                    FROM
  22.                                        salesorderheader soh'
  23.                                     ;
  24.     t_queries('CORRELATED QUERY') := 'SELECT
  25.                                            soh.salesorderheaderid
  26.                                            , soh.customerid
  27.                                            , soh.orderdate
  28.                                            , round((select max(sohin.orderdate)last_order_date from salesorderheader sohin where sohin.customerid = soh.customerid) - soh.orderdate, 0) days_date_diff
  29.                                        FROM
  30.                                            salesorderheader soh';
  31.     t_queries('JOIN') := 'SELECT
  32.                                soh.salesorderheaderid
  33.                                , soh.customerid
  34.                                , soh.orderdate
  35.                                , round(sohin.last_order_date - soh.orderdate, 0) days_date_diff
  36.                            FROM
  37.                                salesorderheader soh
  38.                                join (select customerid, max(orderdate) last_order_date from salesorderheader group by customerid) sohin on soh.customerid = sohin.customerid'
  39.     ;
  40.     l_index := t_queries.FIRST;
  41.    
  42.     dbms_output.put_line('Running queries: ' || p_repeat || ' times');
  43.    
  44.     WHILE l_index IS NOT NULL LOOP
  45.         timestart := systimestamp;
  46.         FOR x IN 1..p_repeat LOOP EXECUTE IMMEDIATE ( t_queries(l_index) );
  47.         END LOOP;
  48.  
  49.         timeend := systimestamp;
  50.         timesecond := ( ( EXTRACT(HOUR FROM timeend) * 3600 ) + ( EXTRACT(MINUTE FROM timeend) * 60 ) + EXTRACT(SECOND FROM timeend
  51.         ) ) - ( ( EXTRACT(HOUR FROM timestart) * 3600 ) + ( EXTRACT(MINUTE FROM timestart) * 60 ) + EXTRACT(SECOND FROM timestart
  52.         ) );
  53.  
  54.         dbms_output.put_line('finished '
  55.                              || l_index
  56.                              || ': '
  57.                              || timesecond
  58.                              || ' seconds');
  59.  
  60.         l_index := t_queries.NEXT(l_index);
  61.     END LOOP;
  62.  
  63. END test_timing_of_queries_z1;
  64. /
  65.  
  66. SET SERVEROUTPUT ON
  67.  
  68. EXECUTE test_timing_of_queries_z1(100000);
  69.  
  70. SET TIMING ON;
  71. --Example output:
  72. --Running queries: 100000 times
  73. --finished CORRELATED QUERY: 2.309 seconds
  74. --finished JOIN: 6.306 seconds
  75. --finished PARTITION BY: 1.277 seconds
  76.  
  77.  
  78. -- ZADANIE 2
  79. CREATE OR REPLACE FUNCTION fn_rtn_tbl_z2_v3 (
  80.     pcustomerid         NUMBER := NULL
  81.     , porderdatefrom      DATE := NULL
  82.     , porderdateto        DATE := NULL
  83.     , pshipdatefrom       DATE := NULL
  84.     , pshipdateto         DATE := NULL
  85.     , pdeliverydatefrom   DATE := NULL
  86.     , pdeliverydateto     DATE := NULL
  87. ) RETURN rtn_table_z2 AS
  88.  
  89.     TYPE dnm_rt IS RECORD (
  90.         customerid           NUMBER(38, 0)
  91.         , salesorderdetailid   NUMBER(38, 0)
  92.         , salesorderheaderid   NUMBER(38, 0)
  93.         , productid            NUMBER(5, 0)
  94.         , qty                  NUMBER(38, 0)
  95.         , totalprice           NUMBER
  96.         , orderdate            DATE
  97.         , shipdate             DATE
  98.         , deliverydate         DATE
  99.     );
  100.     lv_rec      dnm_rt;
  101.     lv_rtn      rtn_table_z2 := rtn_table_z2();
  102.     lv_cursor   SYS_REFCURSOR;
  103.     lv_sql      VARCHAR(1000) := 'SELECT
  104.                                    soh.customerid
  105.                                    , sod.salesorderdetailid
  106.                                    , sod.salesorderheaderid
  107.                                    , sod.productid
  108.                                    , sod.qty
  109.                                    , sod.totalprice
  110.                                    , soh.orderdate
  111.                                    , soh.shipdate
  112.                                    , soh.deliverydate
  113.                                FROM
  114.                                    salesorderdetail   sod
  115.                                    JOIN salesorderheader   soh ON sod.salesorderheaderid = soh.salesorderheaderid
  116.                                WHERE
  117.                                    1=1'
  118.     ;
  119. BEGIN
  120.     CASE
  121.         WHEN pcustomerid IS NOT NULL THEN
  122.             lv_sql := lv_sql
  123.                       || ' and customerid = '
  124.                       || pcustomerid;
  125.         WHEN porderdatefrom IS NOT NULL THEN
  126.             lv_sql := lv_sql
  127.                       || ' and OrderDateFrom >= '
  128.                       || porderdatefrom;
  129.         WHEN porderdateto IS NOT NULL THEN
  130.             lv_sql := lv_sql
  131.                       || ' and OrderDateTo <= '
  132.                       || porderdateto;
  133.         WHEN pshipdatefrom IS NOT NULL THEN
  134.             lv_sql := lv_sql
  135.                       || ' and ShipDateFrom >= '
  136.                       || pshipdatefrom;
  137.         WHEN pshipdateto IS NOT NULL THEN
  138.             lv_sql := lv_sql
  139.                       || ' and ShipDateTo <= '
  140.                       || pshipdateto;
  141.         WHEN pdeliverydatefrom IS NOT NULL THEN
  142.             lv_sql := lv_sql
  143.                       || ' and DeliveryDateFrom >= '
  144.                       || pdeliverydatefrom;
  145.         WHEN pdeliverydateto IS NOT NULL THEN
  146.             lv_sql := lv_sql
  147.                       || ' and DeliveryDateTo <= '
  148.                       || pdeliverydateto;
  149.         ELSE
  150.             NULL;
  151.     END CASE;
  152.  
  153.     OPEN lv_cursor FOR lv_sql;
  154.     LOOP
  155.         FETCH lv_cursor INTO lv_rec;
  156.         EXIT WHEN lv_cursor%NOTFOUND;
  157.         lv_rtn.extend;
  158.         lv_rtn(lv_rtn.LAST) := rtn_type_z2(lv_rec.customerid, lv_rec.salesorderdetailid, lv_rec.salesorderheaderid
  159.         , lv_rec.productid, lv_rec.qty, lv_rec.totalprice, lv_rec.orderdate, lv_rec.shipdate, lv_rec
  160.         .deliverydate);
  161.     END LOOP;
  162.     CLOSE lv_cursor;
  163.    
  164.     RETURN lv_rtn;
  165. END fn_rtn_tbl_z2_v3;
  166. /
  167.  
  168. CREATE OR REPLACE FUNCTION fn_rtn_tbl_z2_v2 (
  169.     pcustomerid         NUMBER := NULL
  170.     , porderdatefrom      DATE := NULL
  171.     , porderdateto        DATE := NULL
  172.     , pshipdatefrom       DATE := NULL
  173.     , pshipdateto         DATE := NULL
  174.     , pdeliverydatefrom   DATE := NULL
  175.     , pdeliverydateto     DATE := NULL
  176. ) RETURN rtn_table_z2 AS
  177.  
  178.     TYPE dnm_rt IS RECORD (
  179.         customerid           NUMBER(38, 0)
  180.         , salesorderdetailid   NUMBER(38, 0)
  181.         , salesorderheaderid   NUMBER(38, 0)
  182.         , productid            NUMBER(5, 0)
  183.         , qty                  NUMBER(38, 0)
  184.         , totalprice           NUMBER
  185.         , orderdate            DATE
  186.         , shipdate             DATE
  187.         , deliverydate         DATE
  188.     );
  189.     TYPE dnm_rtt IS
  190.         TABLE OF dnm_rt INDEX BY PLS_INTEGER;
  191.     lv_recs     dnm_rtt;
  192.     lv_rtn      rtn_table_z2 := rtn_table_z2();
  193.     lv_cursor   SYS_REFCURSOR;
  194.     lv_sql      VARCHAR(1000) := 'SELECT
  195.                                    soh.customerid
  196.                                    , sod.salesorderdetailid
  197.                                    , sod.salesorderheaderid
  198.                                    , sod.productid
  199.                                    , sod.qty
  200.                                    , sod.totalprice
  201.                                    , soh.orderdate
  202.                                    , soh.shipdate
  203.                                    , soh.deliverydate
  204.                                FROM
  205.                                    salesorderdetail   sod
  206.                                    JOIN salesorderheader   soh ON sod.salesorderheaderid = soh.salesorderheaderid
  207.                                WHERE
  208.                                    1=1'
  209.     ;
  210. BEGIN
  211.     CASE
  212.         WHEN pcustomerid IS NOT NULL THEN
  213.             lv_sql := lv_sql
  214.                       || ' and customerid = '
  215.                       || pcustomerid;
  216.         WHEN porderdatefrom IS NOT NULL THEN
  217.             lv_sql := lv_sql
  218.                       || ' and OrderDateFrom >= '
  219.                       || porderdatefrom;
  220.         WHEN porderdateto IS NOT NULL THEN
  221.             lv_sql := lv_sql
  222.                       || ' and OrderDateTo <= '
  223.                       || porderdateto;
  224.         WHEN pshipdatefrom IS NOT NULL THEN
  225.             lv_sql := lv_sql
  226.                       || ' and ShipDateFrom >= '
  227.                       || pshipdatefrom;
  228.         WHEN pshipdateto IS NOT NULL THEN
  229.             lv_sql := lv_sql
  230.                       || ' and ShipDateTo <= '
  231.                       || pshipdateto;
  232.         WHEN pdeliverydatefrom IS NOT NULL THEN
  233.             lv_sql := lv_sql
  234.                       || ' and DeliveryDateFrom >= '
  235.                       || pdeliverydatefrom;
  236.         WHEN pdeliverydateto IS NOT NULL THEN
  237.             lv_sql := lv_sql
  238.                       || ' and DeliveryDateTo <= '
  239.                       || pdeliverydateto;
  240.         ELSE
  241.             NULL;
  242.     END CASE;
  243.  
  244.     OPEN lv_cursor FOR lv_sql;
  245.     FETCH lv_cursor BULK COLLECT INTO lv_recs;
  246.     CLOSE lv_cursor;
  247.    
  248.     FOR indx IN 1..lv_recs.COUNT LOOP
  249.         lv_rtn.extend;
  250.         lv_rtn(lv_rtn.LAST) := rtn_type_z2(lv_recs(indx).customerid, lv_recs(indx).salesorderdetailid, lv_recs(indx).salesorderheaderid
  251.         , lv_recs(indx).productid, lv_recs(indx).qty, lv_recs(indx).totalprice, lv_recs(indx).orderdate, lv_recs(indx).shipdate, lv_recs
  252.         (indx).deliverydate);
  253.  
  254.     END LOOP;
  255.  
  256.     RETURN lv_rtn;
  257. END fn_rtn_tbl_z2_v2;
  258. /
  259.  
  260. SELECT
  261.     *
  262. FROM
  263.     fn_rtn_tbl_z2_v2 ( 1 );
  264. SELECT
  265.     *
  266. FROM
  267.     fn_rtn_tbl_z2_v3 ( 1 );
  268. --Example Results:
  269. --Running queries: 100 times
  270. --finished SIMPLE LOOP: 7.766 seconds
  271. --finished WITH BULK INTO: 3.416 seconds
  272.  
  273. -- ZADANIE 3
  274.  
  275. CREATE OR REPLACE PROCEDURE test_timing_of_queries_z3 (
  276.     p_repeat NUMBER
  277. ) IS
  278.  
  279.     timestart    TIMESTAMP;
  280.     timeend      TIMESTAMP;
  281.     timesecond   NUMBER;
  282.     TYPE t_queries_type IS
  283.         TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(20);
  284.  
  285.   -- declare a variable of the t_capital_type
  286.     t_queries    t_queries_type;
  287.     l_index      VARCHAR2(20);
  288. BEGIN
  289.     t_queries('NOT_EXISTS') := 'select p.productid from product p where NOT EXISTS (select sod.productid from salesorderdetail sod where sod.productid = p.productid)'
  290.     ;
  291.     t_queries('NOT IN') := 'select p.productid from product p where p.productid not in (select productid from salesorderdetail)';
  292.     t_queries('JOIN') := 'select distinct p.productid from product p left join salesorderdetail sod on sod.productid = p.productid'
  293.     ;
  294.     t_queries('MINUS') := 'select productid from Product minus select productid from salesorderdetail';
  295.     l_index := t_queries.FIRST;
  296.    
  297.     dbms_output.put_line('Running queries: ' || p_repeat || ' times');
  298.    
  299.     WHILE l_index IS NOT NULL LOOP
  300.         timestart := systimestamp;
  301.         FOR x IN 1..p_repeat LOOP EXECUTE IMMEDIATE ( t_queries(l_index) );
  302.         END LOOP;
  303.  
  304.         timeend := systimestamp;
  305.         timesecond := ( ( EXTRACT(HOUR FROM timeend) * 3600 ) + ( EXTRACT(MINUTE FROM timeend) * 60 ) + EXTRACT(SECOND FROM timeend
  306.         ) ) - ( ( EXTRACT(HOUR FROM timestart) * 3600 ) + ( EXTRACT(MINUTE FROM timestart) * 60 ) + EXTRACT(SECOND FROM timestart
  307.         ) );
  308.  
  309.         dbms_output.put_line('finished '
  310.                              || l_index
  311.                              || ': '
  312.                              || timesecond
  313.                              || ' seconds');
  314.  
  315.         l_index := t_queries.NEXT(l_index);
  316.     END LOOP;
  317.  
  318. END test_timing_of_queries_z3;
  319. /
  320.  
  321. SET SERVEROUTPUT ON
  322.  
  323. EXECUTE test_timing_of_queries_z3(900000);
  324.  
  325. SET TIMING ON;
  326.  
  327. --Example output:
  328. --Running queries: 900000 times
  329. --finished JOIN: 19.699 seconds
  330. --finished MINUS: 13.106 seconds
  331. --finished NOT IN: 18.417 seconds
  332. --finished NOT_EXISTS: 18.3 seconds
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement