Home > database >  SQL Query taking a long time to run for result
SQL Query taking a long time to run for result

Time:03-22

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

CodePudding user response:

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.

  • Related