问题:
我们使用实体框架(6.21)作为我们的 ORM 管理器。我们的数据库是 Azure Sql 数据库。
因为一些参数化查询(经常在我们的应用程序中使用)在某些输入上运行缓慢(在某些输入上运行 60 秒,在其他输入上运行 0.4 秒)
我们开始使用 MS SQL Management Studio 中的 QueryStore 和 QueryStore 资源管理器(MSSMS -> Object Explorer -> Query Store)调查这些查询。
我们发现,QueryStore 将两个相同的(相同的 sql 查询但不同的参数 - 参数甚至不存储)查询存储为不同的查询(具有不同的query_id
)。通过不同的查询,我的意思是表中的不同行
sys.query_store_query
)。
我通过查看 QueryStore 表检查了这一点:
SELECT
qStore.query_id,
qStore.query_text_id,
queryTextStore.query_sql_text
ROW_NUMBER() OVER(PARTITION BY query_sql_text ORDER BY query_sql_text ASC) AS rn
FROM
sys.query_store_query qStore
INNER JOIN
sys.query_store_query_text queryTextStore
ON qStore.query_text_id = queryTextStore.query_text_id
我无法在 MSSMS 中轻松比较这些查询的计划,因为每个查询都有自己的关联计划。
预期行为: 我假设每次后续运行具有不同参数的相同查询都会导致:
1/ 重新使用现有计划或
2/ 根据传递的参数值创建另一个计划...
例子:
查询看起来像这样(实际上查询要复杂得多,因为它们是由 EntityFramework 生成的):
SELECT * FROM tbl WHERE a = @__plinq__
并且它的两个后续运行(使用不同的参数)将导致sys.query_store_query
.
问题:
如何使 Azure 保存与相同查询具有相同文本的查询?或者我错过了什么或者这是预期的行为?
或者更一般地说,如果它们是由实体框架生成的,如何调整数据库查询?
SQL Server 查询存储如何考虑两个查询相同或不同?
编辑1:更新
基于@PeterB 评论(在调用表值函数时添加查询提示),我们能够通过对某些参数值的缓慢查询来解决我们的问题(我们"recompile"
在有问题的查询中添加了提示)。
根据@GrantFritchey 提示,我检查了 context_settings,但表中仍有多行query_store
具有相同query_sql_text
和相同context_settings_id
但不同的query_id
.
所以我们仍然想知道 SQL Server 查询存储如何考虑两个查询相同或不同?