从存储过程查询视图或在存储过程中包含表连接是否更有效?

时间:2018-02-17 19:52:24

标签: sql database performance sql-view sql-function

我在MySQL中有一个类似于Instagram的数据库结构,我有一个包含文件系统中图片路径的表和一个包含用户信息的表:

用户:

ID | userName  | age | gender
---|-----------|-----|-------
 1 | MrBanana  | 15  |   0   
 2 | BobTheMan | 21  |   0   
 3 |  TheBest  | 19  |   1
 4 |   MsTest  | 24  |   1      

图片:

ID |   Path    | userID 
---|-----------|--------
 1 | www.test1 |    2    
 2 | www.test2 |    4       
 3 | www.test3 |    3    
 4 | www.test4 |    2 

现在的要求是,无论何时调用图片,它都将包含userName和ID。所以我的第一个想法是创建一个连接两个表的视图,以便图片现在还具有附加到其上的图像的用户名和ID,然后从该视图中查询图片。查询将放在存储过程中。现在我的问题是,如果这是有效的,或者它是否更高效地进行查询并加入一个雄蕊并将其放入存储过程?

我担心的是,如果我使用视图方法,每次查询视图时,它必须首先加入两个表的整体,如果这些表变得非常大,这将是一个非常耗时的过程。因此,如果我创建一个存储过程,首先找到所有需要的图片,然后将用户加入它,那将更有效。

我不确定我是否正确理解这一点,并希望就哪种方法更好并且更有效地扩展来寻求帮助?

1 个答案:

答案 0 :(得分:1)

不确定您使用的是哪个RDBMS,但根据我对SQL Server的经验(我猜其他供应商也这样做),普通视图会使用索引 视图查询中包含的表格,就好像您在视图外部进行查询一样。

因此,如果你担心你的vwPicturesWithUser在查询ID = 3的图片时是否会使用Pictures表的索引,答案是肯定的(我想有人可能会想出一些奇怪的情况,其中查询planner决定忽略索引,但是在没有视图的情况下会发生太查询。