ASP
  Home arrow ASP arrow So Many Rows, So Little Time! - Case Study
Dev Articles Forums 
ADO.NET  
Apache  
ASP  
ASP.NET  
C#  
C++  
ColdFusion  
COM/COM+  
Delphi-Kylix  
Design Usability  
Development Cycles  
DHTML  
Embedded Tools  
Flash  
Graphic Design  
HTML  
IIS  
Interviews  
Java  
JavaScript  
MySQL  
Oracle  
Photoshop  
PHP  
Reviews  
Ruby-on-Rails  
SQL  
SQL Server  
Style Sheets  
VB.Net  
Visual Basic  
Web Authoring  
Web Services  
Web Standards  
XML  
Mobile Linux 
App Generation ROI 
IBM® developerWorks 
Weekly Newsletter
 
Developer Updates  
Free Website Content 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
ASP

So Many Rows, So Little Time! - Case Study
By: Jeff Mangan
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 5 stars5 stars5 stars5 stars5 stars / 1
    2003-04-14

    Table of Contents:

    Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
    ADVERTISEMENT


    Jeff explains how to reduce the time it takes to reduce the retrieve a recordset from a large database using an asynchronous call. Read this article to find out how.

    Technologies Referenced

    • Microsoft Active Server Pages
    • Microsoft SQL Server 7.0
      • Distributed Management Objects (SQL DMO)
      • Data Transformation Services (DTS)
    • Visual Basic
      • Com

    The Company

    MatureWell Inc. is an organization based in Tucson, AZ, and specializes in web based solutions for the HMO industry. It recently acquired Premier Healthcare of Arizona, which is based in Phoenix. MatureWell is currently in the process of migrating Premier from their existing IT infrastructure, to MatureWell’s Web based solution, which will eventually be marketed to other organizations also.

    The Situation

    The users wanted to have an html form that allowed them to pass in some parameters, call a stored procedure, and then return a recordset to be displayed in the browser, using Excel. This was all fine and dandy, except we are talking about searching through over a million rows of data, and bringing back about 15 fields for each returned record, which can be time consuming. Our in-house custom system uses Microsoft Web technologies, n-Tiered architecture, and Windows DNA.

    Although still being developed and "productized", it is currently being used by Premier Health Care of Arizona, a subsidiary of MatureWell Inc., which has over 80,000 participating members. Because this number of members is actually considered to be quite small for a well-established HMO, our system has to be very scalable to accommodate for growth and meet the needs of larger HMOs. This project was just one of the many issues we had to overcome during the migration process for Premier.

    Back to the Development Aspects

    After building the user interface, it was time to move on to the stored procedure. Just building the sProc was not enough. It took several minutes to finish executing, and this was not acceptable. Thus, I found myself spending several hours trying to optimize it.

    After modifying and adding additional INDEXES, restructuring the SQL and the WHERE clause, I found that it still took about five minutes to run and generate the recordset. When this was moved into our production site, which uses a four processor I386 architecture and two gigabytes of RAM, the user had to wait for what we still consider to be way too long. Imagine staring at a "status bar" for minutes waiting for the results to be returned; not a good thing.

    A Better Way

    First, in order to fit with the rest of our system architecture, we decided to move the business logic into a server-side COM object. The logic included into this COM object allowed us to make an asynchronous call to an already created DTS package in MS SQL 7. In order to reference the DTS object model, we used SQL Distributed Management Objects or SQL DMO. This is an object model found inside of MS SQL 7.

    Here is a snippet of the method that does this.

    Public Function AsyncExecute(ByVal PackageName As String, ByVal Server As String, Optional ByVal UserName As String, _
                                 Optional ByVal UserPass As String, Optional ByVal PackagePassword As String, Optional ByVal GlobalVariables As Variant) As Boolean
        Dim oPackage As DTS.Package
        Dim oJob As SQLDMOUtil.Job
        Dim sJobName As String
        Dim i As Integer
        On Error GoTo ErrorHandler
        Set oPackage = CreateObject("DTS.Package")
        If Trim(UserName) <> "" Then
            oPackage.LoadFromSQLServer Server, UserName, UserPass, DTSSQLStgFlag_Default, PackagePassword, , , PackageName
        Else
            oPackage.LoadFromSQLServer Server, , , DTSSQLStgFlag_UseTrustedConnection, PackagePassword, , , PackageName
        End If
        If Not IsMissing(GlobalVariables) Then
            For i = 0 To UBound(GlobalVariables)
                oPackage.GlobalVariables(GlobalVariables(i, 0)).Value = GlobalVariables(i, 1)
            Next
        End If
        ' Save the package with the new global variable values
        If Trim(UserName) <> "" Then
            oPackage.SaveToSQLServer Server, UserName, UserPass, DTSSQLStgFlag_Default
        Else
            oPackage.SaveToSQLServer Server, , , DTSSQLStgFlag_UseTrustedConnection
        End If
        ' Create a job object to schedule this DTS packae to run
        Set oJob = CreateObject("SQLDMOUtil. Job")
        ' Generate a semi unique job name based on the package name and the hour minute and seconds
        sJobName = PackageName & "_" & CStr(Hour(Time())) & CStr(Minute(Time())) & CStr(Second(Time()))
        ' Schedule the package to run immediately and delete itself after running whether the job was successfull or not
        oJob.ScheduleDTSPackage sJobName, PackageName, Server, Date, Time(), , , , , , SQLDMOComp_Always, True
        ' Clean up
        Set oPackage = Nothing
        Set oJob = Nothing
        AsyncExecute = True
        #If bUseMTS Then
            oCtx.SetComplete
        #End If
    Exit Function


    The purpose of the Asynchronous call was to allow the user to regain control of the browser quickly, instead of having to wait until the stored procedure was finished executing, and the recordset was generated. Instead, using our asynchronous method, the process would work like this:

    Change the values of the DTS global variables we created to reflect the values of the parameters that were passed into our asynchronous method as a two dimensional array, which we got from the user via the html form. Then we needed to build a dynamic SQL string using these values, and assign it to the "Data Pump Task" property of DTS. This allows us to call the sProc and pass it the dynamic parameters on the "fly"

    Create a new SQL "JOB" and attach our dynamically modified DTS package

    Schedule the JOB to run immediately.

    After completing the process, delete the JOB. We still have the DTS package to use next time, just not the JOB that scheduled it to run for this instance.

    The Logic Inside of the ASP

    <%
    'dim the variants
    dim objDTSJOB
    dim sPackageName
    dim sServerForPackage
    'dim the array for storing the parameters
    dim arrayGblVars
    redim arrayGblVars(13,1)
    'name of the DTS Package   
    sPackageName = "MyDTSPackage"
    'name of the database server
    sServerForPackage = "MyServer"
    'populate the array. The name values in the array must be the same
    'name as the global variable in the DTS.
    'Use the values from the html form
    arrayGblVars(0,0) = "Name0"
    arrayGblVars(0,1) = Request.Form("Value")
    arrayGblVars(1,0) = "Name1"   
    arrayGblVars(1,1) = Request.Form("Value")
    arrayGblVars(2,0) = "Name2"   
    arrayGblVars(2,1) = Request.Form("Value")
    arrayGblVars(3,0) = "Name3"
    arrayGblVars(3,1) = Request.Form("Value")
    arrayGblVars(4,0) = "Name4"   
    arrayGblVars(4,1) = Request.Form("Value")
    arrayGblVars(5,0) = "Name5"
    arrayGblVars(5,1) = Request.Form("Value")
    arrayGblVars(6,0) = "Name6"
    arrayGblVars(6,1) = Request.Form("Value")
    arrayGblVars(7,0) = "Name7"
    arrayGblVars(7,1) = Request.Form("Value")
    arrayGblVars(8,0) = "Name8"
    arrayGblVars(8,1) = Request.Form("Value")
    arrayGblVars(9,0) = "Name9"
    arrayGblVars(9,1) = Request.Form("Value")
    arrayGblVars(10,0) = "Name10"
    arrayGblVars(10,1) = Request.Form("Value")
    arrayGblVars(11,0) = "Name11"   
    arrayGblVars(11,1) = Request.Form("Value")
    arrayGblVars(12,0) = "Name12"   
    arrayGblVars(12,1) = Request.Form("Value")
    arrayGblVars(13,0) = "Name13Email"
    arrayGblVars(13,1) = AUOEmailValue
    'Create an instance of the object that will build a DTS JOB, execute it, then delete the JOB.
    'control will be returned back to the browser as soon as the method is executed.
    on error resume next
    set objDTSJOB = Server.CreateObject("SQLDMOUtil.DTSPackage")
    objDTSJOB.AsyncExecute sPackageName, sServerForPackage,,,,arrayGblVars
    if err.number <> 0 then
      Response.Write "There was an error, please run the report again. "
      Response.Write "The following error occured: " & err.description
    else
      Response.Write "Your request has been submitted and the data will be emailed to you in the next few minutes."
    end if
    set objDTSJOB = nothing
    %>

    Main Advantage

    The user will gain back control of the browser as soon as the JOB gets scheduled (almost immediately). The browser’s response will be a message saying "the data will be emailed to you in a few minutes". As far as the email goes, our site is configured using Site Server 3.0 and it's Personalization and Membership Directory. Thus, every user has a Site Server account, which stores personal information, including each users email address.

    So, we query this LDAP server, retrieve the user’s email address from the AUO object, and this value is also one of those global variables that is passed inside of the array. Now, while they are waiting for the data to be emailed to them, then can be running other reports, or doing whatever else they want since they will no longer have to wait for the asp page to load the response. The generated recordset will be attached to the email as an Excel spreadsheet.

    Summary

    I was given the task of creating a report that would allow the user to pass in specific parameters, call a stored procedure, generate a recordset, and then display it in Excel via the user’s browser. The problem that I encountered was the amount of time required for this process to complete.

    So, realizing this was not an optimal solution we decided to transfer control of the process to the server as soon as possible so the user could go about their other activities, instead of waiting and being tied down to the browser until the result it brought back to display. To do this, we used SQL DMO, ASP, AND DTS.


    DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.

    More ASP Articles
    More By Jeff Mangan

     

    IBM® developerWorks developerWorks - FREE Tools!


    Be the first to hear about i5/OS V6R1!

    Hold your calendar on January 30, 2008 for this free webcast on the new i5/OS. Rational's Enterprise Modernization products will be discussed at this webcast as they help to drive the application development environment for this new System i OS. <br />And learn how i5/OS will take you to the next step of efficient, resilient business processing. You will hear about the new i5/OS capabilities as it will be the most significant i5/OS release in years. If you cannot join the webcast on 1/30/08 you can still use this link to listen to the replay.<br />
    FREE! Go There Now!


    NEW! Download DB2 9.5 for Linux, Unix, and Windows

    Download a free trial version of IBM DB2 9.5 for Linux, UNIX, and Windows. DB2 9 is the result of a five-year development project that transformed traditional (static) database technology into an interactive data server that merges the high performance and ease of use of DB2 with the self-describing benefits of XML.
    FREE! Go There Now!


    NEW! Harnessing the power of SQL and Java for high performance data access

    Join this webcast to see how IBM Data Studio Developer and pureQuery can take the pain out of Java data access. uApplications developed using both Java and SQL have become a common requirement. Database connectivity using Java Database Connectivity (JDBC) to create an application is a multi-step tedious process, and tooling that covers both SQL and Java has been unavailable, until now. IBM Data Studio introduces the pureQuery platform: a high-performance, Java data access platform focused on simplifying the tasks of developing, managing, and optimizing database applications and services.
    FREE! Go There Now!


    NEW! Improve your build process with IBM Rational Build Forge, Part 2: Automate builds for a real-world Tomcat project

    Learn how Rational Build Forge can extend a simple compile and package build process by adding customization and deployment capability. Go from a manual method to automating: checking for code changes; getting the latest source; compiling and packaging; customizing; copying to and restarting a deployment server; and sending e-mail notification that a new version is available.
    FREE! Go There Now!


    NEW! Krugle, developerWorks, and code search

    Ken Krugler, co-founder of code search company Krugle, and Laura Merling, vice president of Marketing and Business Development for Krugle, join to talk about the ins and outs of code search and what it means as a new feature for developerWorks users.
    FREE! Go There Now!


    NEW! Rational Modeling Extension for Microsoft.Net

    Rational Modeling Extension for Microsoft .NET enhances usability for code generation supporting a more intelligent refactoring. The latest enhancements enable organizations with Java and .NET systems and software development maintain architectural integrity across heterogeneous platforms.
    FREE! Go There Now!


    NEW! Rational Talks to You: Grady Booch on Architecture

    Join this Rational Talks to You teleconference on November 29 at 1:00 pm ET to participate in an interactive discusssion with Grady Booch around architecture and reuse. Get your questions answered!
    FREE! Go There Now!


    NEW! Rational Talks to You: Manage RUP-based CMMI initiatives

    Join this Rational Talks to You teleconference on December 4 at 1:00 pm ET to discuss how Rational Method Composer can help meet your compliance objectives. Get your questions answered!
    FREE! Go There Now!


    NEW! The role of integrated requirements management in software delivery

    This paper is about the critical role that a discipline called integrated require­ments management can play in helping to ensure that your business goals and IT investments are continuously aligned—whether you are sourcing, integrat­ing, building or maintaining software. It also looks at ways that automated IBM Rational® products can work together to help you use requirements in the very best way.
    FREE! Go There Now!


    Refresh! IBM Rational Systems Development Solution eKit

    With IBM Rational Systems Development Solution, you can deliver products faster with higher quality. Within this kit, Read the “Model Driven Systems Development” white paper to see how to improve product quality and communication. Then check out the rest of the e-Kit to learn more about important topics that can affect the success of any software project through customer examples, tutorials, informative Webcasts, and best practices for designing, building and managing systems. From start to finish, at every stage in your projects, Rational Systems Development Solution can help your company reach its full potential.
    FREE! Go There Now!



    All FREE IBM® developerWorks Tools!

    ASP ARTICLES

    - Central Scoreboard with Flash and ASP
    - Calorie Counter Using WAP and ASP
    - Creating PGP-Encrypted E-Mails Using ASP
    - Be My Guest in ASP
    - Session Replacement in ASP
    - Securing ASP Data Access Credentials Using t...
    - The Not So Ordinary Address Book
    - Adding and Displaying Data Easily via ASP an...
    - Sending Email From a Form in ASP
    - Adding Member Services in ASP
    - Removing Unconfirmed Members
    - Trapping HTTP 500.100 - Internal Server Error
    - So Many Rows, So Little Time! - Case Study
    - XDO: An XML Engine Class for Classic ASP
    - Credit Card Fraud Prevention Using ASP and C...







    © 2003-2009 by Developer Shed. All rights reserved. DS Cluster 6 Hosted by Hostway
    For more Enterprise Application Development news, visit eWeek