我一直有一些麻烦,获得单列“varchar(5)”字段可靠地使用表查找,而不是表扫描。这种情况下的生产表包含2500万行。如同在35秒内扫描2500万行一样令人印象深刻,查询应该运行得更快。内存优化的SQL Server表 - 如何确保表查找?
这里的一个局部表的描述
CREATE TABLE [dbo].[Summaries_MO]
(
[SummaryId] [int] IDENTITY(1,1) NOT NULL,
[zipcode] [char](5) COLLATE Latin1_General_100_BIN2 NOT NULL,
[Golf] [bit] NULL,
[Homeowner] [bit] NULL,
[IncomeCode] [char](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Pets] [bit] NULL,
CONSTRAINT [Summaries_MO_primaryKey] PRIMARY KEY NONCLUSTERED HASH
(
[SummaryId]
)WITH (BUCKET_COUNT = 33554432),
INDEX [ixZIP] NONCLUSTERED
(
[zipcode] ASC
)
)WITH (MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA)
典型地,该表与包括一个查询访问:
SELECT ...
FROM SummaryTable
WHERE ixZIP IN (SELECT ZipCode FROM @ZipCodesForMO)
此查询坚持使用表扫描。我试过WITH(FORCESEEK)例如,但这只是使查询失败。
正如我已经研究了这个问题,我也试过:
SELECT * FROM Summaries WHERE ZipCode IN ('xxxxx', 'xxxxx', 'xxxxx')
当我运行此查询有64个或更少(实际的,有效的)邮政编码,查询使用表查找。
但是,当我给它65或更多的邮政编码它使用表扫描。
总之,生产查询总是使用表扫描,当我指定65个或更多的邮政编码时,查询也使用表扫描。
坦率地说,我想知道索引列(Latin1_General_100_BIN2不为NULL)的数据类型是否有问题。我可能会尝试将邮政编码转换为整数以查看会发生什么。
但我宁愿知道发生了什么,而只是随意尝试。