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查询?

是否可以强制数据库使用正确的执行计划?

SELECT "datetime "string"在EF4 / SQL Server 20

考虑到您正在使用文字值,并且只遇到最近日期字符串的问题,我怀疑您遇到了这里描述的问题,需要调度作业来更新统计数据。

假设上次更新时,满足'20110825'条件的行很少或没有,SQL Server正在使用基于该假设的连接策略