1

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

Nhibernate 生成纯 sql 查询而不是执行语句

我还找到了一个链接,描述了来自唯一的 Jeff Atwood 的类似经历

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

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

4

2 回答 2

2

This example is a little more verbose:

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();
    }
}

Then in your sessionfactory/initializer:

configuration.ExposeConfiguration(x =>
    {
        x.SetInterceptor(new OptionInterceptor());
    });
于 2014-08-01T00:07:10.137 回答
0
  • 您可以考虑扩展 MsSqlDialect 或
  • 实现 IConnectionProvider 以注入您自己的命令包装器,该命令包装器在ExecuteReader()调用时添加提示
于 2012-12-11T11:58:51.713 回答