Hi all,when porting and testing code from 2008/2012 to 2014 I noticed that some queries where significantly slower. Digging into it, I found that there is what seems to me a different behavior between the versions.Well it's been a long day and I might be missing something, (no need to be polite ;-) ) but then again, I have written and used this kind of code hundreds of times. To demonstrate, the following code exhausts the NUMBERS CTE, far beyond the length of the character column specified in the filter;[code="sql"]IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE N'#MYTEMP_%' AND TABLE_SCHEMA = N'dbo') DROP TABLE #MYTEMPcreate table #MYTEMP( MYTEMP_ID INT IDENTITY(1,1) NOT NULL ,MYTEMP_STR varchar(50));insert into #MYTEMP(MYTEMP_STR) values ('12345ABCD') ,('23456BCDE') ,('34567CDEF') ,('45678DEFG');;WITH NX(N) AS (SELECT N FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS X(N)),NUMBERS(N) AS( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS N FROM NX N1,NX N2,NX N3 ,NX N4,NX N5,NX N6,NX N7,NX N8)SELECT * ,SUBSTRING(MT.MYTEMP_STR,NM.N,1) AS PARTFROM #MYTEMP MTCROSS APPLY NUMBERS NMWHERE LEN(MT.MYTEMP_STR) <= NM.N[/code]and slightly different flavour[code="sql"][code="sql"]IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE N'#MYTEMP_%' AND TABLE_SCHEMA = N'dbo') DROP TABLE #MYTEMPcreate table #MYTEMP( MYTEMP_ID INT IDENTITY(1,1) NOT NULL ,MYTEMP_STR varchar(50));insert into #MYTEMP(MYTEMP_STR) values ('12345ABCD') ,('23456BCDE') ,('34567CDEF') ,('45678DEFG');;WITH NX(N) AS (SELECT N FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS X(N)),NUMBERS(N) AS( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS N FROM NX N1,NX N2,NX N3 ,NX N4,NX N5,NX N6,NX N7,NX N8)SELECT * ,SUBSTRING(MT.MYTEMP_STR,NM.N,1) AS PARTFROM #MYTEMP MTINNER JOIN NUMBERS NMON LEN(MT.MYTEMP_STR) <= NM.N[/code][/code]and then again, even worse[code="sql"]IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE N'#MYTEMP_%' AND TABLE_SCHEMA = N'dbo') DROP TABLE #MYTEMPcreate table #MYTEMP( MYTEMP_ID INT IDENTITY(1,1) NOT NULL ,MYTEMP_STR varchar(50));insert into #MYTEMP(MYTEMP_STR) values ('12345ABCD') ,('23456BCDE') ,('34567CDEF') ,('45678DEFG');;WITH NX(N) AS (SELECT N FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS X(N)),NUMBERS(N) AS( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS N FROM NX N1,NX N2,NX N3 ,NX N4,NX N5,NX N6,NX N7,NX N8)SELECT * ,SUBSTRING(MT.MYTEMP_STR,NM.N,1) AS PARTFROM #MYTEMP MTINNER JOIN NUMBERS NMON NM.N <= LEN(MT.MYTEMP_STR)[/code]Before jumping to any conclusions, am I doing something wrong or has something changed?Thanks,Eirikur
↧