更改SQL查询以显式控制执行序列

时间:2016-09-15 01:34:05

标签: sql sql-server database-performance

说我有疑问:

SELECT * FROM tb1
WHERE col1 = 1
 AND col2 = 2

假设col1更具选择性,引擎通常会首先执行col1 = 1以获得更好的性能。如果条件变得更复杂,引擎可能容易做出错误的决定。所以我想明确地控制执行顺序,我该怎么做呢?

我想有一种方法可行。首先查询

SELECT * FROM tb1
WHERE col1 = 1

将结果选择到临时表中,然后按col2 = 2过滤,但随着条件越来越多,当然不可能创建如此多的临时表。有什么想法吗?

更新1

人们说优化器总是先决定应该首先执行哪个过滤器以获得更好的性能,但我仍然怀疑它可以在100%的时间内工作,因为查询变得更大,更复杂。

另一个问题,我可以通过子查询或CTE更改执行顺序吗?像:

SELECT * FROM 
(
   SELECT * FROM tb1 WHERE col1 = 1
)t
WHERE col2 = 2

2 个答案:

答案 0 :(得分:0)

通常,SQL Optimizer可以找到更好的计划,但如果你想修复它,可以选择......

您可以创建一个SQL引擎选择正确(所需)计划的测试数据集,然后您可以将查询计划提取到XML字符串(请参阅SET SHOWPLAN_XML ON )最后使用WITH PLAN选项(查询提示)来修复计划。

请记住,如果您在未更新计划的情况下更改架构,查询将失败。

答案 1 :(得分:0)

要实现此目的,您应该使用查询提示。

  1. 您可以使用USE PLAN查询提示。
  2. 使用为特定行顺序创建的with(index(index_name))
  3. 首先,您必须首先执行查询,然后获取所需的执行顺序,从而获得XML计划。对于第二个,只需在您按所需顺序排列列的那些列上创建索引。