Click here to Skip to main content
15,899,024 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Dear All ,

I Have A Problem with the Procedure Performance , First I want To Explain the process

I have View That Get Me a list of Mails Here Its :
SQL
SELECT  m.Mail_ID ,
        mt.MailTo_ID ,
        mt.MailTo_ToType ,
        ( CASE WHEN mp.MailPass_ID IS NULL
               THEN ( CASE WHEN mt.Mail_FromInternal = 0
                           THEN ( SELECT    Name
                                  FROM      dbo.Lookups
                                  WHERE     ID = m.MailFromID
                                ) + ' -External Mail'
                           ELSE emFrom.Employee_Name + ' / '
                                + hFrom.Hierarchy_Name
                      END )
               ELSE mp.MailsPasses_Sender
          END ) AS Sender ,
        ( CASE WHEN mp.MailPass_ID IS NULL THEN toExternal.Name
               ELSE mp.MailsPasses_Reciver
          END ) AS Reciver ,
        m.Mail_Title ,
        ISNULL(SUBSTRING(CONVERT(NVARCHAR, Mail_ContentSize / 1024.0 / 1024.0),
                         0,
                         CHARINDEX('.',
                                   CONVERT(NVARCHAR, Mail_ContentSize / 1024.0
                                   / 1024.0) + 2.0, 0) + 3), '0.00') + ' M.B' AS MailContentSize ,
       ( CASE WHEN ( SELECT    Configuration_Value
                      FROM      [Configurations]
                      WHERE     Configuration_ID = 14
                    ) = 'True' THEN CONVERT(NVARCHAR ,m.Mail_SenderDate,131)
               ELSE CONVERT(NVARCHAR,m.Mail_SenderDate)
          END ) AS Mail_SenderDate ,
        emFrom.Employee_ID AS FromEmployeeID ,
        emFrom.Hierarchy_ID AS FromHierarchyID ,
        toExternal.ID AS ToHierarchyID ,
        NULL AS ToEmployeeID ,
        ( SELECT    dbo.[fn_GetSenderFirstReciever](emFrom.Hierarchy_ID)
        ) AS SenderFirstReciever ,
        NULL AS RecieverFirstReciever ,
        ISNULL(priority.Name, 'No Data') AS PriorityName ,
        ISNULL(mailStatus.Name, 'No Data') AS MailStatusName ,
        Mail_Owner_Name ,
        Mail_Owner_Mobile_Number ,
        Mail_ReadDate ,
        Mail_Body ,
        Mail_BodyPlanText ,
        Mail_StatusID ,
        Mail_Priorty_ID ,
        Mail_Owner_Send_SMS ,
        m.Mail_Status ,
        mt.Employee_Folder_ID ,
        m.Mail_Catigory_ID ,
        m.Mail_General_ID ,
        m.Mail_PublicID ,
        m.Mail_ParentMailID ,
        m.Process_ID ,
        mp.MailPass_ID ,
        mp.MailPass_ByEmployeeID ,
        mp.MailPass_Hierarchy_ID ,
        mp.MailPass_IsPublished ,
        mp.MailPass_Note ,
        mp.MailPass_PublishedByEmployeeID ,
        mp.MailPass_PublishingDate ,
        mp.MailPass_ToEmployeeID ,
        mp.MailPass_Type ,
        mp.MailPass_ReadDate ,
        mp.MailPass_Rank ,
        mp.MailPass_IsInernal ,
        mp.MailTo_ID AS MailPass_MailTo_ID ,
        mpp.MailsPassesProccess_Name AS LastActionProcess ,
        m.IdentificationNo
FROM    dbo.Mails m
        INNER JOIN dbo.MailsTo mt ON m.Mail_ID = mt.Mail_ID
        INNER JOIN dbo.Employees emFrom ON emFrom.Employee_ID = m.Employee_ID
        INNER JOIN dbo.Hierarchy hFrom ON hFrom.Hierarchy_ID = emFrom.Hierarchy_ID
        INNER JOIN dbo.Lookups toExternal ON toExternal.ID = mt.MailTo_ToID
        LEFT JOIN dbo.Lookups priority ON priority.ID = m.Mail_Priorty_ID
        LEFT JOIN dbo.Lookups mailStatus ON mailStatus.ID = m.Mail_StatusID
        LEFT JOIN vwMailsPasses mp ON mp.Mail_ID = mt.Mail_ID
                                      AND ( mp.MailPass_Rank = ( SELECT
                                                              MAX(MailPass_Rank)
                                                              FROM
                                                              dbo.MailsPasses
                                                              WHERE
                                                              MailTo_ID = mp.MailTo_ID
                                                              )
                                            OR mp.MailPass_Rank IS NULL
                                          )
        LEFT JOIN dbo.MailsPassesProccess mpp ON mpp.MailsPassesProccess_ID = m.MailsPassesProccess_ID
WHERE   mt.MailTo_ToType = 2


No I want to select Data From This VIEW in some Cases LIKE :

SQL
CREATE TABLE #temp ( hierarcyID BIGINT ) ;
        INSERT  INTO #temp
                SELECT  i
                FROM    dbo.fn_GetCTSHierarchiesUnderHierarchyIDWithoutTheSenderNode(@HierarchyID)

        SELECT  vm.* ,
                me.MailExporter_ID ,
                me.Mail_ExportNo ,
                me.Mail_Exported ,
                me.Hierarchy_ID AS ExportedByHierarchy_ID ,
                me.MailExporter_Rank ,
                me.Employee_ID AS ExportedByEmployee_ID ,
                me.Hidden AS ExportedIsHidden ,
                mi.MailImporter_ID ,
                mi.Mail_ImportNo ,
                mi.Mail_Imported ,
                mi.Hierarchy_ID AS ImportedByHierarchy_ID ,
                mi.MailImporter_Rank ,
                mi.Employee_ID AS ImportedByEmployee_ID ,
                mi.Hidden AS ImportedIsHidden
        FROM    dbo.vwMails vm
                LEFT JOIN dbo.MailsExporter me ON vm.MailTo_ID = me.MailTo_ID
                                                  AND ( EXISTS ( SELECT
                                                          MailExporter_ID
                                                          FROM
                                                          dbo.MailsExporter
                                                          WHERE
                                                          Hierarchy_ID = ( SELECT
                                                          dbo.[fn_GetCTSHierarchyIDUnderHierarchyIDWithoutTheSenderNode](@HierarchyID,
                                                          FromHierarchyID)
                                                          )
                                                          AND MailTo_ID = vm.MailTo_ID )
                                                        OR ( SELECT
                                                          dbo.[fn_GetCTSHierarchyIDUnderHierarchyIDWithoutTheSenderNode](@HierarchyID,
                                                          FromHierarchyID)
                                                          ) IS NULL
                                                      )
                                                  AND ( EXISTS ( SELECT
                                                          MailExporter_ID
                                                          FROM
                                                          dbo.MailsExporter
                                                          WHERE
                                                          Hierarchy_ID = ( SELECT
                                                          dbo.[fn_GetFarestHierarchyIDByHierarchyID](FromHierarchyID)
                                                          )
                                                          AND MailTo_ID = vm.MailTo_ID )
                                                        OR ( SELECT
                                                          dbo.[fn_GetFarestHierarchyIDByHierarchyID](FromHierarchyID)
                                                          ) IS NULL
                                                      )
                LEFT JOIN dbo.MailsImporter mi ON vm.MailTo_ID = mi.MailTo_ID
                                                  AND mi.Hierarchy_ID = @HierarchyID


The Problem is I need To run this function to ensure that the row is exported before from the Hierarchy Under the sender Hierarchy THE FUNCTION IS Contains Recursive:
SQL
CREATE  FUNCTION [dbo].[fn_GetCTSHierarchyIDUnderHierarchyIDWithoutTheSenderNode]
    (
      @Hierarchy_ID BIGINT ,
      @senderHierarchyID BIGINT
    )
RETURNS BIGINT
AS 
    BEGIN 
        DECLARE Hierarchy_ID CURSOR
        FOR   SELECT   Hierarchy_ID
        FROM     dbo.Hierarchy
        WHERE    HierarchyParent_ID = @Hierarchy_ID AND Hierarchy_IsDeleted=0
        OPEN Hierarchy_ID
        FETCH NEXT FROM Hierarchy_ID 
INTO @Hierarchy_ID

        WHILE @@FETCH_STATUS = 0 
            BEGIN 
                  
                IF ( @Hierarchy_ID IS NOT NULL ) 
                    BEGIN 
                        IF EXISTS ( SELECT  Hierarchy_ID
                                    FROM    dbo.Hierarchy
                                    WHERE   Hierarchy_ID = @Hierarchy_ID
                                            AND Hierarchy_IsCTS = 1
                                            AND Hierarchy_ID IN (
                                            SELECT  i
                                            FROM    dbo.fn_GetHierarchiesUpperHierarchyID(@senderHierarchyID) ) ) 
                            RETURN @Hierarchy_ID
                        ELSE 
                            SET @Hierarchy_ID = ( SELECT    dbo.[fn_GetCTSHierarchyIDUnderHierarchyIDWithoutTheSenderNode](@Hierarchy_ID,
                                                              @senderHierarchyID)
                                                )
                   
                    END
                FETCH NEXT FROM Hierarchy_ID     INTO @Hierarchy_ID 
                
            END 
        IF EXISTS ( SELECT  Hierarchy_ID
                    FROM    dbo.Hierarchy
                    WHERE   Hierarchy_ID = @Hierarchy_ID
                            AND Hierarchy_IsCTS = 1 ) 
            RETURN @Hierarchy_ID
        ELSE 
            BEGIN
                SET @Hierarchy_ID = NULL
            
            END
        RETURN @Hierarchy_ID
    END



How to increase this Procedure function ?!?

if this not enough to understand please send me a comment and i'll Update

Best Regards
Ab Abulubbad
Posted
Updated 13-Sep-11 22:20pm
v2

The first issue I notice is that you are using a cursor in your function, cursor are simply inefficient and slow.
You will need to convert the function using a recursive query with a CTE (common table expression).
Also what type of data model are using for your hierarchy (adjacency)?
 
Share this answer
 
Comments
imaa2amha 12-Oct-11 9:38am    
Relational model , and how i convert the recursive query with CTE ?
Performance tuning not always has exact answer. But here are some links which may help you in Performance tuning of your T-SQL Queries.

http://msdn.microsoft.com/en-us/library/ms172984%28v=sql.100%29.aspx

http://msdn.microsoft.com/en-us/sqlserver/bb671432
 
Share this answer
 
Comments
imaa2amha 12-Oct-11 9:37am    
thanx

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900