小编bsa*_*egh的帖子

有没有办法一致地确定哪两个存储过程更快?

我目前有两个存储过程,旨在做同样的事情.我有两个关于如何检索相当复杂的数据的想法,所以我写了两个,现在我需要确定哪一个更有效.

我尝试过使用Sql Profiler,客户端统计信息和审核执行计划,但结果似乎没有结果.执行速度更快的两个存储过程中的哪一个从执行变为执行.

我猜测缓冲区缓存,统计信息和网络流量导致结果波动.我可以连续10次运行相同的存储过程并获得非常不同的持续时间(介于900毫秒和1400毫秒之间.我知道这不是很大,但它让我的决定更加困难).

我知道我可以清除缓冲区缓存并重置统计信息,但我正在使用其他人经常使用的开发服务器.我不想用我的诡计让他们慢下来.

我正在使用的数据量肯定小于生产中的数据量,因此它可能有助于虚拟化实际数量的数据.

我想知道的是,是否有一种很好的方法来运行这两个查询并确定哪个更好.也许某些软件会运行每次查询100次并生成一个漂亮的图表或什么?我不想完全从等式中删除统计数据和缓存,因为这些将在生产中发挥作用.

如果事实证明查询是可以互换的,那么我会问一个关于哪个理论上更有效的后续问题.

谢谢!

更新:好的,看起来我需要添加更多数据然后再回复你.也许这就是我需要做的全部.还要花时间阅读Dalorzo的帖子.如果结果通过更真实的测试稳定,我会告诉您.

更新哦是的,当我添加更多数据时,它变得更加确定.当我添加更多数据时,其中一个存储过程几乎没有改变,另一个长度约为3倍.感谢大家!我认为更多的数据会有所帮助,但我希望有一种方法可以不涉及将大量内容塞入数据库.非常感激.

sql sql-server performance stored-procedures

5
推荐指数
1
解决办法
78
查看次数

无法连接到 AWS Aurora 集群终端节点,但可以访问 Writier 实例

我在 AWS 上设置了 MySql Aurora 集群。在过去的几周里,我的所有应用程序都指向一个实例端点,并且它运行良好。然而,昨天,我开始在插入/更新时收到错误,表明该实例处于只读模式并且无法更新。

显然,读取器/写入器端点可以更改,我真正应该做的是指向集群端点,它将适当地路由请求。我尝试直接指向该集群端点,但总是失败。该错误消息相当通用,告诉我检查我的用户名/密码,确保我没有被防火墙阻止,以及所有正常的默认解决方案。

我的集群位于 VPC 中,但分配给该集群的子网是公共的(它们通过 Internet 网关路由)。

就绪/编写器实例具有相同的安全组和 VPC 配置。我可以连接到 Reader 实例(只读),但不能连接到 Writer 实例。

知道我还可以寻找什么吗?大多数论坛说我需要检查我的路由表或安全组,但据我所知,它们都对所有流量开放(我意识到这是一个糟糕的配置,我只是想让它正常工作)。还有什么我应该检查的吗?

谢谢

更新 我可以 Telnet 到 Reader 实例,但不能 Telnet 到 Writer 实例。据我所知,它们位于同一个 VPC 中,并且都使用公共子网。

更新 2 我的 Lambda 函数与我的 RDS 位于同一 VPC 中,可以访问集群端点,所以我猜这只是一个外部问题。我认为可以通过在 VPC 中拥有一个公共子网来解决这个问题,但它似乎不适用于该端点。

mysql amazon-web-services amazon-aurora

5
推荐指数
1
解决办法
2196
查看次数

你能教导实体框架识别表达吗?

我有一个使用实体框架的搜索功能.您可以搜索的其中一项是日期范围.您可能会说"SearchStart和Search End之间的开始日期".使用linq语法编写并不困难,但是当您有许多不同的日期参数要搜索时,它会变得非常冗长.

我在DateTime上有一个扩展方法,它基本上检查StartDate和EndDate之间的日期.我在EF不是问题的其他地方使用它,但我也想在EF查询中使用它.我通过在执行ToList(将尝试运行查询)之前应用其他WHERE子句来动态创建查询.

正如我所料,使用扩展方法抛出异常:"LINQ to Entities无法识别方法'Boolean IsBetween(System.DateTime,System.DateTime,System.DateTime)'方法,并且此方法无法转换为商店表达."

我知道Linq to Entities无法知道IsBetween在Sql中的转换,但有没有办法让我给它指示?我尝试在网上搜索答案,但这并不是很有帮助.如果有一些属性我可以添加到扩展方法或某种方式我可以更新EF配置?

我猜不是,但我不想在不问的情况下假设.

谢谢!

更新:添加扩展方法代码

 public static bool IsBetween(this DateTime date , DateTime start, DateTime end)
 {
   return (date >= start && date < end);
 }
Run Code Online (Sandbox Code Playgroud)

c# extension-methods entity-framework

2
推荐指数
1
解决办法
1256
查看次数

为什么我的表达式树不能识别我的自定义方法?

我最近发布了一个关于如何编写自定义表达式树的问题(虽然我没有意识到那是我当时要求的).现在我试图使用Scott Chamberlain提供的答案来创建另一种通用方法.

我正在使用Entity Framework并且有几个实体可以通过"Name"属性进行过滤.它并不总是名为Name,但基本上就是它.

实际的过滤方法比简单的包含或开始更复杂.它更像是一个Starts With,然后将包含搜索文本的名称的任何记录追加到列表的末尾.

由于有太多实体需要执行此过滤器,我希望能够创建一个将该过滤器应用于预编译查询的扩展方法.

我想能打电话

    someQuery.ContainsName(x => x.Name, filter.Name);
Run Code Online (Sandbox Code Playgroud)

我有一个看起来像这样的扩展方法

      public static IQueryable<T> ContainsName<T>(this IQueryable<T> query, Expression<Func<T, string>> selector, string matchingName)
    {
        var name = Expression.Constant(matchingName);

        var selectorBody = selector.Body;
        var propertyName = (selectorBody as MemberExpression).Member.Name;
        var propExpression = Expression.Parameter(typeof(string), propertyName);

        var selectorParameters = selector.Parameters;

        Expression check = Expression.Call(typeof(GenericNameFilter).GetMethod("IsMatch"), propExpression, name);

        var lambada = Expression.Lambda<Func<T, bool>>(check, selectorParameters);

        return query.Where(lambada) 
    }
Run Code Online (Sandbox Code Playgroud)

IsMatch只接受2个字符串并返回一个bool.这不是该方法的最终游戏,但我希望能够让IsMatch的简单版本正常工作,然后我会扩展它.

当我在结果上调用ToList时,我得到一个例外.

"LINQ to Entities无法识别方法'Boolean IsMatch(System.String,System.String)'方法,并且此方法无法转换为商店表达式."

从我所做的搜索中我相信我想要做的事情是可能的,我只是做错了.这是我设置表达式树的方式吗?是IsMatch方法吗?一切都是错的吗?

c# linq entity-framework expression-trees

0
推荐指数
1
解决办法
392
查看次数