根据定义(至少从我所看到的意义上),可精简意味着查询能够使查询引擎优化查询所使用的执行计划。我尝试查找答案,但是在主题上似乎没有很多。所以问题是,什么使SQL查询可持久化?任何文件将不胜感激。
供参考:SARGable
根据定义(至少从我所看到的意义上),可精简意味着查询能够使查询引擎优化查询所使用的执行计划。我尝试查找答案,但是在主题上似乎没有很多。所以问题是,什么使SQL查询可持久化?任何文件将不胜感激。
供参考:SARGable
Answers:
使查询不可更改的最常见的事情是在where子句的函数内部包括一个字段:
SELECT ... FROM ...
WHERE Year(myDate) = 2008
SQL优化器无法在myDate上使用索引,即使存在索引也是如此。从字面上看,它必须为表的每一行评估此功能。更好地使用:
WHERE myDate >= '01-01-2008' AND myDate < '01-01-2009'
其他一些例子:
Bad: Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
Fixed: Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
Bad: Select ... WHERE SUBSTRING(DealerName,4) = 'Ford'
Fixed: Select ... WHERE DealerName Like 'Ford%'
Bad: Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30
Fixed: Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate())
GROUP BY
会导致查询不可修改吗?
WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
是SELECT... FROM ... WHERE FullName = 'Ed Jones' UNION SELECT...FROM...WHERE FullName IS NULL
?曾经有一个优化专家告诉我,在where子句中使用OR可以取消查询的参数..?
Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
和之间没有执行计划差异Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
。他们都使用FullName上的索引并进行索引查找。
不要这样做:
WHERE Field LIKE '%blah%'
这会导致表/索引扫描,因为LIKE值以通配符开头。
不要这样做:
WHERE FUNCTION(Field) = 'BLAH'
这将导致表/索引扫描。
数据库服务器将不得不针对表中的每一行评估FUNCTION(),然后将其与“ BLAH”进行比较。
如果可能,请反向执行:
WHERE Field = INVERSE_FUNCTION('BLAH')
这将对参数运行一次INVERSE_FUNCTION(),并且仍然允许使用索引。