【发布时间】:2022-01-03 15:23:28
【问题描述】:
我们有一个查询在计划中产生一个排序操作,但我们有一个覆盖索引:
我的印象是覆盖索引将有助于减少对排序操作的需求。
查询计划: https://www.brentozar.com/pastetheplan/?id=By-AXqg2K
POSTAL_CODE 表:
CREATE TABLE [dbo].[POSTAL_CODE](
[PC_VALUE] [nvarchar](6) NOT NULL,
[PC_CITY] [nvarchar](50) NULL,
[PC_SP_ABBREV] [nvarchar](3) NULL,
[PC_COU_ABBREV] [nvarchar](2) NOT NULL,
[PC_LATITUDE] [real] NULL,
[PC_LONGITUDE] [real] NULL,
[PC_TZ_ID] [int] NULL,
[PC_OBSERVES_DAYLIGHT] [nchar](1) NULL,
[PC_COUNTY] [nvarchar](50) NULL,
[PC_DATE_INSERTED] [datetime] NOT NULL,
[PC_DATE_UPDATED] [datetime] NOT NULL,
[PC_STATUS] [nchar](1) NOT NULL,
[PC_ZON_ID] [int] NULL,
[PC_AREA_CODE] [nvarchar](3) NULL,
[PC_PREFERRED] [nchar](1) NOT NULL,
[PC_CLU_ID] [int] NULL,
[PC_WORK_INDEX] [tinyint] NULL,
[PC_WORK_MINS_DIFF] [smallint] NULL,
[PC_LIS_COUNT] [smallint] NULL,
[PC_WORK_MINS_AVG] [smallint] NULL,
CONSTRAINT [POSTAL_CODE_POSTAL_CODE$PrimaryKey] PRIMARY KEY CLUSTERED
(
[PC_VALUE] ASC,
[PC_COU_ABBREV] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY]
GO
【问题讨论】:
-
只有在任何搜索谓词之后的索引顺序与您对
ORDER BY请求的顺序相同时,覆盖索引才有助于避免排序 -ORDER BY ((3958 * 3.1415926 * SQRT((PC_LATITUDE - 1) * (PC_LATITUDE - 1) + COS(PC_LATITUDE / 57.29578) * COS(1 / 57.29578) * (PC_LONGITUDE - 1) * (PC_LONGITUDE - 1)) / 180)) ASC不会出现这种情况 -
您的查询是按表达式结果排序的,而不是直接按列排序。此设计需要进行全面扫描和分类。
-
很难阅读您的查询,但我看到
PC_LATITUDE出现在对SQRT()的函数调用中,因此我不确定您的索引是否会在这里使用。 -
该索引对优化器没有用(用于排序),它在一开始就在
PC_Value上排序,但排序标准是值的函数,不能以同样的方式进行搜索一个 where 标准不会是 sargable。 -
所以您可能想查看
STDistance和空间索引。虽然我自己也没有使用过这些。看起来相关docs.microsoft.com/en-us/sql/relational-databases/spatial/…
标签: sql-server