只是想知道统计数据是否保存在数据库中而不是内存中?如果我将数据库从生产服务器备份/恢复到开发服务器,它是否会保留相同的统计信息,以便在开发服务器上执行计划不会有太大不同?
有一个类似的问题,但不一样:
我有以下查询和以下过滤索引,但我看不出该查询无法使用下面描述的过滤索引的任何原因:
- 查询 - 使用max
列或仅使用列都没有关系,它不喜欢索引提示
SELECT -- MAX(AC1.changeDate)
AC1.changeDate
FROM [dbo].[applicationStateChange] AS ac1 WITH(INDEX(FI_ASC_ChangeDate))
WHERE ac1.applicationID = 130002
AND AC1.newStatus = 'PLC'
Run Code Online (Sandbox Code Playgroud)
-- 这是我的过滤索引 - 这个索引只是为了优化上面的查询
CREATE NONCLUSTERED INDEX FI_ASC_ChangeDate
ON [dbo].[applicationStateChange] ( applicationID DESC)
INCLUDE ( [changeDate] )
WHERE newStatus = 'PLC'
WITH ( PAD_INDEX = OFF, FILLFACTOR = 100 , SORT_IN_TEMPDB = OFF , IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, ONLINE = On,
DROP_EXISTING = ON,
DATA_COMPRESSION=PAGE, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) …
Run Code Online (Sandbox Code Playgroud) index optimization execution-plan filtered-index sql-server-2016
这是在 SQL 2005 SP2 上,但我怀疑这通常适用于所有查询提示。
我有一个临时的 sql 语句,它仅仅因为 OPTION(重新编译)而获得不同的查询计划。批处理语句永远不会(实际上)被重用,因为它使用非参数化动态 sql 生成,其中语句随日期/其他参数而变化。我已经通过检查缓存的 plan_handle 确认了这种情况,在批量更改时总是使用不同的 ID。
当我执行 dbcc freeproccache 时,我希望我为语句获得的查询计划与添加了“选项(重新编译)”查询提示的查询计划完全相同。但它不是,它实际上完全不同(要快得多)。
有谁知道为什么添加查询提示会导致引擎选择不同的查询计划?
声明是这样的
dbcc freeproccache
go
sp_executesql '
declare @begindate datetime
declare @enddate datetime
select @begindate='1/1/2011'
select @enddate='2/1/2011'
select count(*) from tableA where tableA.datecolumn between @begindate and @enddate
and exists(
select A
union all select B
union all select C
)'
Run Code Online (Sandbox Code Playgroud)
我所要做的就是更改语句以使用重新编译查询提示,然后我会得到不同的(更好的)查询计划。
dbcc freeproccache
go
sp_executesql '
declare @begindate datetime
declare @enddate datetime
select @begindate='1/1/2011'
select @enddate='2/1/2011'
select count(*) from tableA where tableA.datecolumn …
Run Code Online (Sandbox Code Playgroud) 在我现在的环境中,我有很多存储过程的实例,就像下图所示的那样,将一堆参数传递给过程,然后在过程select exists
中运行a ,并根据结果运行不同的逻辑路径在存储过程中。
我对以下程序有几个问题:
1)它是参数嗅探的好选择吗?
2)我怎么能option(recompile)
在代码中添加?
在代码中添加选项(重新编译)与使用重新编译创建存储过程之间存在差异。
option(recompile)
如果可能的话,我会更热衷于。
ALTER PROCEDURE [dbo].[usp_upd_activity]
@activityId INT,
@title VARCHAR(100),
@description VARCHAR(MAX),
@inclusions VARCHAR(MAX),
@locationId INT,
@imageUriMain VARCHAR(255),
@uploadToBucket VARCHAR(200),
@path VARCHAR(200)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRAN
BEGIN TRY
DECLARE @documentId INT
IF NOT EXISTS (SELECT 1
FROM document
WHERE activityId = @activityId)
BEGIN
INSERT INTO document
( [uploadToBucket], [path], [activityId])
VALUES (@uploadToBucket, @path, @activityId)
SET @documentId = SCOPE_IDENTITY();
END
ELSE
BEGIN
UPDATE document
SET uploadToBucket = @uploadToBucket, …
Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures optimization sql-server-2016 parameter-sniffing