当前位置: 首页 > 面试题库 >

添加内部查询不会更改执行计划

慕凌龙
2023-03-14
问题内容

考虑以下查询。

select * from contact where firstname like '%some%'

select * from 
    (select * from contact) as t1 
where firstname like '%some%'

两个查询的执行计划相同,并且同时执行。但是,我期望第二个查询将有不同的计划,并且执行速度会变慢,因为它必须从联系人中选择所有数据并应用过滤器。看来我错了。

我想知道这是怎么回事?

数据库服务器:SQL Server 2005


问题答案:

正在发生“查询优化器”。当您运行查询时,SQL
Server使用基于成本的优化器来确定最有可能满足该请求(即执行计划)的最佳方法。将其视为从位置A到位置B的路线图。从A到B的到达方法可能有很多,有些方法会比其他方法更快。SQL
Server将采用不同的途径来实现最终目标,即返回满足查询条件的数据,并采用成本可接受的方法。请注意,它并不一定要以所有可能的方式进行分析,因为这样做不必要地昂贵。

在您的情况下,优化器已经得出结论,可以将这两个查询折叠为同一事物,因此您将获得相同的计划。



 类似资料:
  • 问题内容: 是否可以在postgresql中手动更改执行计划的操作顺序?例如,如果我一直想在过滤之前进行排序操作(尽管在正常使用Postgresql中没有意义),是否可以通过例如更改操作的内部成本来手动执行该操作? 如果实现自己的功能该怎么办?是否有可能总是在sql语句的最后执行这样的功能? 问题答案: 还有更多的方法- 这里显示了一些方法,但是还有第二种方法,如果要在处理结束时移动函数调用,则只

  • 问题内容: 我的问题是,将一行添加到DataFrame会更改列的dtype: 我将dtype特别指定为int32(即’i4’),可以看出: 但是,添加一行会将dtype更改为float64: 我尝试指定添加的值的dtype: 但这也不起作用。有没有不使用返回新对象的函数的解决方案? 问题答案: 放大分为两个阶段,首先将a放在该列中,然后将其分配,这就是为什么要强制它的原因。我将其放在错误/增强列表

  • 我正在尝试运行以下存储过程: 我得到这个错误: SQL错误[42601]:在“E_ENTRIES_LOG”之后发现意外的标记“ALTER”。预期的令牌可能包括: “.SQLCODE=-104,SQLSTATE=42601,DRIVER=4.26.14 注意:如果我在不使用存储过程的情况下运行alter查询,它运行正常。

  • 问题陈述:在JPA hibernate中,我执行了一个方法

  • 问题内容: SQL2008。 我有一个测试表: 我用10k测试行填充它。 我运行以下两个查询: 我不知道为什么这两个查询有不同的执行计划。 查询1确实针对UQ_Sale_RowVersion索引进行索引搜索。 查询2对PK_Sale进行索引扫描。 我想查询2做索引查找。 我将不胜感激。 谢谢你。 [编辑] 尝试使用datetime2而不是rowversion。同样的问题。 我也尝试强制使用索引(查

  • 问题内容: 我想测试某个代码段执行的SQL查询越少越好。 似乎有其自己的方法,它将做到这一点。但是由于我没有修补ActiveRecord,所以对我来说没什么用。 RSpec或ActiveRecord是否提供任何官方的公开方式来计算在代码块中执行的SQL查询的数量? 问题答案: 我认为您通过提及回答了您自己的问题,但是这里有: 我建议您看一下后面的代码,并使用它来构建自己的方法,该方法可用于计算查询