【问题标题】:using servicestack ormlite, is there a way to get an execution plan?使用 servicestack ormlite,有没有办法获得执行计划?
【发布时间】:2023-02-11 06:14:56
【问题描述】:

使用 servicestack ormlite 6,4 和 azure SQL server - 使用 SQLServerDialect2012,我们遇到枚举导致过度停顿和超时的问题。 如果我们只是将它转换为字符串,它应该很快。

var results = db.Select(q => q.SomeColumn == enum.value); -> 3,5 seconds
var results2 = db.Select(q => q.SomeColumn.tostring() == enum.value.tostring()); -> 0,08 

我们使用默认设置,因此数据库中的枚举被定义为 varchar(255) 两个查询给出相同的结果。

为了跟踪这个问题,我们想看看它实际触发了什么,但我们得到的只是一个带有一些 @1 @2 等的查询,没有指示使用了哪些参数或它们是如何定义的。

我们试图获得一个 1:1 的 SQL 字符串,我们可以用它来手动测试查询并查看结果,但都失败了……迷你探查器是最接近的,因为它显示了参数值…… 但它不包含重新创建使用过的查询和重新创建我们遇到的问题所需的详细信息。 (手动重新创建查询给出 80ms 如上所述)

尝试通过查询获取执行计划也会失败。

db.ExecuteSql("SET STATISTICS PROFILE ON;");
var results = db.Select(q => q.SomeColumn == enum.value);
db.ExecuteSql("SET STATISTICS PROFILE OFF;");

只返回数据,而不是我希望的任何额外信息。

我无法找到任何网站或线程来解释其他人如何获得任何类型的调试信息。 正确的下一步是什么?

【问题讨论】:

  • 如果差异是由于转换引起的,在我看来,您应该在“坏”查询计划中看到很多显式转换,我认为不需要参数本身。此外,您还可以比较索引使用情况本身。只需启动活动监视器并运行您的查询,您就应该能够看到它。您也可以在这里发布QP

标签: sql-server dapper ormlite-servicestack


【解决方案1】:

OrmLite 的Logging & Introspection 页面显示了如何查看 OrmLite 生成的 SQL。

例如。配置调试记录器应该记录生成的 SQL 和参数:

LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多