执行计划里面的索引提示是基于什么策略产生的?

胡冰 0 信誉分
2025-03-31T14:05:38.85+00:00

我能请教下:

1.执行计划里面的索引提示是基于什么策略产生的?

2.现在的SQL SERVER, 适配WHERE后面的条件(比如说用and),是不是 倒着 建立索引也可以(比如说 WHERE A_COL=1 AND B_COL =2 AND C_COL=3 ,建索引可以 C_COL ,B_COL, A_COL这样建?)

  1. SELECT TOP (1000) *

FROM [AdventureWorksDW2016_EXT].[dbo].[FactResellerSalesXL_PageCompressed]

WHERE [CustomerPONumber]='PO2137085' AND [Freight] = 16.3841查看实际执行计划,提示缺少的索引是:

  1. CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] ON [dbo].[FactResellerSalesXL_PageCompressed] ([Freight],[CustomerPONumber]) 。。。。 这里给的缺少索引列 提示的是 Freight ,CustomerPONumber,是不是可以认为是 [Freight]的选择性可能更好一些(实际情况也是这样),所以放在前置列了 和使用 CustomerPONumber,Freight 建立索引,我怎么看出他们在效率上区别?(查询计划或统计信息里面 可以体现出来吗?)
  2. 我建索引的时候,那个次序在后面,他就用那个?比如: CREATE NONCLUSTERED INDEX idx_FactResellerSalesXL_PageCompressed_Freight_CustomerPONumber ON [dbo].[FactResellerSalesXL_PageCompressed] ([Freight],[CustomerPONumber]) CREATE NONCLUSTERED INDEX idx_FactResellerSalesXL_PageCompressed_CustomerPONumber_Freight ON [dbo].[FactResellerSalesXL_PageCompressed] ([CustomerPONumber],[Freight]) 这样次序建立,他就用 idx_FactResellerSalesXL_PageCompressed_CustomerPONumber_Freight 这个索引,如果前后次序颠倒下,他就用idx_FactResellerSalesXL_PageCompressed_Freight_CustomerPONumber 。。。 是不是在SQL SERVER看来2个效率完全一样?
SQL Server 数据库引擎
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. 博雄 胡 685 信誉分
    2025-04-02T06:26:24.64+00:00

    1.很复杂,参考官方文档描述> https://learn.microsoft.com/zh-cn/sql/relational-databases/indexes/tune-nonclustered-missing-index-suggestions?view=sql-server-ver16

    2.是的,但顺序会影响行基数预估,最好选择性最低的列设置在首键列,因为它在参数嗅探成功后可以用到统计直方图,从而得到更准确的选择性最终计算出更准确的行基数预估。

    3.1 是的;建了之后使用它们对比查看区别,查询提示强制使用AB俩索引。

    3.2 它都变了,那肯定在它看来不一样啊,不然为啥变?通常是基于成本(cost)的,也就是哪个计划成本低用哪个,在中文ssms图形中叫子树大小,翻译不准。

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。