У нас есть пара миллионов строк данных, которые нам нужно «взорвать», добавив по одной строке для каждой даты между датой начального_отряда и датой оконченного_порядка. Цикл while - это то, что занимает больше всего времени в нашем запросе.
Есть идеи, как оптимизировать или заменить его?
IF (OBJECT_ID('TempDb..#exploded_services') IS NOT NULL)
DROP TABLE #exploded_services;
CREATE TABLE #exploded_services
(
target_date date,
move_id varchar(30),
initiation_id varchar(30),
initiated_at date,
booked_at date,
transferee varchar(60),
account_id varchar(30),
mc_id varchar(30),
po varchar(60),
weight int,
service varchar(150),
started_at date,
ended_at date,
location_id nvarchar(64),
description varchar(max),
provider varchar(max),
mode varchar(60),
origin_location_id nvarchar(64),
destination_location_id nvarchar(64),
transferee_phone varchar(40),
transferee_email varchar(100),
status varchar(10),
ordinal int
);
WHILE (@pointer <= @end_date)
BEGIN
INSERT INTO #exploded_services
SELECT
@pointer,
svcs.*
FROM #Services svcs
WHERE @pointer BETWEEN svcs.started_at AND COALESCE(svcs.ended_at,@end_date)
SET @pointer = DATEADD(dd, 1, @pointer)
END;