Sql 相同查询-查询存储中的不同查询
问题: 我们使用实体框架(6.21)作为我们的ORM管理器。 我们的数据库是Azure Sql数据库 因为一些参数化查询(在我们的应用程序中经常使用)在某些输入上运行缓慢(在某些输入上运行60秒,在其他输入上运行0.4秒) 我们开始在MS SQL Management Studio(MSMS->Object explorer->Query Store)中使用QueryStore和QueryStore explorer调查这些查询 我们发现,QueryStore将两个相同的查询(相同的sql查询,但不同的参数-甚至不存储参数)存储为不同的查询(使用不同的Sql 相同查询-查询存储中的不同查询,sql,sql-server,entity-framework,azure-sql-database,sql-query-store,Sql,Sql Server,Entity Framework,Azure Sql Database,Sql Query Store,问题: 我们使用实体框架(6.21)作为我们的ORM管理器。 我们的数据库是Azure Sql数据库 因为一些参数化查询(在我们的应用程序中经常使用)在某些输入上运行缓慢(在某些输入上运行60秒,在其他输入上运行0.4秒) 我们开始在MS SQL Management Studio(MSMS->Object explorer->Query Store)中使用QueryStore和QueryStore explorer调查这些查询 我们发现,QueryStore将两个相同的查询(相同的sql查询,
query\u id
)。
不同的查询是指表中的不同行
sys.query\u store\u 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生成的):
它的两个后续运行(使用不同的参数)将在sys.query\u store\u query
中产生两行
问题:
我如何使Azure以与相同查询相同的文本保存查询?或者我遗漏了什么,或者这是预期的行为
或者更一般地说,如果数据库查询是由实体框架生成的,如何调优它们
SQL Server查询存储如何考虑两个相同或不同的查询
Edit1:更新
基于@PeterB comment(),我们能够解决一些参数值查询速度慢的问题(我们在有问题的查询中添加了提示“重新编译”
)
基于@GrantFritchey提示,我检查了上下文设置,但query\u store
表中仍有多行具有相同的query\u sql\u text
和相同的context\u设置\u id
但具有不同的query\u id
我们仍然想知道SQL Server查询存储是如何考虑两个查询相同或不同的?
< P>对于不同的查询条目,查询存储所使用的查询的关键在于:- 查询\u文本\u id
- 上下文\u设置\u id
- 对象id
- 批处理sql句柄
- 查询\参数化\类型
当前没有控制查询存储聚合查询的方式的设置。唯一的方法是改变您的工作负载,使上面列出的字段匹配。但另一种可能更好的方法是编写自己的报告查询,根据需要聚合查询及其统计信息。这可能与。如果是这样的话,那么类似这样的内容可能会有所帮助:非常感谢-我将对此进行研究。检查sys.query\u context\u设置值以查看是否存在差异。这可能会导致计划出现两次。@PeterB谢谢-截取并重新编译提示确实有帮助(50秒->4秒)-所以我们的问题解决了。仍然不理解为什么相同的查询在QueryStore中保存为不同的查询。谢谢。@GrantFritchey好主意,但是在
query\u store
中仍然有多行具有相同的query\u-sql\u-text
和相同的context\u-id设置\u-id
但不同的query\u-id
。所以我仍然想知道SQL Server查询存储如何考虑两个查询相同或不同…
SELECT * FROM tbl WHERE a = @__plinq__