-- Use at your own risk! Not OraPub's. -- -- The following code snippets are a progression of how to -- create better think times when creating a synthetic load -- during performance analysis research. -- -- Craig A. Shallahamer, orapub.craig@ gmail.com, 18-Apr-2012 -- set tab off set serveroutput on -- -- Code for UNIFORM sample values with min and max of 1.0. -- declare max_samples number := 1000; sample_value number; i number; begin dbms_random.seed(13); for i in 1..max_samples loop sample_value := dbms_random.value(1.0, 1.0) ; dbms_output.put_line(round(sample_value,4)||','); end loop; end; / -- -- Code for UNIFORM sample values with min of 0.50 and max of 1.5. -- declare max_samples number := 1000; sample_value number; i number; begin dbms_random.seed(13); for i in 1..max_samples loop sample_value := dbms_random.value(0.50, 1.5) ; dbms_output.put_line(round(sample_value,4)||','); end loop; end; / -- -- Code for NORMAL sample values with average of 0.0 and stdev of 1.0. -- declare max_samples number := 1000; sample_value number; i number; begin dbms_random.seed(13); for i in 1..max_samples loop sample_value := dbms_random.normal; dbms_output.put_line(round(sample_value,4)||','); end loop; end; / -- -- Code for NORMAL sample values with average of 1.0 and stdev of 0.5. -- declare max_samples number := 1000; sample_value number; i number; z number; -- standardized value m number := 1.0 ; -- average s number := 0.5 ; -- standard deviation x number; -- un-standardized value begin dbms_random.seed(13); for i in 1..max_samples loop z := dbms_random.normal; x := z * s + m ; dbms_output.put_line(round(x,4)||','); end loop; end; / -- -- Code for LOG NORMAL sample values with normal average of 1.0 and stdev of 0.5. -- declare max_samples number := 1000; sample_value number; i number; z number; -- standardized value m number := 1.0 ; -- average s number := 0.5 ; -- standard deviation x number; -- un-standardized value log_normal number; -- log normal sample value begin dbms_random.seed(13); for i in 1..max_samples loop z := dbms_random.normal; x := z * s + m ; log_normal := exp(x) ; dbms_output.put_line(round(log_normal,4)||','); end loop; end; / -- -- Let create a function using the log normal code -- create or replace function op_think_time(avg_in number, stdev_in number) return number as begin declare sample_value number; i number; z number; -- standardized value m number; -- average s number; -- standard deviation x number; -- un-standardized value log_normal number; -- log normal sample value begin m := avg_in ; s := stdev_in ; z := dbms_random.normal; x := z * s + m ; log_normal := exp(x) ; return log_normal; end; end; / -- Getting some samples values -- declare i number; begin for i in 1..500 loop dbms_output.put_line(round(op_think_time(1.5,0.5),4)||','); end loop; end; / 500 samples each in m : average in in s : std dev in out m: average of all samples out s: std dev of all samples in m in s out m out s ---- ---- ----- ----- 0.5 0.2 1.68 0.35 1.0 0.5 3.12 1.65 1.5 0.5 5.05 2.61 nice curve 1.5 1.0 7.10 8.98 2.0 0.1 7.44 0.73 -- sample of how to use loop select count(*) from big_table; dbms_lock.sleep(op_think_time(0.50,0.2)); end loop; ---END