Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入查询优化-SQL Server_C#_Sql_Sql Server - Fatal编程技术网

C# 插入查询优化-SQL Server

C# 插入查询优化-SQL Server,c#,sql,sql-server,C#,Sql,Sql Server,我正在使用一个ASP.NET MVC3应用程序,我有一个公交行程数据库表,其中列出了公交行程的开始和结束日期以及运营天数。下面是一个片段: JourneyID StartDate EndDate Monday Tuesday Wednesday etc 676 02 Jan 2012 01 Mar 2012 True False True etc 696 02 Jan 2012 01 Mar 2012 False

我正在使用一个ASP.NET MVC3应用程序,我有一个公交行程数据库表,其中列出了公交行程的开始和结束日期以及运营天数。下面是一个片段:

JourneyID   StartDate   EndDate     Monday  Tuesday Wednesday   etc
676         02 Jan 2012 01 Mar 2012 True    False   True        etc
696         02 Jan 2012 01 Mar 2012 False   False   True        etc
650         02 Jan 2012 25 Mar 2012 True    True    True        etc
因此,如果2012年1月2日的日期是星期一,并且星期一设置为true,那么这一天有一段旅程

我试图在它们运行的每一天将它们插入到一个新的表行中,这样就会变成:

JourneyID   Date
676         02 Jan 2012
676         04 Jan 2012
696         04 Jan 2012
650         02 Jan 2012
650         03 Jan 2012
目前在系统上执行此操作的查询速度非常慢—它在t-sql中使用嵌套while循环。C语言也有一个版本,但速度稍微慢一点——虽然它使用了类似的过程,但它使用了嵌套循环过程,然后保存了要插入到通用列表中的项,然后批量插入它们

当前正在使用的流程在每个旅程中循环,并且在每个旅程中循环开始日期和结束日期之间的每个日期,以检查它发生在哪一天,以及该天是否设置为true。这可能需要很长时间才能执行


有人能想出一种更有效的方法来执行此插入吗?目前,它每小时可以循环大约100000次行程,但可能有数百万次行程,因此可能需要很长时间。

实际上,您正在取消激励,然后进行过滤

;with cte as
(
    select JourneyID, StartDate,EndDate,Days
    from yourtable s unpivot (active for days in (Monday, tuesday, wednesday, ...)) u
    where active = 1
)
    select JourneyID, JourneyDate
    from (
        select 
            DATEADD(D, number, (Select MIN(startdate) from cte)) as JourneyDate
        from master..spt_values 
        where type='p' 
        and number < (select datediff(d,MIN(StartDate),max(enddate)) from cte)
    ) numbers
        cross join cte
    where 
        days = datename(weekday, JourneyDate) 
        and JourneyDatebetween StartDate and EndDate
    order by JourneyDate, JourneyID

创建一个日历表并加入它。一周中的哪一天比较棘手,因为周一、周二等都要安排餐桌。。如果将巡更运行的天数标准化并提取到一个子表中,则会容易得多

通过这种设置,您可以编写如下查询:

INSERT INTO NewTable (Journey, Date)
SELECT J.JourneyId, C.Date FROM Journey J
INNER JOIN JourneyWeekdays JW ON J.Id = JW.JourneyId
INNER JOIN Calendar C ON (C.Date BETWEEN JT.StartDate AND JT.EndDate) AND C.DayOfWeek = JW.DayOfWeek

有了适当的索引,这应该会产生良好的性能。

嗨,帕迪卢斯卡,在我问了这个问题之后,我就被取消了这个项目。我刚刚回来尝试你的答案,效果非常好。正是我想要的,谢谢你: