我有这个查询:
SELECT
[ID], [geom] AS geom , [Label], [Style]
FROM
[ogc].[0006000004C9]
WHERE
[geom] IS NOT NULL
AND [geom].STIsValid() = 1
AND ([geom].STArea() = 0 OR [geom].STArea() > 79.3734125)
AND ([geom].STLength() = 0 OR [geom].STLength() > 39.68670625)
AND [geom].STIntersects(@g) = 1
表包含约70万行。查询返回约7万行,耗时9秒。
在执行计划中,我看到空间运算(STIntersects()
)仅占1%。但是聚簇索引搜寻需要71%。
在此搜索中:
这是我的PK:
ALTER TABLE [ogc].[0006000004C9]
ADD CONSTRAINT [PK_0006000004C9]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
什么是扩展索引,这是我的PK还是查询忽略它?如何缩短执行时间?
其他信息:
表结构:
CREATE TABLE [ogc].[0006000004C9]
(
[ID] [INT] IDENTITY(1,1) NOT NULL,
[geom] [GEOMETRY] NOT NULL,
[Object_ID] [CHAR](12) NOT NULL,
[Sector_ID] [CHAR](12) NOT NULL,
[Style] [CHAR](12) NOT NULL,
[StyleName] [VARCHAR](MAX) NULL,
[Label] [VARCHAR](80) NULL,
CONSTRAINT [PK_0006000004C9]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
更新 我何时删除STIntersection()我的查询:
SELECT
[ID], [geom] AS geom , [Label], [Style]
FROM
[ogc].[0006000004C9]
WHERE
[geom] IS NOT NULL
AND [geom].STIsValid() = 1
AND ([geom].STArea() = 0 OR [geom].STArea() > 79.3734125)
AND ([geom].STLength() = 0 OR [geom].STLength() > 39.68670625)
AND [geom].STIntersects(@g) = 1
在计划中,我看到:
[![enter image description here][3]][3]
真好。实际和估计时间相同,没有任何扩展索引。而且查询仅需8 seconds
。因此,对于STIntersects
来说,查询有效9 seconds
。那么8秒是正常情况还是缓慢,有什么方法可以改进?