我正在使用 AdventureWorks 数据库,运行以下查询:
-- 9
select *
from Production.ProductModel
where not exists
(
select 1
from Production.Product
where Production.Product.ProductModelID = Production.ProductModel.ProductModelID
);
Run Code Online (Sandbox Code Playgroud)
我返回了 9 条记录,这是正确的,但是当我检查执行计划时,我看到已经完成了排序:
为什么要进行排序?它来自内部查询吗?
我有2个存储过程,我想比较并确定哪些需要更少的资源并且性能更好.第二个过程是对第一个过程的修改,它包含第一个过程的略微更改的sql语句.我的目标是了解更改对查询成本的影响.
为此,我使用"包含实际执行计划"选项单独执行每个过程并分析两个执行计划.我的问题是我不能说哪个sql查询以简单的方式表现得更好.
例如,考虑以下第一个存储过程的查询执行计划:

该计划显示查询成本相对于批次为0%,而Clustered Index Seek运算符相对于查询为100%.对于第二个过程的相应查询,我有相同的数字.不幸的是,这还不足以理解哪个查询具有最小的成本.
因此,我的问题是:有没有办法确定整个查询的成本.最好的是带有查询的表及其特定成本,例如CPU成本或I/O成本.
SQL如何实际运行?
例如,如果我想查找一行row_id=123,SQL查询会从内存顶部逐行搜索吗?
我有一个连接了 5 个表的查询,它的执行时间约为 0.2 秒,从我的数据库中检索 36 条记录。下面附上解释计划的分析,可以看到即使那些已经带有索引的表仍然会发生全表访问。
无论如何,如果有必要按如下方式微调查询?
SELECT
CASE WHEN DS.NAME = 'InteractiveCustomer' THEN 'NA' ELSE CUS.SOURCE_SYSTEM END AS SOURCE_SYSTEM,
OU.ORGUNIT_CODE AS ORGANIZATION_UNITS,
SUM(
CASE WHEN WS.NAME = 'Pending Autoclosure' THEN 1 ELSE 0 END
) AS PENDING_AUTOCLOSURE,
SUM(
CASE WHEN WS.NAME = 'New' THEN 1 ELSE 0 END
) AS NEW,
SUM(
CASE WHEN WS.NAME = 'Under Investigation' THEN 1 ELSE 0 END
) AS UNDER_INVESTIGATION,
SUM(
CASE WHEN WS.NAME = 'Escalated' THEN 1 ELSE 0 END
) …Run Code Online (Sandbox Code Playgroud)