【发布时间】:2009-11-04 22:51:22
【问题描述】:
我有一种情况,即针对数百万行表运行的某个 linq 查询需要很长时间才能运行。我剖析了 linq 查询输出,发现它使用错误的数据类型为 where 子句创建参数。例如,一个字段在数据库中被定义为 Char(12),但它与之比较的参数被声明为 NVarChar(12)。一旦我将查询更改为使用 Char 而不是 NVarChar,它就会按应有的方式运行亚秒级。有没有办法让 linq to sql 使用 .dbml 文件中为该列定义的正确数据类型?我仔细检查并在数据上下文 .dbml 文件中将其定义为 DbType="Char(12)"。
【问题讨论】:
-
我想知道你是否有一个糟糕的缓存执行计划,因为 nvarchar(12) 和 char(12) 不应该有很大的不同。至少我认为他们不应该这样做。
-
经过相当多的测试,它确实做到了。我在每次运行之前清除了查询缓存,仅通过更改数据类型,它就从 4 秒缩短到了 20 毫秒。我什至将我的 linq to sql 调用转换为一个普通的旧 sql 查询,并使用数据上下文的 .ExecuteQuery() 方法来运行它,它运行得很快。这绝对是导致 SQL 忽略表上的索引的数据类型转换问题。
标签: sql-server linq-to-sql parameters types