我在搜索字符串字段时遇到了EF创建可怕查询的问题.它以懒惰程序员的风格产生了一个查询,包含空检查,强制扫描整个索引.
考虑以下查询.
查询1
var p1 = "x";
var r1 = ctx.Set<E>().FirstOrDefault(
subject =>
p1.Equals(subject.StringField));
Run Code Online (Sandbox Code Playgroud)查询2
const string p2 = "x";
var r2 = ctx.Set<E>().FirstOrDefault(
subject =>
p2.Equals(subject.StringField));
Run Code Online (Sandbox Code Playgroud)查询1生成
WHERE (('x' = [Extent2].[StringField]) OR (('x' IS NULL) AND ([Extent2].[StringField] IS NULL)))
Run Code Online (Sandbox Code Playgroud)
并在4秒内执行
查询2生成
WHERE (N'x' = [Extent2].[StringField])
Run Code Online (Sandbox Code Playgroud)
并在2毫秒内执行
有谁知道任何工作?(没有参数不能是const,因为它是由用户输入输入的,但不能为null.)
NB在分析时,两个查询都是由EF用sp_executesql编写的; 因为如果它们刚被执行,查询优化器将否定OR'x'IS NULL检查.
数据库管理系统中使用的术语"规范化"和"分区"之间是否有任何区别?我尝试谷歌它,但用简单的话语找不到合适的答案.水平和垂直分区有什么区别?