问题描述
对于为非常简单的 sql 查询生成的查询计划,我遇到了一个非常奇怪的问题。查询正在搜索全文索引,并返回记录数。
出于某种原因,此 sql 查询正在对索引生成非聚集扫描,我认为这不是最佳做法。我相信对于计数而言,由于主键位于全文索引中,因此只需要聚集查找即可。
有人对为什么使用这样的查询计划有任何建议吗?
奇怪的是,sql 的变体略有不同,有时它使用聚集索引(这真的很快),有时它使用非聚集搜索。
这是查询:
EXEC sp_executesql N'SELECT count(T.[ID])
FROM [dbo].[Item] AS T
WHERE CONTAINS (
(
T.[Description]
),@P0M
)
',N'@P0M nvarchar(4000)',@P0M = N'"mouse*"'
这是查询计划:https://support.google.com/accounts/answer/6010255?hl=en 如您所见,非集群搜索成本为 51%,加上位图上的 8% 并行度和 15% 哈希匹配。
表中有很多数据。超过 300 万条记录。
非常感谢
编辑: 这是计划:https://i.stack.imgur.com/1XJcf.png
这是表定义:
CREATE TABLE [dbo].[Item](
[ID] [uniqueidentifier] NOT NULL,[Description] [nvarchar](500) NOT NULL,[Manufacturer] [uniqueidentifier] NOT NULL,[Manufacturer Name] [nvarchar](100) NULL,[Manufacturer Item No.] [nvarchar](50) NOT NULL,[BC Item No.] [varchar](20) NULL,[CRM Item No.] [varchar](50) NULL,[Category] [uniqueidentifier] NULL,[Version No.] [varchar](50) NULL,[Blocked] [bit] NULL,[UNSPSC Code] [int] NULL,[Barcode] [char](13) NULL,[Last Update Date Time] [datetime] NULL,[Weight (kg)] [decimal](18,3) NULL,[RRP] [decimal](18,2) NULL,[RRP Currency] [uniqueidentifier] NULL,[timestamp] [timestamp] NOT NULL,CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,IGnorE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON,FILLFACTOR = 99,OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
还有很多外键。
这是唯一的其他索引:
CREATE UNIQUE NONCLUSTERED INDEX [Manufacturer Part No] ON [dbo].[Item]
(
[Manufacturer] ASC,[Manufacturer Item No.] ASC
)
INCLUDE([ID]) WITH (PAD_INDEX = OFF,SORT_IN_TEMPDB = OFF,DROP_EXISTING = OFF,ONLINE = OFF,OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)