asql ha scritto:
...utilizziamo una generazione lineare basata su sys.all_columns (che sulla versione 2019 di SQL Server produce 11k righe)...
se hai gia' a disposizione, come spesso succede, una tabella di "Numeri" puri sequenziale, puoi usare quella al suo posto...
E se eventualmente si utilizzasse un ricorsiva per generare la progressione?
DECLARE @max as int
DECLARE @t TABLE (
Id int NOT NULL,
Data varchar(5) NOT NULL,
Qt int NOT NULL
);
INSERT INTO @t
VALUES (1, 'a', 1), (2, 'b', 2), (3, 'c', 3);
SET @max = (SELECT MAX(qt) FROM @t);
WITH cte AS(
SELECT 1 as num
UNION ALL
SELECT num + 1 as num FROM cte Where num < @max
)
Select *
from cte
Cross JOIN @t T
Where T.Qt >= cte.num
Order By T.Id
OPTION (MAXRECURSION 1000);
Onestamente i piani di esecuzione sono una bestia che sto ancora studiando e quindi chiedo...
Utilizzando il codice di @asql, ho come costi relativi ai batch:
- per Query 1 (INSERT INTO ...) ->16%;
- per Query 2 (WITH cte AS ...) -> 84%;
Con il mio ho:
- per Query 1 (INSERT INTO ...) -> 36%;
- per Query 2 (SET @max ...) -> 12%;
- per Query 3 (WITH cte AS ...) -> 53%.
Partendo dal presupposto che il batch per l'INSERT è identico in entrambi i casi, e vedendo l'incidenza calcolata sul costo totale, posso dedurne che una cte ricorsiva in questo caso è più efficiente?