SELECT "datetime "string"在EF4 / SQL Server 20
本文关键字:quot SQL Server string datetime SELECT EF4 | 更新日期: 2023-09-27 18:07:26
我正在使用EntityFramework 4访问SQL Server 2008数据库。
EF生成的一个SQL查询有一个我无法解释的行为。查询如下:
SELECT tableA.field1, tableA.field2, ...
FROM tableA join tableB on tableA.field1 = tableB.field1
WHERE
tableA.field2 > '20110825'
and tableA.field3 in ('a', 'b', 'c,')
and tableB.field4 = 'xxx'
为多。field2是datetime not null
,其他字段是varchars。tableA包含大约150万条记录,tableB包含大约200万条记录,查询返回1877行。
问题是,它在86秒内返回它们,当我将'20110825'字面量更改为旧值时,时间发生了巨大变化。
例如,如果我输入'20110725',查询将在35毫秒内返回3483行。
我在执行计划中发现,两者之间的差异在于SQL Server根据用于比较的日期选择使用的索引。
正在计时,执行计划显示:
- 50%:在表a上查找索引。field2(这是一个聚集索引在这个字段单独)
- 50%:在表b上查找索引。field1(非唯一的,非聚集索引)
- 0%:加入
当几乎是即时执行时,执行计划显示:
- 98%:在表a上查找索引。field1(非唯一的,非聚集索引)
- 2%:在表b上查找索引。field1(非唯一的,非聚集索引)
- 0%:加入
所以在我看来,优化器在tableA上使用聚集索引的决定。Field2不是最优的。
数据库设计有缺陷吗?在SQL查询?
是否可以强制数据库使用正确的执行计划?
考虑到您正在使用文字值,并且只遇到最近日期字符串的问题,我怀疑您遇到了这里描述的问题,需要调度作业来更新统计数据。
'20110825'
条件的行很少或没有,SQL Server正在使用基于该假设的连接策略