如何在SQLServer2008R2中提高从字符串中提取日期和时间的性能?
我正在使用SQL 2008数据库执行一项数据迁移任务(SSIS),在该任务中,我必须从字符串中提取日期和时间,并将其转换为日期时间数据类型字段,以便以后能够插入到表中 我在查询中使用的数据库中保存了一个SQL函数,它正确地解析字符串以输出正确的结果。唯一的主要问题是,查询大约需要一个半小时才能获得120000条记录。如果可以,请指出正确的方向,以确定是否需要更正查询或函数以显著提高性能 我使用字符串解析函数(fnExtradateTimeFromString)的查询是 在FnExtradDateTimeFromString函数中,我使用2个表变量来存储日期和时间格式的所有模式,然后使用patindex稍后连接日期和时间的字符串,并连接到日期时间字段。这是300多行函数,我不知道我可以粘贴在这里 字符串的一个示例是“User appt:7/27/94@10:30AM”,日期为1994年7月27日,时间为10:30。这些是用户输入字符串,因此它们在空格和分隔字符方面非常不一致。如何在SQLServer2008R2中提高从字符串中提取日期和时间的性能?,sql,sql-server,tsql,date,parsing,Sql,Sql Server,Tsql,Date,Parsing,我正在使用SQL 2008数据库执行一项数据迁移任务(SSIS),在该任务中,我必须从字符串中提取日期和时间,并将其转换为日期时间数据类型字段,以便以后能够插入到表中 我在查询中使用的数据库中保存了一个SQL函数,它正确地解析字符串以输出正确的结果。唯一的主要问题是,查询大约需要一个半小时才能获得120000条记录。如果可以,请指出正确的方向,以确定是否需要更正查询或函数以显著提高性能 我使用字符串解析函数(fnExtradateTimeFromString)的查询是 在FnExtradDate
正如@Shnugo所指出的,您正在为每行多次调用此“昂贵”函数 要确保只进行一次调用,请使用子查询:
select
case when NoteDate is null then CAST('2000-01-01 00:00:00.000' as datetime)
when NoteDate = CAST('1900-01-01' as date) then NoteDate + CAST('2000-01-01 00:00:00.000' as datetime)
else NoteDate
end as NoteDate,
UsersNotes
from
( select
dbo.fnExtrDateTimeFromString(NoteList.Item) as NoteDate,
CAST(LTRIM(RTRIM(NoteList.Item)) as text) as UsersNotes
from UserNotes
cross apply convDelimitedSplit(UserNotes.NoteText,',') as NoteList
where LEN(ISNULL(UserNotes.Notes,'')) > 0 ) as a
注意:text
数据类型已弃用,应使用VARCHAR(MAX)
如果这个日期分割功能是性能瓶颈,那么它应该是性能的两倍/三倍
读得好:正如@Shnugo所指出的,您正在为每一行多次调用这个“昂贵”函数 要确保只进行一次调用,请使用子查询:
select
case when NoteDate is null then CAST('2000-01-01 00:00:00.000' as datetime)
when NoteDate = CAST('1900-01-01' as date) then NoteDate + CAST('2000-01-01 00:00:00.000' as datetime)
else NoteDate
end as NoteDate,
UsersNotes
from
( select
dbo.fnExtrDateTimeFromString(NoteList.Item) as NoteDate,
CAST(LTRIM(RTRIM(NoteList.Item)) as text) as UsersNotes
from UserNotes
cross apply convDelimitedSplit(UserNotes.NoteText,',') as NoteList
where LEN(ISNULL(UserNotes.Notes,'')) > 0 ) as a
注意:text
数据类型已弃用,应使用VARCHAR(MAX)
如果这个日期分割功能是性能瓶颈,那么它应该是性能的两倍/三倍
良好的阅读:
请发布您的查询计划并考虑DBA站点,如果我得到正确的结果,就会有一个列“代码> USENotes。NoTeTeX</代码>带有一个逗号分隔的注释列表。您可以调用交叉应用
来实现拆分器功能。然后多次使用标量函数来提取所需的值。首先显示:请显示昂贵的代码(拆分器和den标量函数),第二:请提供cosumable(复制和粘贴)格式的示例数据。最好的方法是,这不是您应该在数据库中执行的操作。这个日期应该在客户端应用程序中解析,并作为一个不同的参数发送到SQL Server。FY:<代码>文本< /代码>数据类型被禁止,您应该使用<代码> VARCHAR(MAX)< /代码>请发布您的查询计划并考虑DBA站点,如果我得到这个正确的话,有一列UserNotes.NoteText
,其中包含以逗号分隔的注释列表。您可以调用交叉应用
来实现拆分器功能。然后多次使用标量函数来提取所需的值。首先显示:请显示昂贵的代码(拆分器和den标量函数),第二:请提供cosumable(复制和粘贴)格式的示例数据。最好的方法是,这不是您应该在数据库中执行的操作。应在客户端应用程序中解析此日期,并将其作为其他参数发送到SQL server中。仅供参考:text
数据类型已弃用,您应使用VARCHAR(MAX)
感谢@Alex和@Shnugo指出代码中的缺陷,并解释性能不佳的原因。将函数调用放入子查询将运行时间缩短为原始时间的一半,我正在学习有关如何在列列表和where
子句中调用标量函数效率低下的新信息。感谢@Alex和@Shnugo指出代码中的缺陷并解释性能不佳的原因。将函数调用放入子查询将运行时间缩短为原始时间的一半,我正在学习有关如何在列列表和where
子句中调用标量函数效率低下的新信息。