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查询,

问题:

我们使用实体框架(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句柄
  • 查询\参数化\类型
如果其中任何一项与查询不同,它将在查询表中生成一个新条目。请注意,批处理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__