Sample Header Ad - 728x90

Is "+" slower than "CONCAT" for large strings?

23 votes
1 answer
5895 views
I have always thought that CONCAT function is actually a wrapper over the + (String Concatenation) with some additional checks in order to make our life more easier. I have not found any internal details about how the functions are implemented. As to the performance, it seems that there is overhead for calling CONCAT when data is concatenating in a loop (which seems normal as there are additional handles for NULLs). Few days ago, a dev modified some string concatenation code (from + to CONCAT) because did not like the syntax and told me it became faster. In order to check the case, I have used the following code: DECLARE @V1 NVARCHAR(MAX) ,@V2 NVARCHAR(MAX) ,@V3 NVARCHAR(MAX); DECLARE @R NVARCHAR(MAX); SELECT @V1 = REPLICATE(CAST('V1' AS NVARCHAR(MAX)), 50000000) ,@V2 = REPLICATE(CAST('V2' AS NVARCHAR(MAX)), 50000000) ,@V3 = REPLICATE(CAST('V3' AS NVARCHAR(MAX)), 50000000); where this is variant one: SELECT @R = CAST('' AS NVARCHAR(MAX)) + '{some small text}' + ISNULL(@V1, '{}') + ISNULL(@V2, '{}') + ISNULL(@V3, '{}'); SELECT LEN(@R); -- 1200000017 and this is variant two: SELECT @R = CONCAT('{some small text}',ISNULL(@V1, '{}'), ISNULL(@V2, '{}'), ISNULL(@V3, '{}')) SELECT LEN(@R); -- 1200000017 For smaller strings, there is no differences. At some point, the CONCAT variant becomes faster: enter image description here I wonder if someone can share any internals or explains the behavior as it seems that there might be a rule that it's better to concatenate large strings using CONCAT. Version: *Microsoft SQL Server 2022 (RTM-CU8) (KB5029666) - 16.0.4075.1 (X64) Aug 23 2023 14:04:50 Copyright (C) 2022 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 (Build 17763: ) (Hypervisor)* ---------- The exact script looks like the following: DECLARE @V1 NVARCHAR(MAX) ,@V2 NVARCHAR(MAX) ,@V3 NVARCHAR(MAX); DECLARE @R NVARCHAR(MAX); SELECT @V1 = REPLICATE(CAST('V1' AS NVARCHAR(MAX)), 50000000) ,@V2 = REPLICATE(CAST('V2' AS NVARCHAR(MAX)), 50000000) ,@V3 = REPLICATE(CAST('V3' AS NVARCHAR(MAX)), 50000000); --SELECT @R = CAST('' AS NVARCHAR(MAX)) + '{some small text}' + ISNULL(@V1, '{}') + ISNULL(@V2, '{}') + ISNULL(@V3, '{}'); -- 00:00:45 -- 00:01:22 -- 00:01:20 --SELECT LEN(@R); -- 300000017 SELECT @R = CONCAT('{some small text}',ISNULL(@V1, '{}'), ISNULL(@V2, '{}'), ISNULL(@V3, '{}')) -- 00:00:11 -- 00:00:16 -- 00:00:10 SELECT LEN(@R); -- 300000017 where I am changing the last argument of the REPLICATE functions in order to generate larger strings for the concatenation. Then, I am executing each variant three times.
Asked by gotqn (4348 rep)
Dec 28, 2023, 10:12 AM
Last activity: Dec 30, 2023, 11:18 AM