Home Forums SQL Server 7,2000 Performance Tuning Computed Column is slowing down performance on a simple select statement RE: Computed Column is slowing down performance on a simple select statement

  • Here is the stored procedure that validates the student credentials. I will be posting the UDF's shortly, once I clean them up to look nice.

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_NULLS ON

    GO

    CREATE PROC spa_SomeSproc

    @ListID INT, --List ID where the student is located

    @ItemID INT, --item that belongs to the list

    @LName VARCHAR(255), --last name of student

    @StudentID VARCHAR(75), --student id

    @StudentID2 VARCHAR(75),

    @SiteID VARCHAR(20)

    AS

    SET NOCOUNT ON

    DECLARE @cnt INT, @zeroTrimExtraID INT, @zeroTrimPIN INT

    create table #Students(

    contactsExtraID INT,

    FirstName VARCHAR(255),

    LastName VARCHAR(255),

    StudentBalance DECIMAL(19,4),

    DateAdjusted datetime,

    StudentID VARCHAR(75),

    StudentID2 VARCHAR(75),

    BuildingID VARCHAR(20),

    Meal1Balance DECIMAL(19,2),

    Meal2Balance DECIMAL(19,2),

    StudentGrade VARCHAR(20),

    PayStatus VARCHAR(20)

    )

    -------------------------------------------------------------------------------------------------

    --if the studentid or the studentid2 needs trailing zero processing, do it

    -------------------------------------------------------------------------------------------------

    SELECT

    @zeroTrimStudentID = b.zeroTrimStudentID,

    @zeroTrimStudentID2 = b.zeroTrimStudentID2

    FROM

    tblInventory a,

    tblExportSystem b

    WHERE

    a.ExportSystemID = b.id

    AND a.itemid = @itemid

    IF ISNUMERIC(@StudentID) = 0

    SET @zeroTrimStudentID = 0

    IF ISNUMERIC(@StudentID2) = 0

    SET @zeroTrimStudentID2 = 0

    IF @StudentID <> '' AND @zeroTrimStudentID=1

    BEGIN

    SET @StudentID = REPLACE(@StudentID, '0', ' ')

    SET @StudentID = LTRIM(@StudentID)

    SET @StudentID = REPLACE(@StudentID, ' ', '0')

    END

    IF @StudentID2 <> '' AND @zeroTrimStudentID2 = 1

    BEGIN

    SET @StudentID2 = REPLACE(@StudentID2, '0', ' ')

    SET @StudentID2 = LTRIM(@StudentID2)

    SET @StudentID2 = REPLACE(@StudentID2, ' ', '0')

    END

    -------------------------------------------------------------------------------------------------

    -- This following SQL assumes that if the validations weren't entered (therefore blank) then they

    -- weren't expected. Therefore, we need to do the checks with the validation bit values passed

    -------------------------------------------------------------------------------------------------

    INSERT INTO #Students

    SELECT * FROM

    (

    SELECT

    StudentInfoID,

    FirstName,

    sLNameEncoded,

    StudentBalance,

    DateAdjusted,

    StudentID =

    CASE WHEN @zeroTrimStudentID = 1 THEN

    CASE WHEN ISNUMERIC(StudentID) = 1 THEN CAST(CONVERT(BIGINT, StudentID) AS VARCHAR)

    ELSE StudentID

    END

    ELSE StudentID

    END,

    StudentID2 =

    CASE WHEN @zeroTrimPIN=1 THEN

    CASE WHEN isnumeric(StudentID2)=1 THEN CAST(convert(bigint, StudentID2) AS VARCHAR)

    ELSE StudentID2

    END

    ELSE StudentID2

    END,

    BuildingID,

    Meal1Balance,

    Meal2Balance,

    StudentGrade,

    PayStatus

    FROM

    qStudentIDContacts xtra --this is the view which accesses the table that has the computed column

    WHERE

    xtra.ListID = @ListID

    AND (( @LastName <> '' AND xtra.sLNameEncoded=@LastName) OR @LastName='')

    AND (( @BuildingID <> '' AND xtra.BuildingID=@BuildingID) OR @BuildingID='')

    ) final

    WHERE

    (( @StudentID <> '' AND dbo.fnHTMLEncode(dbo.fnHTMLDecode(final.StudentID))=@StudentID) OR @StudentID='')

    AND (( @StudentID2 <> '' AND dbo.fnHTMLEncode(dbo.fnHTMLDecode(final.StudentID2))=@StudentID2) OR @StudentID2='')

    SET @cnt = @@rowcount

    -------------------------------------------------------------------------------------------------

    -- Check to see if the sample information was used if no rows were returned.

    -------------------------------------------------------------------------------------------------

    IF @cnt = 0

    IF (

    (@LastName='TestLastName' OR @LastName='')

    AND (@StudentID='TestStudentID' OR @StudentID='TestStudentID+' OR @StudentID='TestStudentID-' OR @StudentID='' )

    AND (@StudentID2='TestID2' OR @StudentID2='TestID2+' OR @StudentID2='TestID2-' OR @StudentID2='')

    )

    BEGIN

    INSERT INTO #Students

    SELECT

    StudentInfoID = -1,

    FirstName = 'Jimminy',

    LastName = 'Cricket',

    StudentBalance = ROUND(RAND() * 20000 / 100,2) *

    CASE WHEN @StudentID = 'TestStudentID-' OR @StudentID2 = 'TestID2-'

    THEN -1

    ELSE 1

    END, --generates random # between $0.00 and $20.00

    DateAdjusted = GETDATE(),

    StudentID = @StudentID,

    StudentID2 = @StudentID2,

    BuildingID = '',

    Meal1Balance = ROUND(RAND() * 20000 / 100,0)*

    CASE WHEN @StudentID = 'TestStudentID-' OR @StudentID2 = 'TestID2-'

    THEN -1

    ELSE 1

    END, --generates random # between 0 and 200

    Meal2Balance = ROUND(RAND() * 20000 / 100,0)*

    CASE WHEN @StudentID = 'TestStudentID-' OR @StudentID2 = 'TestID2-'

    THEN -1

    ELSE 1

    END, --generates random # between 0 and 200

    StudentGrade = '03',

    PayStatus = 'R'

    SET @cnt = 1

    END

    SELECT * FROM #Students

    -------------------------------------------------------------------------------------------------

    -- Checks: If the validation bit is set and nothing was passed, this zeros so the sum will not

    -- be 3. If the sum is 3 (everything was passed), the return the count of what was returned

    -- above. The application logic will reject anything that != 1.

    -------------------------------------------------------------------------------------------------

    SELECT

    CASE WHEN

    (CASE WHEN LastNameValidation=1 AND @LastName = '' THEN 0

    ELSE 1

    END

    +

    CASE WHEN StudentIDValidation=1 AND @StudentID = '' THEN 0

    ELSE 1

    END

    +

    CASE WHEN StudentID2Validation=1 AND @StudentID2 = '' THEN 0

    ELSE 1

    END) = 3

    THEN @cnt

    ELSE 0

    END validCount

    FROM

    tblInventory i

    WHERE

    itemid = @itemid

    SET NOCOUNT OFF

    GO

    SET QUOTED_IDENTIFIER OFF

    GO

    SET ANSI_NULLS ON

    GO