FQN如何影响查询执行计划缓存?

问题描述:

link,更说明FQN如何影响查询执行计划缓存?

的算法,以匹配新的SQL语句在缓存中现有的,未使用的 执行计划要求所有的对象引用是 完全合格。例如,第一,这些SELECT语句是 不能与现有的计划相匹配,而第二匹配:

SELECT * FROM Person; 

SELECT * FROM Person.Person; 

我不太明白是什么意思。它与模式名称和表名称相同的事实有关吗?为什么第一个与现有计划不匹配?

+0

名称解析和默认模式。 'dbo.Person'对'Person.Person'。 – lad2025

完全限定名称(FQN's)有助于更快速地进行名称解析。如果没有显式模式,SQL Server将首先查看与登录相关的模式。

假设你有下面低于架构相关的登录

create schema test 

create table test.schematest 
(id int 
) 

select * from test.schematest 


--create a login 
CREATE LOGIN foo WITH 
    PASSWORD = 'foo', 
    CHECK_POLICY = OFF, 
    CHECK_EXPIRATION = OFF; 
GO 

--create schema 
CREATE SCHEMA foo AUTHORIZATION dbo; 
go 

CREATE USER foo FOR LOGIN foo WITH DEFAULT_SCHEMA = foo; 
GO 

EXEC sp_addrolemember 'db_owner', 'foo'; 
GO 


--now first create a table 
--this will be created in dbo schema 

create table test 
(
id int 
) 

--now execute as user foo 

execute as user='foo' 
go 


create table test 
(
namee varchar(100) 
) 

insert into test 
values 
('foo schema') 

select * from test--gives foo schema 

现在来规划缓存方面,SQL Server将产生相同的查询一个新的计划,即使有轻微的变化(我remeber阅读本与SQL散列查询文本和比较)

以下查询是一样的,除了对新行foo.test做

dbcc freeproccache 

select * from foo.test 

select * from 
foo.test 

select txt.text,* From sys.dm_exec_query_stats ec 
cross apply 
sys.dm_exec_sql_text(ec.plan_handle) txt 
where txt.text like '%foo.test%' 

你可以发EE有两个计划

enter image description here

因此,在总结附加架构前缀总是会有所帮助,但它有少做计划缓存。您还提供

例落入例如我发现

参考文献:
Bad habits to kick : avoiding the schema prefix