Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用任何()linq表达式进行优化有什么意义吗?_Asp.net Mvc_Linq_Optimization - Fatal编程技术网

Asp.net mvc 使用任何()linq表达式进行优化有什么意义吗?

Asp.net mvc 使用任何()linq表达式进行优化有什么意义吗?,asp.net-mvc,linq,optimization,Asp.net Mvc,Linq,Optimization,我有一个MVC应用程序,它从2个控制器方法返回2种类型的Json响应;AnyMembersExist和GetAllUserMembers。第一个返回一个布尔值,第二个返回一个数组,两者都包装为Json 我有一个JavaScript计时器,它可以根据用户检查日历提醒。它会第一次呼叫AnyMembersExist,以检查是否存在提醒,然后客户端是否应该进行第二次呼叫 例如,如果Any查询的Json响应结果为false,则它不会执行第二个控制器操作,该操作将执行LINQ select调用。如果存在提醒

我有一个MVC应用程序,它从2个控制器方法返回2种类型的Json响应;AnyMembersExist和GetAllUserMembers。第一个返回一个布尔值,第二个返回一个数组,两者都包装为Json

我有一个JavaScript计时器,它可以根据用户检查日历提醒。它会第一次呼叫AnyMembersExist,以检查是否存在提醒,然后客户端是否应该进行第二次呼叫

例如,如果Any查询的Json响应结果为false,则它不会执行第二个控制器操作,该操作将执行LINQ select调用。如果存在提醒,它会进一步使用LINQ SELECT请求提醒

想象一下一个升级的系统,其中100-1000个用户使用该系统,在客户端上,每30-60秒就会有一个请求进入并加载到提醒中。此调用是否有助于减少服务器上的负载?

任何调用仅检查集合中是否至少有一项被返回。与使用“计数>0”之类的方法相比,使用“计数>0”可以计算集合中的项目总数,是的,这更为理想

如果您的AnyMembersExist方法的工作原理与此类似,则不调用第二次服务器调用将减少您的负载。

任何只检查集合中是否至少有一项正在返回。与使用“计数>0”之类的方法相比,使用“计数>0”可以计算集合中的项目总数,是的,这更为理想


如果您的AnyMembersExist方法的工作原理与此类似,则不调用服务器的第二次调用将减少您的负载。

因此您会问,如果不执行应用程序不需要执行的工作,是否会减少服务器上的负载


当然。这个答案是什么?是的,无故做额外的工作不会影响服务器的负载。

所以你问如果不做应用程序不需要做的工作会减少服务器的负载吗

当然。这个答案是什么?是的,无缘无故地做额外的工作不会影响服务器负载。

如果你总是在事后得到实际值,那么不-请求越少越好,并且总是给出完整的结果。我非常怀疑不返回结果比返回没有结果的指示慢

编辑:tvanfosson在撰写本文时的最新评论值得推广:

你真的只能通过测量来判断,我只会在select only选项的性能不符合要求时才使用它

这是关于性能的最重要的一点:猜测的值远小于测试数据的值。

如果您总是在事后获得实际值,那么不-请求越少越好,并且总是给出完整的结果。我非常怀疑不返回结果比返回没有结果的指示慢

编辑:tvanfosson在撰写本文时的最新评论值得推广:

你真的只能通过测量来判断,我只会在select only选项的性能不符合要求时才使用它


这是关于性能最重要的一点:猜测的值远小于测试数据的值。

我认为这取决于底层查询的转换方式。如果any调用在select(可能是由于获取相关数据的连接)必须执行某种表扫描时转换为索引查找,那么在没有要查找的提醒的情况下,它将节省一些工作。当有提醒时,它会导致一些额外的工作。如果大多数调用不会产生任何结果,那么它可能会很有用


不过,在一般情况下,我只会选择数据,只有在结果证明不够快时才尝试优化。它在服务器上实际节省工作量的条件非常狭窄,只有手工编写SQL而不是依靠ORM时才可能适用。

我认为这取决于底层查询的翻译方式。如果any调用在select(可能是由于获取相关数据的连接)必须执行某种表扫描时转换为索引查找,那么在没有要查找的提醒的情况下,它将节省一些工作。当有提醒时,它会导致一些额外的工作。如果大多数调用不会产生任何结果,那么它可能会很有用

不过,在一般情况下,我只会选择数据,只有在结果证明不够快时才尝试优化。它在服务器上实际节省工作量的条件非常狭窄,只有手工编写SQL而不是依靠ORM时才适用。

这最终取决于 任何检查都要与得到的结果进行比较,以及错误的频率

如果Any调用所用的时间与select所用的时间差不多,那么它就相当长了 很多事情都没有意义

如果Any调用比select调用快得多,但90%的 如果这是真的,那么它可能不值得你这么做 得到10%的改善,最坏的情况下实际上是更多的工作

如果Any调用比select和90%的 如果它是假的,那么检查是否存在可能是有意义的 在实际得到结果之前有任何问题

所以答案是这取决于你的具体情况。最终,您将需要测量不同典型负载上的相对性能,可能一些查询比其他查询更密集,以及没有结果返回的频率。

事实上,在这种情况下,几乎没有必要检查任何

如果返回false,则不需要获取结果。 然而,这意味着无论如何它都不会返回任何结果,所以 除非您的Any检查速度明显快于select 返回0个结果,这里没有额外的好处

另一方面,如果有返回true,则需要获取 结果无论如何,所以在这种情况下,任何工作都是纯粹的额外工作

这最终取决于与得到结果相比,任何检查的速度有多快,以及错误的频率有多高

如果Any调用所用的时间与select所用的时间差不多,那么它就相当长了 很多事情都没有意义

如果Any调用比select调用快得多,但90%的 如果这是真的,那么它可能不值得你这么做 得到10%的改善,最坏的情况下实际上是更多的工作

如果Any调用比select和90%的 如果它是假的,那么检查是否存在可能是有意义的 在实际得到结果之前有任何问题

所以答案是这取决于你的具体情况。最终,您将需要测量不同典型负载上的相对性能,可能一些查询比其他查询更密集,以及没有结果返回的频率。

事实上,在这种情况下,几乎没有必要检查任何

如果返回false,则不需要获取结果。 然而,这意味着无论如何它都不会返回任何结果,所以 除非您的Any检查速度明显快于select 返回0个结果,这里没有额外的好处

另一方面,如果有返回true,则需要获取 结果无论如何,所以在这种情况下,任何工作都是纯粹的额外工作


我认为你在一般情况下是对的,但是我可以看到a在哪里有关于此人呼叫的任何提醒然后a获取从现在到一小时后的提醒可能被转换为这样的方式,第一种情况下执行索引查找,第二种情况下执行表扫描,这取决于表上的索引和精确的查询。这看起来像是一个早熟的,可能是反向优化的案例。@tvanfosson:但那是另一个案例-比较现在和一小时后是否有任何提醒更合适,并从现在到一小时后获得提醒-当然在这种情况下,双方都可以使用索引。。。如果您更改查询的过滤器部分,则这是另一回事。如果不知道实现的确切细节,则很难判断。我的示例可能选择得不好,但如果有一个已删除的列,而您只想查找那些尚未删除的提醒,该怎么办。也就是说,您在已删除的列上放置了一个索引。如果AnyMembersExists检查未删除的提醒,则它可能会使用此索引并进行索引扫描。GetAllUserReminders可能只关心将来的提醒,并执行基于日期的筛选,这可能会导致优化器选择忽略索引并进行表扫描。@tvanfosson:在这种情况下,听起来查询优化器做了错误的事情-如果我们假设查询优化器会出错,那么这不意味着所有的赌注都输掉了吗?我并不是说优化器错了,而是说另一个查询可能更复杂,并导致一个更适合该查询的不同策略。也许,第一个可以做一个简单的操作,其中第二个需要跨其他表连接,以获得警报显示方式或警报是否适用于此客户端的一些首选项,等等。它可能不像索引搜索和表扫描那么简单,但我不敢说,由于处理查询的方式不同,在任何情况下它都不会有帮助。我认为你在一般情况下是对的,但是我可以看到a在哪里有关于此人呼叫的任何提醒然后a获取从现在到一小时后的提醒可能会被转换为这样的方式:第一种情况下进行索引查找,第二种情况下进行表扫描,这取决于表上的索引和确切的查询f
模拟的。这看起来像是一个早熟的,可能是反向优化的案例。@tvanfosson:但那是另一个案例-比较现在和一小时后是否有任何提醒更合适,并从现在到一小时后获得提醒-当然在这种情况下,双方都可以使用索引。。。如果您更改查询的过滤器部分,则这是另一回事。如果不知道实现的确切细节,则很难判断。我的示例可能选择得不好,但如果有一个已删除的列,而您只想查找那些尚未删除的提醒,该怎么办。也就是说,您在已删除的列上放置了一个索引。如果AnyMembersExists检查未删除的提醒,则它可能会使用此索引并进行索引扫描。GetAllUserReminders可能只关心将来的提醒,并执行基于日期的筛选,这可能会导致优化器选择忽略索引并进行表扫描。@tvanfosson:在这种情况下,听起来查询优化器做了错误的事情-如果我们假设查询优化器会出错,那么这不意味着所有的赌注都输掉了吗?我并不是说优化器错了,而是说另一个查询可能更复杂,并导致一个更适合该查询的不同策略。也许,第一个可以做一个简单的操作,其中第二个需要跨其他表连接,以获得警报显示方式或警报是否适用于此客户端的一些首选项,它可能不像索引查找和表扫描那么简单,但我不敢说,由于处理查询的方式不同,在任何情况下它都不会有帮助。