SQLTeam.com | Weblogs | Forums

When execute query it take too long time so how to enhance performance?

I work on sql server 2019 i face issue i can't reduce high cost of sort it reach to 86 percent
so How to reduce it please
additionally it take too much time to execute it .
it take 6:06 minutes
execution plan as below :slight_smile:
execution plan
statment that make issue

 select a.RecomendationId,cast(STRING_AGG(cast(f1.FeatureValue as varchar(300)) ,'|')  WITHIN GROUP(ORDER BY f1.FeatureId ASC)as varchar(300))  AS DiffFeatures into ExtractReports.dbo.TechnologyOriginalFeaturesEqual from extractreports.dbo.partsrecomendationActive a with(nolock)
 inner join ExtractReports.dbo.TechnologyPlPartsFeaturValuesOrg f1 with(nolock) on f1.partid=a.OrignalPartId
 inner join [Technology].Receipe Ft WITH(NOLOCK) on ft.featureid=f1.featureid and ft.operatorid=1
 group by a.RecomendationId

statment that make issue

statment execution take too much time to execute
ddl with indexes

create table ExtractReports.dbo.TechnologyPlPartsFeaturValuesOrg
       (
       ID int identity(1,1),
       PartId int,
       FeatureID int,
       FeatureName varchar(200),
       FeatureValue varchar(200)
       )
    
       ALTER TABLE ExtractReports.dbo.TechnologyPlPartsFeaturValuesOrg
 ADD CONSTRAINT PK_TechnologyPlPartsFeaturValuesOrg PRIMARY KEY (ID);
 create index partidoriginalParts_ix on ExtractReports.dbo.TechnologyPlPartsFeaturValuesOrg(partid)
 create index FlagRecomendationorg_ix on ExtractReports.dbo.TechnologyPlPartsFeaturValuesOrg(featureid,FeatureValue)include(partid)
    
 create table extractreports.dbo.partsrecomendationActive
 (
 RecomendationId int identity(1,1),
 RecomendationPartId int,
 OrignalPartId int
    
 )
    
 create clustered index recomendations_ix on extractreports.dbo.partsrecomendationActive(RecomendationId)
    
 create nonclustered index recomendationsparts_ix on extractreports.dbo.partsrecomendationActive(RecomendationPartId)
    
 create nonclustered index recomendationsoriginal_ix on extractreports.dbo.partsrecomendationActive(OrignalPartId)
    
 CREATE TABLE [Technology].[Receipe](
     [ReceipeID] [int] IDENTITY(1,1) NOT NULL,
     [PLID] [int] NULL,
     [FeatureID] [int] NULL,
     [OperatorID] [int] NULL,
     [FeatureTypeID] [int] NULL,
 PRIMARY KEY CLUSTERED 
 (
     [ReceipeID] ASC
 ))

You have no WHERE clause - so all rows are being returned, and that appears to be more than 65,000,000 rows. The end result is more than 13,000,000 rows inserted with STRING_AGG used to create a column with a list of features for each recommendation.

The sort isn't the real issue here - the issue is why are you creating a pipe-delimited column of features that are sorted in any particular order and then inserting that into another table?

The outer CAST isn't needed - and the inner cast may not be needed depending on the actual data type for the column FeatureId.

I strongly suspect that it also contains a couple of "accidental Cross Joins". I gave the OP a pair of queries to run on another site where he posted this identical problem.

thanks much for support
can you show me how to do that by cross join