【问题标题】:Same query - different queries in query store相同的查询 - 查询存储中的不同查询
【发布时间】:2018-06-17 16:01:22
【问题描述】:

问题:

我们使用实体框架 (6.21) 作为我们的 ORM 管理器。 我们的数据库是 Azure Sql 数据库。

因为一些参数化查询(经常在我们的应用程序中使用)在某些输入上运行缓慢(在某些输入上运行 60 秒,在其他输入上运行 0.4 秒)

我们开始使用 MS SQL Management Studio 中的 QueryStore 和 QueryStore explorer(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 查询存储如何考虑两个查询相同或不同?

Edit1:更新

根据@PeterB 评论 (Adding a query hint when calling Table-Valued Function),我们能够解决对某些参数值查询缓慢的问题(我们在有问题的查询中添加了提示 "recompile")。

根据@GrantFritchey 提示,我检查了 context_settings,但 query_store 表中仍有多行具有相同的 query_sql_text 和相同的 context_settings_id 但具有不同的 query_id

所以我们仍然想知道 SQL Server 查询存储如何考虑两个查询相同或不同?

【问题讨论】:

  • 这可能与SQL Server query hints 有关。如果是这样,那么这样的事情可能会有所帮助:stackoverflow.com/q/26761827/1220550
  • 非常感谢 - 我会调查的。
  • 检查 sys.query_context_settings 值以查看是否存在差异。这可能会导致计划出现两次。
  • @PeterB 谢谢 - 对有问题的重新编译提示进行拦截确实有帮助(50 秒 -> 4 秒) - 所以我们的问题解决了。仍然不明白为什么相同的查询在 QueryStore 中保存为不同的查询。谢谢。
  • @GrantFritchey 好主意,但 query_store 中仍有多行具有相同的 query_sql_text 和相同的 context_settings_id 但不同的 query_id 。所以我仍然想知道 SQL Server 查询存储如何考虑两个查询相同或不同......

标签: sql sql-server entity-framework azure-sql-database sql-query-store


【解决方案1】:

对于不同的查询条目,查询存储用于查询的键包括:

  • query_text_id,
  • context_settings_id,
  • object_id,
  • batch_sql_handle,
  • query_parameterization_type

如果查询中的任何一个不同,它将在查询表中生成一个新条目。请注意,batch_sql_handle 仅为引用临时表的查询填充。 因此,您可以检查哪些值与您列出的查询不同。

目前没有任何设置可以控制查询存储聚合查询的方式。使其将它们视为相同的唯一方法是更改​​您的工作量,以使上面列出的字段匹配。但另一种可能更好的方法是您编写自己的报告查询,该查询将根据您的需要汇总查询及其统计信息。

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2019-02-21
    • 1970-01-01
    • 2021-11-19
    • 2016-10-12
    • 1970-01-01
    • 2020-11-27
    • 2012-05-17
    • 2015-11-20
    相关资源
    最近更新 更多