The query is taking too much time to execute. Ots comparing some condition and then fetching data accordingly.
Please guide me why its happening.
x
DECLARE @Rowcountcnzg int = 0;
DECLARE @countcnzg bigint = (SELECT CASE
WHEN COUNT(*) >= 100000 THEN COUNT(*) / @BatchSize
WHEN (COUNT(*) > 10000
AND COUNT(*) < 100000) THEN COUNT(*) / 10000
ELSE COUNT(*)
END
FROM i_hold_sap_stock ss WITH (NOLOCK)
JOIN tea_item ti ON ss.upload_tea_item = ti.tea_item
AND ss.upload_revision = ti.revision
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp1 ON ocdp1.origin = ti.origin
AND ocdp1.stock_type = ss.upload_stock_type
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp2 ON ocdp2.origin = ti.origin
AND ocdp2.stock_type = ''
WHERE Date_Loaded = @MaxDateLoaded
AND conv_zgport_ship = 'NULL');
WHILE (@Rowcountcnzg < @countcnzg + 1)
BEGIN
UPDATE TOP (@BatchSize)
ss
SET conv_zgport_ship = ISNULL(ISNULL(ocdp1.default_origin_location, ocdp2.default_origin_location), 'NULL')
FROM i_hold_sap_stock ss
JOIN tea_item ti ON ss.upload_tea_item = ti.tea_item
AND ss.upload_revision = ti.revision
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp1 ON ocdp1.origin = ti.origin
AND ocdp1.stock_type = ss.upload_stock_type
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp2 ON ocdp2.origin = ti.origin
AND ocdp2.stock_type = ''
WHERE Date_Loaded = @MaxDateLoaded
AND (conv_zgport_ship = 'NULL'
OR conv_zgport_ship = NULL)
OPTION (MAXDOP 4);
SET @Rowcountcnzg = @Rowcountcnzg + 1;
END;
How i calculate batch Size
DECLARE @Rowcount INT = 0;
DECLARE @rowstr nvarchar(100);
DECLARE @BatchSize INT = 500000;
DECLARE @CountECC INT = ( Select CASE when Count(*) >= 100000 THEN count(*)/@BatchSize
When (Count(*) > 10000 and Count(*) < 100000) THEN count(*)/10000
ELSE count(*) END
FROM i_hold_sap_stock WITH (NOLOCK) JOIN mdata_mixing_unit mu
WITH (NOLOCK) ON (SELECT max(output_code)
FROM [dbo].[map_codes] WITH(NOLOCK)
WHERE UPPER(input_code) = UPPER(upload_mixing_unit)
AND UPPER(mapping_type) = UPPER( 'STOCK_PLANTTOMIX')
AND site_id = 0
AND UPPER(fa_area) = UPPER('TEACONNECT')) = mu.mixing_unit WHERE Date_Loaded=@MaxDateLoaded)
WHILE (@Rowcount < (@CountECC+1))
BEGIN
UPDATE TOP (@BatchSize) i_hold_sap_stock SET conv_mixing_unit = mu.mixing_unit,site_id = mu.site_id
FROM i_hold_sap_stock WITH (NOLOCK)
INNER JOIN mdata_mixing_unit mu WITH (NOLOCK)
ON (SELECT max(output_code)
FROM [dbo].[map_codes] WITH(NOLOCK)
WHERE UPPER(input_code) = UPPER(upload_mixing_unit)
AND UPPER(mapping_type) = UPPER( 'STOCK_PLANTTOMIX')
AND site_id = 0
AND UPPER(fa_area) = UPPER('TEACONNECT')
) = mu.mixing_unit
WHERE Date_Loaded=@MaxDateLoaded
OPTION(MAXDOP 4)
SET @Rowcount = @Rowcount+1;
SET @rowstr = CAST(@Rowcount as nvarchar)
RAISERROR(@rowstr, 0, 1) WITH NOWAIT
END
This is my query don’t why its taking too much time to execute. In one SP there are lot of SP But in this SP i am getting more time what should i modify in this please guide me.
Advertisement
Answer
You can try the below query
You are making batches for records greater than 10000, but say if your records are 9999, then your loop goes for 9999 iterations unnecesarilly.
declare @countRecords bigint=(SELECT count(*)
FROM i_hold_sap_stock ss WITH (NOLOCK)
JOIN tea_item ti ON ss.upload_tea_item = ti.tea_item
AND ss.upload_revision = ti.revision
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp1 ON ocdp1.origin = ti.origin
AND ocdp1.stock_type = ss.upload_stock_type
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp2 ON ocdp2.origin = ti.origin
AND ocdp2.stock_type = ''
WHERE Date_Loaded = @MaxDateLoaded
AND conv_zgport_ship = 'NULL');
DECLARE @Rowcountcnzg int = 0;
DECLARE @countcnzg bigint = (SELECT CASE
WHEN @countRecords >= 100000 THEN @countRecords / @BatchSize
WHEN (@countRecords > 10000
AND @countRecords < 100000) THEN @countRecords / 10000
ELSE @countRecords/@countRecords END)
IF(@countRecords<10000)
set @BatchSize=@countRecords
WHILE (@Rowcountcnzg < @countcnzg + 1)
BEGIN
UPDATE TOP (@BatchSize)
ss
SET conv_zgport_ship = ISNULL(ISNULL(ocdp1.default_origin_location, ocdp2.default_origin_location), 'NULL')
FROM i_hold_sap_stock ss
JOIN tea_item ti ON ss.upload_tea_item = ti.tea_item
AND ss.upload_revision = ti.revision
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp1 ON ocdp1.origin = ti.origin
AND ocdp1.stock_type = ss.upload_stock_type
LEFT OUTER JOIN mdata_origin_channel_default_port ocdp2 ON ocdp2.origin = ti.origin
AND ocdp2.stock_type = ''
WHERE Date_Loaded = @MaxDateLoaded
AND (conv_zgport_ship = 'NULL'
OR conv_zgport_ship = NULL)
OPTION (MAXDOP 4);
SET @Rowcountcnzg = @Rowcountcnzg + 1;
END;