我正在查询实体数据模型(.NET 4.0),并且在本地运行时与从我们的开发服务器运行时得到截然不同的结果。本地查询需要10秒,但在开发服务器上需要7分钟。这两种环境都在同一个SQL 2005数据库中(即完全相同的连接字符串)。
我看了一下生成的底层SQL,发现它对于这两种环境来说是不同的。由dev服务器上的代码生成的查询具有一些额外的子查询,这些子查询导致了dramtic slowdown。那么是什么会导致每个环境的SQL代码生成器为同一个查询生成不同的结果呢?
更新 - (删除旧样本,因为它具有误导性)
我找到了缓慢的原因,但我仍然不明白为什么针对同一数据库运行的相同代码库会产生两个不同的SQL查询。
当我在本地运行代码时,我的查询中的所有常量字符串都作为普通字符串放在SQL查询字符串中。当我在服务器上运行相同的代码时,生成的SQL会将我的字符串转换为Unicode字符串:
在本地生成:
WHERE('DENY'<> [Extent1]。[status])
在服务器上生成:
在哪里(N'DENY'<> [Extent1]。[status])
在字符串上添加和删除Unicode的“N”表示法会显着改变执行时间。所以现在我知道为什么查询很慢,但我仍然不知道为什么服务器上的SQL代码生成器使这些字符串成为Unicode,但是当在本地运行时它不是。我检查了实体数据模型,“status”列的Unicode属性设置为False,所以我不知道为什么查询会转换为Unicode。