Entity Framework EDMX 强制 DateTime2
Entity Framework EDMX force DateTime2
我正在进行一些数据库优化,我发现我的主要问题之一是使用 "exec sp_executesql" 的某些查询比原始 SQL 慢得多。
我认为这与隐式 datetime/datetime2 转换有关,因为所有慢查询都在比较日期。
在 "exec sp_executesql" 的结尾总是有这样的东西:
)))',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7),@p__linq__2 datetime2(7),@p__linq__3 datetime2(7),@p__linq__4 datetime2(7),@p__linq__5 datetime2(7),@p__linq__6 datetime2(7),@p__linq__7 datetime2(7),@p__linq__8 datetime2(7)',@p__linq__0='2015-01-09 18:52:46.9264744',@p__linq__1='2015-01-09 18:52:16.926',@p__linq__2='2015-01-09 18:52:16.926',@p__linq__3='2015-01-09 18:52:16.926',@p__linq__4='2015-01-09 18:52:16.926',@p__linq__5='2015-01-09 18:52:16.926',@p__linq__6='2015-01-09 18:52:16.926',@p__linq__7='2015-01-09 18:52:16.926',@p__linq__8='2015-01-09 18:52:16.926';
在我的数据库中,.NET DateTime 存储为日期时间。
我的模型是从我的 EDMX 生成的。
这是我的问题,我应该更改所有日期时间字段还是可以避免这种无用的隐式转换?
谢谢!
我可以确认此行为 (EF 6.1.0)。问题是 EF 翻译查询阻止 SQL 服务器使用索引(如果您的 DateTime 列已编入索引)。
示例:
exec sp_executesql N'... WHERE ([Extent1].[Timestamp] >= @p__linq__0) AND ([Extent1].[Timestamp] <= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2014-03-01 0:00:00',@p__linq__1='2015-03-01 0:00:00'
注意查询条件(datetime)和参数数据类型(datetime2)的区别。
一个快速的解决方法是将您的 DateTime 参数声明为可为 null,这会向转换后的查询条件添加一个额外的 CAST,使用索引。
exec sp_executesql N'...WHERE ( CAST( [Extent1].[Timestamp] AS datetime2) >= @p__linq__0) AND ( CAST( [Extent1].[Timestamp] AS datetime2) <= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2014-03-01 0:00:00',@p__linq__1='2015-03-01 0:00:00'
这应该已在 6.1.2 中修复,但还没有时间确认。
我正在进行一些数据库优化,我发现我的主要问题之一是使用 "exec sp_executesql" 的某些查询比原始 SQL 慢得多。 我认为这与隐式 datetime/datetime2 转换有关,因为所有慢查询都在比较日期。
在 "exec sp_executesql" 的结尾总是有这样的东西:
)))',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7),@p__linq__2 datetime2(7),@p__linq__3 datetime2(7),@p__linq__4 datetime2(7),@p__linq__5 datetime2(7),@p__linq__6 datetime2(7),@p__linq__7 datetime2(7),@p__linq__8 datetime2(7)',@p__linq__0='2015-01-09 18:52:46.9264744',@p__linq__1='2015-01-09 18:52:16.926',@p__linq__2='2015-01-09 18:52:16.926',@p__linq__3='2015-01-09 18:52:16.926',@p__linq__4='2015-01-09 18:52:16.926',@p__linq__5='2015-01-09 18:52:16.926',@p__linq__6='2015-01-09 18:52:16.926',@p__linq__7='2015-01-09 18:52:16.926',@p__linq__8='2015-01-09 18:52:16.926';
在我的数据库中,.NET DateTime 存储为日期时间。 我的模型是从我的 EDMX 生成的。
这是我的问题,我应该更改所有日期时间字段还是可以避免这种无用的隐式转换?
谢谢!
我可以确认此行为 (EF 6.1.0)。问题是 EF 翻译查询阻止 SQL 服务器使用索引(如果您的 DateTime 列已编入索引)。 示例:
exec sp_executesql N'... WHERE ([Extent1].[Timestamp] >= @p__linq__0) AND ([Extent1].[Timestamp] <= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2014-03-01 0:00:00',@p__linq__1='2015-03-01 0:00:00'
注意查询条件(datetime)和参数数据类型(datetime2)的区别。
一个快速的解决方法是将您的 DateTime 参数声明为可为 null,这会向转换后的查询条件添加一个额外的 CAST,使用索引。
exec sp_executesql N'...WHERE ( CAST( [Extent1].[Timestamp] AS datetime2) >= @p__linq__0) AND ( CAST( [Extent1].[Timestamp] AS datetime2) <= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2014-03-01 0:00:00',@p__linq__1='2015-03-01 0:00:00'
这应该已在 6.1.2 中修复,但还没有时间确认。