Professional Documents
Culture Documents
Geoff Mower
Senior Software Performance Engineer, Blackboard
Steve Feldman
Senior Director Software Performance Engineering and Architecture, Blackboard
Steve Feldman
Blackboard since 2003 Performance Engineering from the start Platform Architecture in 2005 Security Engineering in 2010 Love my joblove my team. If you email me, I will respond.
@seven_seconds http://goo.gl/Z4Rq5
Making Decisions
Types of Data
Table
ACTIVITY_ACCUMULATOR
Example
User navigation
COURSE_USERS COURSE_CONTENT
LEARN_admin.bb_instance
snapshot
User created entities
installation
Tracks who has an active session
SESSIONS
Administrative Planning
Administrative Planning
To be able to restore individual courses, can we use the course archive tool as a backup function?
Administrative Planning
Asking the Right Questions
How will we know which courses need archiving? Frequency of course archive task? Will the archiving process impact user experience? Does the course archive tool have limitation? Location of course archives?
Administrative Planning
Collecting the Right Data
Modification Tables
COURSE_CONTENTS GRADEBOOK_MAIN GRADEBOOK_GRADES QTI_ASI_DATA QTI_RESULT_DATA FORUM_MAIN MSG_MAIN CALENDAR STAFFINFORMATION
Administrative Planning
Organizing and Analyzing the Data
Administrative Planning
Making Decisions from the Data
How many new or modified course/organization entities are required for a course/organization to be archived? How many courses/organizations should we archive each time the archive task is execution? What is the maximum time between archive tasks?
Administrative Planning
Acting on Your Descion SQL/Oracle Hist_101, c:\Course_Archives\2011-07-09\ Eng_252, c:\Course_Archives\2011-07-09\ Sci_139, c:\Course_Archives\2011-07-09\ Eng_429, c:\Course_Archives\2011-07-09\ Create a JOB that would run the SQL script to generate a txt file containing the query results Create a schedule task that would run the batch_ImportExport.bat tool and direct it to the txt file created by the JOB in the previous step.
Data
46905888 258272 96848 47760 608 1672 160
100000000
80000000
60000000
40000000
20000000
8000000
6000000
4000000
2000000
Conclusion
Due to opening of school tasks we will see our available disk space decrease below 5% during the month of August. In order to make it 3 years we will need a minimum 120 GB.
Study
Online & offline test taking populations The tests themselves Test taking behavior How testing impacts the database Locating when you will see resource contention
Online Offline
A reasonable understanding
How tests are currently used How tests will be used How much each question costs the database upon submission Baseline of databases IO and CPU resources Non-testing database transactions
Lack information on
Create a separate database from the Blackboard Learns databases (you can use the database server Blackboard Learn is running on) Create tables with in the new database that match the query results you wish to store Create a JOB that will run each query and insert the results into the corresponding table and database.
Geoff.Mower@blackboard.com
@gvmower
@seven_seconds sevenseconds.wordpress.com
stephen.feldman@blackboard.com
http://goo.gl/Z4Rq5
The title of this session is: Using Database Statistics to Make Capacity Planning Decisions
Appendices
Administrative Planning
What courses meet the course archive criteria
declare @Last_Archive datetime declare @Datediff int declare @Number_of_New_Entities int set @Last_Archive = '2011-6-7' --Enter the last datetime the course archival process ran set @Datediff = 24 --Enter the time duration between course creation and course entities you would like to track. For example, to avoid archive courses that were created since the last archive process enter the time of your longest running snapshot or SIS process in terms of hours. set @Number_of_New_Entities = 1 --Enter the number of new course entities required for a course to be archived select course_id, CC.CC + GM.GM + GG.GG + QA.QA + A.A + ConM.CONFERENCE_MAIN + FM.FORUM_MAIN + MM.MSG_MAIN + C.C + S.S AS [Number of New/Modified Course Entities] from course_main cm left join (select crsmain_pk1, COUNT(cc.pk1) CC from course_contents cc left join course_main cm on cm.pk1 = cc.crsmain_pk1 where (cc.dtcreated > @Last_Archive or cc.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, cc.dtcreated) > @Datediff group by crsmain_pk1) CC on CC.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gm.pk1) GM from gradebook_main gm left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (date_added > @Last_Archive or date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, gm.date_added) > @Datediff group by crsmain_pk1) GM on GM.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gg.pk1) GG from gradebook_main gm left join gradebook_grade gg on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on gm.crsmain_pk1 = cm.pk1 where (gg.date_added > @Last_Archive OR gg.date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, gg.date_added) > @Datediff group by crsmain_pk1) GG on GG.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(qa.pk1) QA from qti_asi_data qa left join course_main cm on cm.pk1 = qa.crsmain_pk1 where (bbmd_date_added > @Last_Archive OR bbmd_date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, qa.bbmd_date_added) > @Datediff group by crsmain_pk1) QA on QA.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(a.pk1) A from attempt a left join gradebook_grade gg on a.pk1 = gg.last_attempt_pk1 left join gradebook_main gm on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (a.attempt_date > @Last_Archive or a.date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, a.attempt_date) > @Datediff group by crsmain_pk1) A on A.crsmain_pk1 = cm.pk1 left join (select co.owner_pk1, COUNT(CON.pk1) CONFERENCE_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where co.owner_table = 'COURSE_MAIN' and (CON.dtcreated > @Last_Archive OR CON.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, con.dtcreated) > @Datediff group by owner_pk1) ConM on ConM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(fr.pk1) FORUM_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (fr.dtcreated > @Last_Archive OR fr.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, fr.dtcreated) > @Datediff group by owner_pk1) FM on FM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(mm.pk1) MSG_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join msg_main mm on mm.forummain_pk1 = fr.pk1 left join msg_main mm_reply on mm_reply.msgmain_pk1 = mm.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (mm.dtcreated > @Last_Archive OR mm.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, mm.dtcreated) > @Datediff group by owner_pk1) MM on MM.OWNER_PK1 = cm.pk1 left join (select crsmain_pk1, COUNT(c.pk1) C from calendar c left join course_main cm on cm.pk1 = c.crsmain_pk1 where c.dtmodified > @Last_Archive and datediff(hour, cm.dtcreated, c.dtmodified) > @Datediff group by crsmain_pk1) C on C.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(s.pk1) S from staffinformation S left join course_main cm on cm.pk1 = s.crsmain_pk1 where s.dtmodified > @Last_Archive and datediff(hour, cm.dtcreated, s.dtmodified) > @Datediff group by crsmain_pk1) S on S.crsmain_pk1 = cm.pk1
Administrative Planning
What courses meet the course archive criteria
set serveroutput on size 100000 ---Administrative Planning What courses meet the course archive criteria declare v_Last_Archive date; v_Datediff int; v_Number_of_New_Entities int; v_Directory varchar(256); v_File_Name varchar(256); Begin v_Last_Archive := TO_DATE('7-JUN-2011'); --Enter the last datetime the course archival process ran v_Datediff := 1 ; --this is the day --Enter the time duration between course creation and course entities you would like to track. For example, to avoid archive courses that were created ----since the last archive process enter the time of your longest running snapshot or SIS process in terms of hours. v_Number_of_New_Enti ties := 1; --Enter the number of new course entities required for a course to be archived select 'usr\local\blackboard\Course_Archi ves \' | | TO_CHAR(SYSDATE, 'DD-Mon-YYYY') | | '\' into v_Directory FROM Dual; --Alter the string to build the directory you wish to store your archives dbms_output.enable(9999999); dbms_output.new_line();
FOR rec IN ( select course_id | | v_Directory as output from course_main cm left join (select crsmain_pk1, COUNT(cc.pk1) CC from course_contents cc left join course_main cm on cm.pk1 = cc.crsmain_pk1 where (cc.dtcreated > v_Last_Archive or cc.dtmodified > v_Last_Archive) and cm.dtcreated- cc.dtcreated> v_Datediff group by crsmain_pk1) CC on CC.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gm.pk1) GM from gradebook_main gm left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (date_added > v_Last_Archive or date_modified > v_Last_Archive) and cm.dtcreated- gm.date_added> v_Datediff group by crsmain_pk1) GM on GM.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gg.pk1) GG from gradebook_main gm left join gradebook_grade gg on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on gm.crsmain_pk1 = cm.pk1 where (gg.date_added > v_Last_Archive OR gg.date_modified > v_Last_Archive) and cm.dtcreated- gg.date_added> v_Datediff group by crsmain_pk1) GG on GG.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(qa.pk1) QA from qti_asi_data qa left join course_main cm on cm.pk1 = qa.crsmain_pk1 where (bbmd_date_added > v_Last_Archive OR bbmd_date_modified > v_Last_Archive) and cm.dtcreated- qa.bbmd_date_added> v_Datediff group by crsmain_pk1) QA on QA.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(a.pk1) A from attempt a left join gradebook_grade gg on a.pk1 = gg.last_attempt_pk1 left join gradebook_main gm on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (a.attempt_date > v_Last_Archive or a.date_modified > v_Last_Archive) and cm.dtcreated- a.attempt_date > v_Datediff group by crsmain_pk1) A on A.crsmain_pk1 = cm.pk1 left join (select co.owner_pk1, COUNT(CON.pk1) CONFERENCE_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where co.owner_table = 'COURSE_MAIN' and (CON.dtcreated > v_Last_Archive OR CON.dtmodified > v_Last_Archive) and cm.dtcreated-con.dtcreated > v_Datediff group by owner_pk1) ConM on ConM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(fr.pk1) FORUM_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (fr.dtcreated > v_Last_Archive OR fr.dtmodified > v_Last_Archive) and cm.dtcreated- fr.dtcreated > v_Datediff group by owner_pk1) FM on FM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(mm.pk1) MSG_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join msg_main mm on mm.forummain_pk 1 = fr.pk1 left join msg_main mm_reply on mm_reply.msgmain_pk1 = mm.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (mm.dtcreated > v_Last_Archive OR mm.dtmodifi ed > v_Last_Archive) and cm.dtcreated- mm.dtcreated > v_Datediff group by owner_pk1) MM on MM.OWNER_PK1 = cm.pk1 left join (select crsmain_pk1, COUNT(c.pk1) C from calendar c left join course_main cm on cm.pk1 = c.crsmain_pk1 where c.dtmodified > v_Last_Archive and cm.dtcreated- c.dtmodified > v_Datediff group by crsmain_pk1) C on C.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(s.pk1) S from staffinformation S left join course_main cm on cm.pk1 = s.crsmain_pk1 where s.dtmodified > v_Last_Archive and cm.dtcreated- s.dtmodified > v_Datediff group by crsmain_pk1) S on S.crsmain_pk1 = cm.pk1 where nvl(CC.CC,0) + nvl(GM.GM,0) + nvl(GG.GG,0) + nvl(QA.QA,0) + nvl(A.A,0) + nvl(ConM.CONFERENCE_MAIN,0) + nvl(FM.FORUM_MAIN,0) + nvl(MM.MSG_MAIN,0) + nvl(S.S,0) + nvl(C.C,0) >= v_Number_of_New_Entities ) LOOP dbms_output.put_line (rec.output); END LOOP; dbms_output.new_line();
end;
Administrative Planning
What courses meet the course archive criteria
declare @Last_Archive datetime declare @Datediff int declare @Number_of_New_Entities int declare @Directory varchar(256) declare @File_Name varchar(256) set @Last_Archive = '2011-6-7' --Enter the last datetime the course archival process ran set @Datediff = 24 --Enter the time duration between course creation and course entities you would like to track. For example, to avoid archive courses that were created since the last archive process enter the time of your longest running snapshot or SIS process in terms of hours. set @Number_of_New_Entities = 1 --Enter the number of new course entities required for a course to be archived set @Directory = (SELECT ', c:\Course_Archives\' + CAST(CONVERT(date, GETDATE()) as varchar(10)) + '\') --Alter the string to build the directory you wish to store your archives select course_id + @Directory from course_main cm left join (select crsmain_pk1, COUNT(cc.pk1) CC from course_contents cc left join course_main cm on cm.pk1 = cc.crsmain_pk1 where (cc.dtcreated > @Last_Archive or cc.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, cc.dtcreated) > @Datediff group by crsmain_pk1) CC on CC.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gm.pk1) GM from gradebook_main gm left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (date_added > @Last_Archive or date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, gm.date_added) > @Datediff group by crsmain_pk1) GM on GM.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gg.pk1) GG from gradebook_main gm left join gradebook_grade gg on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on gm.crsmain_pk1 = cm.pk1 where (gg.date_added > @Last_Archive OR gg.date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, gg.date_added) > @Datediff group by crsmain_pk1) GG on GG.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(qa.pk1) QA from qti_asi_data qa left join course_main cm on cm.pk1 = qa.crsmain_pk1 where (bbmd_date_added > @Last_Archive OR bbmd_date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, qa.bbmd_date_added) > @Datediff group by crsmain_pk1) QA on QA.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(a.pk1) A from attempt a left join gradebook_grade gg on a.pk1 = gg.last_attempt_pk1 left join gradebook_main gm on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (a.attempt_date > @Last_Archive or a.date_modified > @Last_Archive) and datediff(hour, cm.dtcreated, a.attempt_date) > @Datediff group by crsmain_pk1) A on A.crsmain_pk1 = cm.pk1 left join (select co.owner_pk1, COUNT(CON.pk1) CONFERENCE_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where co.owner_table = 'COURSE_MAIN' and (CON.dtcreated > @Last_Archive OR CON.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, con.dtcreated) > @Datediff group by owner_pk1) ConM on ConM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(fr.pk1) FORUM_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (fr.dtcreated > @Last_Archive OR fr.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, fr.dtcreated) > @Datediff group by owner_pk1) FM on FM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(mm.pk1) MSG_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join msg_main mm on mm.forummain_pk1 = fr.pk1 left join msg_main mm_reply on mm_reply.msgmain_pk1 = mm.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (mm.dtcreated > @Last_Archive OR mm.dtmodified > @Last_Archive) and datediff(hour, cm.dtcreated, mm.dtcreated) > @Datediff group by owner_pk1) MM on MM.OWNER_PK1 = cm.pk1 left join (select crsmain_pk1, COUNT(c.pk1) C from calendar c left join course_main cm on cm.pk1 = c.crsmain_pk1 where c.dtmodified > @Last_Archive and datediff(hour, cm.dtcreated, c.dtmodified) > @Datediff group by crsmain_pk1) C on C.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(s.pk1) S from staffinformation S left join course_main cm on cm.pk1 = s.crsmain_pk1 where s.dtmodified > @Last_Archive and datediff(hour, cm.dtcreated, s.dtmodified) > @Datediff group by crsmain_pk1) S on S.crsmain_pk1 = cm.pk1 where ISNULL(CC.CC,0) + ISNULL(GM.GM,0) + ISNULL(GG.GG,0) + ISNULL(QA.QA,0) + ISNULL(A.A,0) + ISNULL(ConM.CONFERENCE_MAIN,0) + ISNULL(FM.FORUM_MAIN,0) + ISNULL(MM.MSG_MAIN,0) + ISNULL(S.S,0) + ISNULL(C.C,0) >= @Number_of_New_Entities
Administrative Planning
What courses meet the course archive criteria
set serveroutput on size 100000 ---Administrative Planning What courses meet the course archive criteria declare v_Last_Archive date; v_Datediff int; v_Number_of_New_Entities int; v_Directory varchar(256); v_File_Name varchar(256); Begin v_Last_Archive := TO_DATE('7-JUN-2011'); --Enter the last datetime the course archival process ran v_Datediff := 1 ; --this is the day --Enter the time duration between course creation and course entities you would like to track. For example, to avoid archive courses that were created ----since the last archive process enter the time of your longest running snapshot or SIS process in terms of hours. v_Number_of_New_Enti ties := 1; --Enter the number of new course entities required for a course to be archived select 'usr\local\blackboard\Course_Archi ves \' | | TO_CHAR(SYSDATE, 'DD-Mon-YYYY') | | '\' into v_Directory FROM Dual; --Alter the string to build the directory you wish to store your archives dbms_output.enable(9999999); dbms_output.new_line();
FOR rec IN ( select course_id | | v_Directory as output from course_main cm left join (select crsmain_pk1, COUNT(cc.pk1) CC from course_contents cc left join course_main cm on cm.pk1 = cc.crsmain_pk1 where (cc.dtcreated > v_Last_Archive or cc.dtmodified > v_Last_Archive) and cm.dtcreated- cc.dtcreated> v_Datediff group by crsmain_pk1) CC on CC.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gm.pk1) GM from gradebook_main gm left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (date_added > v_Last_Archive or date_modified > v_Last_Archive) and cm.dtcreated- gm.date_added> v_Datediff group by crsmain_pk1) GM on GM.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(gg.pk1) GG from gradebook_main gm left join gradebook_grade gg on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on gm.crsmain_pk1 = cm.pk1 where (gg.date_added > v_Last_Archive OR gg.date_modified > v_Last_Archive) and cm.dtcreated- gg.date_added> v_Datediff group by crsmain_pk1) GG on GG.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(qa.pk1) QA from qti_asi_data qa left join course_main cm on cm.pk1 = qa.crsmain_pk1 where (bbmd_date_added > v_Last_Archive OR bbmd_date_modified > v_Last_Archive) and cm.dtcreated- qa.bbmd_date_added> v_Datediff group by crsmain_pk1) QA on QA.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(a.pk1) A from attempt a left join gradebook_grade gg on a.pk1 = gg.last_attempt_pk1 left join gradebook_main gm on gm.pk1 = gg.gradebook_main_pk1 left join course_main cm on cm.pk1 = gm.crsmain_pk1 where (a.attempt_date > v_Last_Archive or a.date_modified > v_Last_Archive) and cm.dtcreated- a.attempt_date > v_Datediff group by crsmain_pk1) A on A.crsmain_pk1 = cm.pk1 left join (select co.owner_pk1, COUNT(CON.pk1) CONFERENCE_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where co.owner_table = 'COURSE_MAIN' and (CON.dtcreated > v_Last_Archive OR CON.dtmodified > v_Last_Archive) and cm.dtcreated-con.dtcreated > v_Datediff group by owner_pk1) ConM on ConM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(fr.pk1) FORUM_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (fr.dtcreated > v_Last_Archive OR fr.dtmodified > v_Last_Archive) and cm.dtcreated- fr.dtcreated > v_Datediff group by owner_pk1) FM on FM.OWNER_PK1 = cm.pk1 left join (select co.owner_pk1, COUNT(mm.pk1) MSG_MAIN from conference_owner CO left join conference_main CON on CON.conference_owner_pk1 = CO.pk1 left join forum_main fr on fr.confmain_pk1 = CON.pk1 left join msg_main mm on mm.forummain_pk 1 = fr.pk1 left join msg_main mm_reply on mm_reply.msgmain_pk1 = mm.pk1 left join course_main cm on cm.pk1 = co.owner_pk1 where owner_table = 'COURSE_MAIN' and (mm.dtcreated > v_Last_Archive OR mm.dtmodifi ed > v_Last_Archive) and cm.dtcreated- mm.dtcreated > v_Datediff group by owner_pk1) MM on MM.OWNER_PK1 = cm.pk1 left join (select crsmain_pk1, COUNT(c.pk1) C from calendar c left join course_main cm on cm.pk1 = c.crsmain_pk1 where c.dtmodified > v_Last_Archive and cm.dtcreated- c.dtmodified > v_Datediff group by crsmain_pk1) C on C.crsmain_pk1 = cm.pk1 left join (select crsmain_pk1, COUNT(s.pk1) S from staffinformation S left join course_main cm on cm.pk1 = s.crsmain_pk1 where s.dtmodified > v_Last_Archive and cm.dtcreated- s.dtmodified > v_Datediff group by crsmain_pk1) S on S.crsmain_pk1 = cm.pk1 where nvl(CC.CC,0) + nvl(GM.GM,0) + nvl(GG.GG,0) + nvl(QA.QA,0) + nvl(A.A,0) + nvl(ConM.CONFERENCE_MAIN,0) + nvl(FM.FORUM_MAIN,0) + nvl(MM.MSG_MAIN,0) + nvl(S.S,0) + nvl(C.C,0) >= v_Number_of_New_Entities ) LOOP dbms_output.put_line (rec.output); END LOOP; dbms_output.new_line();
end;
declare @start int declare @end int declare @enrollments int set @start = 0 set @end = (Select top 1 NumberOfTests from #BinTests order by NumberOfTests desc) create table #Results( Number_Of_Tests int, Number_Of_Enrollments int)
set @enrollments = (select NumberOfEnrollments from #BinTests where NumberOfTests = @start) insert into #Results (Number_of_Tests, Number_Of_Enrollments) values (@start, @enrollments) set @start = @start + 1 end
select Number_Of_Tests, Number_Of_Enrollments = Case When Number_Of_Enrollments IS NULL THEN 0 When Number_Of_Enrollments >= 0 THEN Number_Of_Enrollments End from #Results drop table #BinTests drop table #Results
declare v_enrollment_start date; v_enrollment_end date; sql_stmt varchar(8000); v_start int; v_end int; v_enrollments int; Begin dbms_output.enable(9999999); dbms_output.new_line(); v_enrollment_start := to_date('2010-9-1 00:00:00', 'yyyy- mm-dd HH24:MI:SS'); v_enrollment_end := to_date('2011-9-1 00:00:00', 'yyyy- mm-dd HH24:MI:SS');
v_start := 0; Select NumberOfTests into v_end from (select NumberOfTests from BinTests order by NumberOfTests desc) WHERE ROWNUM =1; EXECUTE IMMEDIATE ' drop table Results'; EXECUTE IMMEDIATE ' create table Results ( Number_Of_Tests int, Number_Of_Enroll ments int)'; EXCEPTION WHEN OTHERS THEN NULL; END; /
declare v_enrollment_start date; v_enrollment_end date; sql_stmt varchar(8000); v_start int; v_end int; v_enrollments int; Begin dbms_output.enable(9999999); dbms_output.new_line(); v_enrollment_start := to_date('2010-9-1 00:00:00', 'yyyy- mm-dd HH24:MI:SS'); v_enrollment_end := to_date('2011-9-1 00:00:00', 'yyyy- mm-dd HH24:MI:SS');
select NumberOfEnroll ments into v_enrollments insert into Results (Number_of_Tests, Number_Of_Enroll ments) values ( v_start, v_enrollments ); v_start := v_start + 1; end loop;
dbms_output.new_line(); FOR rec IN ( select Number_Of_Tests, nvl(Number_Of_Enroll ments,0) Number_Of_Enroll ments from Results)
LOOP dbms_output.put_line (rec.Number_Of_Tests | | ',' | | rec.Number_Of_Enrollments); END LOOP; dbms_output.new_line(); EXCEPTION WHEN OTHERS THEN NULL; --drop table BinTests --drop table Results END;
FOR rec IN ( SELECT count(pk1) TheCount, TO_char(bbmd_date_added,'HH24') TheHour from qti_result_data where bbmd_date_added > v_start_date and bbmd_date_added < v_end_date group by TO_char(bbmd_date_added,'HH24') order by TO_char(bbmd_date_added,'HH24')) LOOP dbms_output.put_line (to_char(rec.TheCount)); END LOOP; dbms_output.new_line();
end;
from qti_result_data where bbmd_date_added > @start_date and bbmd_date_added < @end_date group by DATEPART(DW, bbmd_date_added) order by DATEPART(DW, bbmd_date_added) asc
SELECT count(pk1) TheCount, to_char(to_date (bbmd_date_added, 'yyyy-mm-dd HH24:MI:SS'),'DAY') from qti_result_data where bbmd_date_added > to_date('2010-9-1', 'yyyy-mm-dd') and bbmd_date_added < to_date('2011-9-1', 'yyyy-mm-dd') group by to_char(to_date (bbmd_date_added , 'yyyy-mm-dd HH24:MI:SS'),'DAY') order by to_char(to_date (bbmd_date_added , 'yyyy-mm-dd HH24:MI:SS'),'DAY') asc
AWR report
SELECT count(pk1) * @question_io Test_Question_IO, cast(DATEPART(YEAR, bbmd_date_added) as varchar(4)) + '-' + cast(DATEPART(MONTH, bbmd_date_added) as varchar(2)) + '-' + cast(DATEPART(DAY, bbmd_date_added) as varchar(2)) TheDate from qti_result_data where bbmd_date_added > @start_date and bbmd_date_added < @end_date group by DATEPART(YEAR, bbmd_date_added), DATEPART(MONTH, bbmd_date_added), DATEPART(DAY, bbmd_date_added) order by DATEPART(YEAR, bbmd_date_added), DATEPART(MONTH, bbmd_date_added), DATEPART(DAY, bbmd_date_added)
declare @ts_now bigint declare @start int declare @end int declare @Start_time datetime declare @End_time datetime declare @Bb_Activity int declare @QTI_RESULTS_Activity int set @ts_now = (SELECT cpu_ticks/(cpu_ticks/ms_ticks)FROM sys.dm_os_sys_info);
SELECT TOP(256) SQLProcessUtilization AS [SQL_Server_Process_CPU_Utilization], SystemIdle AS [System_Idle_Process], 100 - SystemIdle - SQLProcessUtilization AS [Other_Process_CPU_Utilization], DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [start_Time], DATEADD(minute, 1, DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE())) AS [end_Time], IDENTITY( int ) AS TheCount into #cpu FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle], record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization], [timestamp] FROM (SELECT [timestamp], CONVERT(xml, record) AS [record] FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE N'%<SystemHealth>%') AS x) AS y ORDER BY record_id DESC
set @start = 0 set @end = (select MAX(TheCount) from #cpu) CREATE TABLE [dbo].[#cpu_Activity]( [Activity_Accumulator_Activity] [int] NULL, [QTI_RESULTS_Activity] [int] NULL, [SQL_Server_Process_CPU_Utilization] [int] NULL, [System_Idle_Process] [int] NULL, [Other_Process_CPU_Utilization] [int] NULL, [start_Time] [datetime] NULL, [end_Time] [datetime] NULL, [TheCount] [int] NULL)
WHILE @start < @end BEGIN SET @start = @start + 1 SET @Start_time = (select Start_Time from #cpu where TheCount = @start) SET @End_time = (select End_Time from #cpu where TheCount = @start) set @Bb_Activity = (select COUNT(*) from activity_accumulator where timestamp > @Start_time and timestamp < @End_time) set @QTI_RESULTS_Activity = (select COUNT(*) from qti_result_data where bbmd_date_modified > @Start_time and bbmd_date_modified < @End_time) Insert into #cpu_Activity SELECT @Bb_Activity, @QTI_RESULTS_Activity, * from #cpu where thecount = @start
end select * from #cpu_activity drop table #cpu; drop table #cpu_activity;
AWR report, v$sql select ... rom activity_accmultor where event_type ='login';
CREATE TABLE [dbo].[#FILE_IO]( [name] [sysname] NULL, [num_of_bytes_read] [bigint] NOT NULL, [num_of_bytes_written] [bigint] NOT NULL, [num_of_reads] [bigint] NOT NULL, [num_of_writes] [bigint] NOT NULL, [size_on_disk_bytes] [bigint] NOT NULL ) ON [PRIMARY] declare @start int declare @end int set @start = 5 set @end = (select top 1 database_id from sys.master_files where database_id > 5 order by database_id desc) while @start < @end begin insert into #FILE_IO select name, num_of_bytes_read, num_of_bytes_written, num_of_reads, num_of_writes, size_on_disk_bytes from sys.dm_io_virtual_file_stats(@start,NULL) s left join sys.master_files f on s.database_id = f.database_id and s.file_id = f.file_id set @start = @start + 1 end select * from #FILE_IO drop table #FILE_IO
AWR report, v$sql select ... rom activity_accmultor where event_type ='login';
SELECT 'TEST QUESTION' Type, SUM(qs.execution_count) Execution_Count, SUM(qs.total_logical_reads) Total_Reads, SUM(qs.total_logical_writes) Total_Writes, SUM(qs.total_worker_time) Total_CPU FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp WHERE SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) LIKE '%INSERT INTO QTI_RESULT_DATA%' --Enter a portion of the query text you are interested in and SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) NOT LIKE 'SELECT SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,%' UNION SELECT 'OTHER TRANSACTIONS' Type, SUM(qs.execution_count) Execution_Count, SUM(qs.total_logical_reads) Total_Reads, SUM(qs.total_logical_writes) Total_Writes, SUM(qs.total_worker_time) Total_CPU FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp WHERE SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) NOT LIKE '%INSERT INTO QTI_RESULT_DATA%' --Enter a portion of the query text you are interested in and SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) NOT LIKE 'SELECT SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,%'
AWR report, and use v$sql, sqlarea to find INSERT INTO QTI_RESULT_DATA%'