【问题标题】:Nhibernate add Option for queries用于查询的 Nhibernate 添加选项
【发布时间】:2012-11-22 11:00:42
【问题描述】:

我最近遇到了 Nhibernate 生成的 SQL 的性能问题,如

中所述

Nhibernate generate plain sql query instead of execution statement

我还发现了一个链接,描述了来自

的唯一一个 Jeff Atwood 的类似经历

http://legeronline.blogspot.ca/2009/03/evils-of-slow-paramaterized-query-plans.html

有谁知道是否有向 Nhibernate 添加“优化未知”选项?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    这个例子有点冗长:

    public class OptionInterceptor: EmptyInterceptor
    {
        public override SqlString OnPrepareStatement(SqlString sql)
        {
            var parameters = sql.GetParameters();
            var paramCount = parameters.Count();
    
            if (paramCount == 0)
                return sql;
    
            string optionString = " OPTION (OPTIMIZE FOR (";
    
            for (var i = 0; i < paramCount; i++)
            {
                var comma = i > 0 ? "," : string.Empty;
                optionString = optionString + comma + "@p" + i + " UNKNOWN";
            }
    
            optionString = optionString + "))";
    
            var builder = new SqlStringBuilder(sql);
    
            builder.Add(optionString);
    
            return builder.ToSqlString();
        }
    }
    

    然后在你的 sessionfactory/initializer 中:

    configuration.ExposeConfiguration(x =>
        {
            x.SetInterceptor(new OptionInterceptor());
        });
    

    【讨论】:

    • 我相信您也可以简单地附加" OPTION (OPTIMIZE FOR UNKNOWN)",在这种情况下,所有参数都被认为是未知的(无需指定所有参数)。还有,不应该是if (sql.GetParameterCount() == 0) return sql;吗?
    • @Groo 是的,是的
    【解决方案2】:
    • 您可以考虑扩展 MsSqlDialect 或
    • 实现 IConnectionProvider 以注入您自己的命令包装器,在调用 ExecuteReader() 时添加提示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多