Synopsis. Oracle 10g's new DBMS_SCHEDULER package offers significant advanced features over its predecessor, DBMS_JOB, that any reasonably skilled Oracle DBA can use to insure that sufficient resources will always be available for processing complex business requirements. This article - the final in a three-part series - provides some practical examples of how the new Scheduler can help a DBA to manage and overcome these challenges.
The previous article in this series provided working examples of how the new Oracle Scheduler can replace tasks originally scheduled with DBMS_JOB with corresponding DBMS_SCHEDULER features. This final article will concentrate on what I like to think of as the advanced features of the Oracle Scheduler: the capability to manage a complex queue of scheduled tasks within specific timeframes and resource utilization requirements.
Advanced Scheduling Features for Business Realities
Most business organizations usually have at least some business processes that typically take a large amount of time, or require comparatively large amounts of server resources, to complete. Some examples I have encountered include:
- Resource-intensive reporting (e.g., generation of customers' billing statements)
- Long-running "batch" processing (e.g., consolidation and posting of billing detail to general ledger accounts)
- Consolidation of the current period's data (e.g., daily or weekly data warehouse updates)
- Data maintenance (e.g. data "pruning" to remove obsolete information)
Typically these processes need to be invoked during off-peak periods when sufficient resources are available, and - more importantly - when there will be little or no contention with online transaction processing (OLTP) activities like order entry, customer service inquiries, and order fulfillment.
To provide a sufficient example of the power of these advanced scheduling capabilities, I will take the liberty of expanding the requirements described in previous articles to include some new business realities. I am basing these requirements on recent experience with my own user community, by the way:
- The Accounting department has just submitted a list of brand-new reports that have to be run on a daily basis.
- Many of these new reports are relatively small resource consumers, but some of these reports produce large amounts of output, and they consume a lot of system resources (i.e. heavy sorting and grouping as well as intensive calculations).
- My database is running at peak capacity (i.e. maximum users performing OLTP activities) in the early morning through late afternoon, and I need to reserve sufficient system resources for these activities. (In fact, the number of OLTP users is increasing steadily, and, no, I cannot persuade upper management that we need a new server to handle the ever-increasing load - yet.)
- My users understand that I must concentrate on allocating system resources for OLTP activities, and are willing to accept batch processing of the really large reports during off-peak periods, but they would still like to run the smaller reports when there are sufficient resources (if any) during peak periods.
- My development team is still working on creating a set of packaged procedures and functions that will eventually generate the reporting output. As DBA, I just need to insure the reports are executed within the restrictions listed previously.
The Oracle 10g Scheduler's advanced features significantly simplify scheduling the tasks to support these requirements. Let's start with a way to group similar jobs together: job classes.
Using Job Classes to Group Scheduled Tasks
Job classes provide the capability to group similar scheduled tasks together based on whatever criteria I decide. For example, I might gather jobs together based on common functionality, or I might group them based on similar resource consumption expectations.
Listing 3.1 shows how to create job classes. In this scenario, I have created just two for now, AccountingRpts for the new Accounting reports requirements, and DBManagement for database management tasks. I can also specify the amount and level of Scheduler logging to be preserved for any job in this class. Also note that I can assign a resource consumer group to link the class to a specific Database Resource Management (DRM) resource consumer group if I so desire. (In the interest of a simpler example, I have chosen to leave this feature off for now.)
Assigning jobs to job classes is also simple. Assuming that the job class already exists, it can be assigned when the job is created as one of the arguments for the job's definition; otherwise, the job class can be changed by executing the DBMS_SCHEDULER.SET_ATTRIBUTE procedure for the desired job. Note that if no job class is assigned when the job is first created, the Scheduler's default job class (DEFAULT_JOB_CLASS) will be automatically assigned.
Listing 3.2 demonstrates how to assign existing jobs to the new job classes just created.
Using Windows to Control Resource Consumption
While job classes are useful for grouping similar jobs together, the Scheduler's window object provides an even more powerful set of tools: the ability to determine which database resources should be used to process which scheduled tasks between specific time ranges and for a specific length of time. This is precisely what I need to satisfy my users' new reporting requirements.
As I noted in the first article in this series, this advanced feature is tightly coupled with the existing Database Resource Manager (DRM) functionality that enables resource plans, resource groups, and resource consumer groups. A full discussion of these features is unfortunately beyond the scope of this article; however, please see my prior articles on DRM for detailed information as well as practical examples of resource plans.
For these new reporting requirements, I will create four windows for the following time periods using the DBMS_SCHEDULER.CREATE_WINDOW procedure. Listing 3.3 provides an example of creating these four windows for specific time frames and durations:
- PEAK_AM: 06:00 through 12:00 Central Time (CT), Mondays thru Fridays
- PEAK_PM: 12:00 through 18:00 CT, Mondays thru Fridays
- OFF_DAYS: Mondays starting at 18:00 CT through Saturdays at 06:00 CT
- WKENDS: Saturdays starting at 06:00 CT through Mondays at 06:00 CT
Windows can also be created based on the parameters stored in an existing schedule object. See Listing 3.4 for an example of this method.
Even though my development team is still working on the packaged procedures that will create the required new reports for my users, these new window objects firmly define how I will need to eventually schedule the corresponding jobs that will fire to create the reporting output:
- Jobs that execute long-running reports should definitely be placed into the OFF_DAYS window so that the reports will run within the strictures of the OFF-PEAK resource plan.
- Jobs that run the smaller reports can be placed into either the PEAK_AM or PEAK_PM windows to allow them to run within the strictures of the PEAKTIME resource plan.
- Any other scheduled tasks that need to execute during peak times will be placed into the appropriate PEAK_AM or PEAK_PM windows.
- Any maintenance tasks can be placed into the OFF_DAYS or WKENDS windows.