在一些复杂的存储过程中,我们在此视图中使用view和left join。执行需要40秒。
现在,如果我们创建TABLE变量并在其中存储视图的结果,那么对该变量进行左连接而不是视图,则需要3秒......
什么可以解释这种行为?
答案 0 :(得分:3)
视图扩展为主查询。小号
因此,如果视图中有5个表,则这些表会将额外的表扩展为一个包含6个表的大查询计划。性能差异很可能是由于您加入的额外表格的复杂性和排列的增加造成的。
另一个潜在的问题:您是否已经加入了对其进行处理的列?这将进一步扼杀业绩。
答案 1 :(得分:-1)
由Alden W提供。我对你的一个问题的反应如同Alden W。
通过将VIEW ALGORITHM指定为MERGE,您可以获得更好的性能。使用MERGE MySQL将视图与外部SELECT的WHERE语句相结合,然后提出优化的执行计划。
要执行此操作,您必须从VIEW中删除GROUP BY语句。实际上,如果您的视图中包含GROUP BY语句,MySQL将选择TEMPLATE算法。在被WHERE语句过滤之前,首先要创建整个视图的临时表。
如果不能使用MERGE算法,则必须使用临时表。如果视图包含以下任何构造,则不能使用MERGE:
聚合函数(SUM(),MIN(),MAX(),COUNT()等)
DISTINCT
GROUP BY
HAVING
LIMIT
UNION或UNION ALL
选择列表中的子查询
仅指文字值(在这种情况下,没有基础表)
以下是更多信息的链接。 http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html
如果您可以将视图更改为不包含GROUP BY语句,则要指定视图的算法,语法为:
CREATE ALGORITHM = MERGE VIEW ...