Ad

SQL Query Taking A Long Time To Run For Result

- 1 answer

WITH
cust AS
    (SELECT DISTINCT
            C.swCustomerId AS EnduserId,
            A.AssetID AS asset,
            suite.ctName AS Product
     FROM ReplicaCADS.dbo.TransactionHeader TH WITH (NOLOCK)
          INNER JOIN ReplicaCRMDB.dbo.SW_CUSTOMER C WITH (NOLOCK) ON C.swCustomerId = TH.EndUserCustomerId
          INNER JOIN ReplicaCADS.dbo.Asset A WITH (NOLOCK) ON TH.TransactionId = A.TransactionId
                                                          AND A.Status = 'Active'
          INNER JOIN ReplicaCADS.dbo.AssetComponent AC WITH (NOLOCK) ON AC.AssetId = A.AssetId
                                                                    AND AC.PrimaryFlag = 1
                                                                    AND AC.Status = 'Active'
          INNER JOIN ReplicaCADS.dbo.MaintenanceProgram MP WITH (NOLOCK) ON MP.AssetId = A.AssetId
                                                                        AND IsLatest = 1
                                                                        AND MP.Status = 'Active'
                                                                        AND MP.EndDate <> '2099-12-31 00:00:00.000'
                                                                        AND MP.MaintenanceType = 'Core'
          INNER JOIN ReplicaCRMDB.dbo.[ct_Product_Suite] suite WITH (NOLOCK) ON suite.ctSuiteID = A.ProductSuiteID
                                                                            AND suite.cTName LIKE 'DaaS'
          INNER JOIN Salesforce.[dbo].[Apttus__APTS_Agreement__c] agr ON agr.Vantive_Org_ID__c = C.ctOrgId
                                                                     AND Apttus__Status__c = 'Activated'
                                                                     AND Agreement_Type__c = 'Licensing'
                                                                     AND agr.Account_Geo__c LIKE 'APAC'
     WHERE NOT EXISTS (SELECT 1
                       FROM salesforce..Priority_Customer__c pr
                       WHERE pr.Account_Org_Id__c = C.CtOrgId)
       AND NOT EXISTS (SELECT 1
                       FROM ReplicaTransactionData..[Transaction] TN
                       WHERE TN.CustomerId = C.swCustomerId
                         AND Status = 'Pending'
                         AND QuoteType IS NULL)
       AND NOT EXISTS (SELECT 1
                       FROM [Salesforce]..Large_Customer__c LDC
                       WHERE LDC.Org_ID__c = C.ctOrgId)
       AND NOT EXISTS (SELECT 1
                       FROM [Salesforce].dbo.Account sac
                       WHERE sac.Org_ID__C = C.ctOrgId
                         AND High_Touch_Account__C = 'true')
       AND NOT EXISTS (SELECT 1
                       FROM salesforce..Priority_Customer__c pr
                       WHERE pr.Account_Org_Id__c = C.ctOrgId)
       AND NOT EXISTS (SELECT 1
                       FROM Salesforce..Asset_Maintenance_Program__c
                       WHERE frmAccount_Org_ID__c = C.ctOrgId
                         AND Maintenance_Type__c IN ('Advanced'))
       AND EXISTS (SELECT 1
                   FROM ReplicaCADS..AssetpricingData AP
                   WHERE AP.AssetId = A.AssetId))
SELECT TOP 1
       P.swLogin AS LoginId
FROM cust
     INNER JOIN ReplicaCRMDB.dbo.SW_PERSON P WITH (NOLOCK) ON P.swCustomerId = EnduserId
                                                          AND P.swStatus = 'Current'
                                                          AND SWLogin IS NOT NULL
                                                          AND P.ctLocale = 'en-US'
     INNER JOIN ReplicaCRMDB.dbo.CT_CONTACT_TYPE Contact WITH (NOLOCK) ON Contact.swContactId = P.swPersonId
     INNER JOIN ReplicaCRMDB.dbo.CT_MC_USERS MCUsers ON MCUsers.swPersonID = P.swPersonId
                                                    AND (MCUsers.ctPassword = '32CA9FC1A0F5B6330E3F4C8C1BBECDE9BEDB9573'
                                                      OR MCUsers.ctPassword = '')
ORDER BY NEWID();

When trying to use both the below condition together its taking a long time

AND NOT EXISTS (SELECT 1
                  FROM Salesforce..Asset_Maintenance_Program__c
                  WHERE frmAccount_Org_ID__c = C.ctOrgId
                    AND Maintenance_Type__c IN ('Advanced'))
AND EXISTS (SELECT 1
            FROM ReplicaCADS..AssetpricingData AP
            WHERE AP.AssetId = A.AssetId)

Can you please help me in someway tweaking the above query to get the result in quick time

Ad

Answer

This can be massively helped by understanding how SQL works. But I would recommend that you remove most of the text fields in the joins, and using their int values instead that I suppose exist.

For instance - High_Touch_Account__C = 'true', this should probably be stored as a BIT inside of the DB, and as such, 1 or 0 would be the way to go, not 'true'. Similarily the Status = 'Active' should probably be replaced with using the int value for 'Active'.

Regarding the and not exists, I would probably create a temporary table at the start that gathers all of the things that you do not want in there, then simply do a left join and then "where join is null" basically. This could replace 25% of your code.

NOLOCK might also be something that you should look into.

If you upload the files with the data, It would be easier however to give you a reply on the most optimal way to do this, but as it sits, we've got no idea of what data exists.

Ad
source: stackoverflow.com
Ad