有人可以指导我更好地理解具有多个不等式谓词的索引搜索吗?考虑下表:
CREATE TABLE [dbo].[table_1](
[DBINVHDID] [int] IDENTITY(1,1) NOT NULL,
[TYPE] [nvarchar](1) NULL,
[INV_NO] [nvarchar](13) NULL,
[ACCOUNT] [nvarchar](10) NULL,
[NAME] [nvarchar](40) NULL,
[ADDR1] [nvarchar](25) NULL,
[ADDR2] [nvarchar](25) NULL,
[ADDR3] [nvarchar](25) NULL,
[CONTACT] [nvarchar](25) NULL,
[GST_NO] [nvarchar](15) NULL,
[CR_TERMS] [nvarchar](10) NULL,
[OREF] [nvarchar](20) NULL,
[YREF] [nvarchar](20) NULL,
[SALESREP] [nvarchar](20) NULL,
[DISCOUNT] [decimal](18, 2) NULL,
[TRANSPORT] [decimal](18, 2) NULL,
[INS] [decimal](18, 2) NULL,
[GST] [decimal](18, 2) NULL,
[TOTAL] [decimal](18, 2) NULL,
[DATE] [smalldatetime] NULL,
[LINE] [smallint] NULL,
[PSLIP] [nvarchar](10) NULL,
[VAT] [nvarchar](1) NULL, …
Run Code Online (Sandbox Code Playgroud) 我最近处理了一个有问题的存储过程。有时,跑得非常快,有时,跑得非常非常长。我确定错误的参数嗅探是原因。
仅供参考 - 过程中的参数是日期时间,查询使用这些参数来搜索日期范围。
无论如何,这就是我的尝试:
WITH RECOMPILE
- 没有帮助OPTION (RECOMPILE)
- 没有帮助OPTION (OPTIMIZE FOR UNKNOWN)
- 运行速度快为了帮助我理解......使用局部变量和OPTIMIZE FOR UNKNOWN
使用平均密度统计数据来制定计划的方式完全相同吗?
我也尝试了几种组合:
OPTIMIZE FOR UNKNOWN
& OPTION (RECOMPILE)
- 运行速度快OPTION (RECOMPILE)
- 运行缓慢我已经了解了使用的潜在危险OPTIMIZE FOR UNKNOWN
,并且在很多情况下,使用局部变量被提出来,就好像它是同一件事一样。这让我认为这是同一件事。
但是 - 我该如何解释尝试 6 运行缓慢。
我想说的是,是的,统计数据已更新,但采样率低于 0% - 表很大 +- 16 亿行。
可能还值得注意 - 我使用了 Awesomesp_blitzcache
并在特定过程上进行了过滤 - 它有一个编译超时警告 - 我的直觉告诉我这是这里需要注意的事情。