毫无疑问,编写 SELECT * FROM viewCostumerAddress 比 SELECT c.id,c.name,a.id,a.fullAddress FROM customer c JOIN address a on 更简单直观a.id_costumer=c.id ORDER BY a.id,c.Priority,但是当一群人告诉你“ View 的性能更好”而你的测试并没有显示你所做的这样的增益时?
我进行的所有测试都使用相同的 SQL Server 2014。数据集有大约 2kk 个客户端和 2.5kk 个地址。任何时候,服务器内存消耗都不会超过 60%。冷查询测试之后始终是完整的服务重启,以“强制清除”任何预编译查询和任何缓存信息。热查询的结果仅在每个查询/ View 被命中 200 次后才被记录,尽可能多地过滤不同的值。所有测试都在专用而非虚拟服务器(裸机)上进行了 1000 次。
然而,热查询的最终结果差异小于 1% (0.971%),冷查询的差异几乎为 0 (0.0024%)。
面对这些结果,我开始怀疑在现代 RDBMS 世界和“对象关系映射器”中,旧的性能提升声明是否仍然是从 View 而不是直接从表查询数据的有效理由?
PS:请尽量在您的回答中做到科学,提供测试方法(如果适用)和/或科学论文,或者在报告您 亲眼目睹。
最佳答案
如果您有一个不是索引 View 的普通 View ,则不会提高性能。这是因为,当您从 View 中选择时,SQL-Server 运行 T-SQL-Statement 就像没有 View 一样。
以下是我对观点的一些看法:
<强>1。 View 是安全层
我个人不希望任何人直接访问我的基表。 在 View 中,我可以根据调用者的许可过滤掉行。 在 SQL Server 2014 之前,您无法对表执行此操作。
<强>2。 View 正在返回一组特定的列
如果我必须更改基础表的模式,我可以以某种方式更改 View ,它返回与以前相同的列。如果您不使用 View 并且用户自己从基表中进行 SELECT,查询可能会失败。
<强>3。 View 正在节省开发时间
您不必一遍又一遍地编写相同的 T-SQL 语句。如果 T-SQL-Statement 中有错误怎么办?只需将它固定在一个地方,在 View 中。您可能不必更改应用程序或许多功能和存储过程。
<强>4。使用索引 View 加速 SELECTs
当您发现 View 中的 INNER JOIN 开销太大并且没有更多其他选项(如有用的索引或模式更改)时,您可以使用索引 View 来加速 SELECT。但是您可能会在 INSERT、UPDATE 和 DELETE 上降低性能,因为 View 的索引也必须更新。
强>强>强>强>关于mysql - View 性能增益在现代 RDBMS 中是否仍然相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32229384/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/