我应该使用啥来提高性能。查看/查询/临时表

Posted

技术标签:

【中文标题】我应该使用啥来提高性能。查看/查询/临时表【英文标题】:What should I use to increase performance. View/Query/Temporary Table我应该使用什么来提高性能。查看/查询/临时表 【发布时间】:2010-06-10 07:53:57 【问题描述】:

我想知道在存储过程中使用Views, Temp Tables and Direct QueriesUsage 的性能。

我有一个表,每次触发触发器时都会创建一个表。我知道这个触发器会非常罕见地被触发,并且只会在设置时触发一次。

现在我必须在许多地方使用从触发器创建的表来获取数据,并且我确认没有人对该表进行任何更改。即ReadOnly 表。

我必须使用这个表数据以及多个表来加入和获取结果以进行进一步的查询说

select * from triggertable

使用临时表

select ... into #tx from triggertable join t2 join t3 and so  on

select a,b, c from #tx --do something
select d,e,f from #tx ---do somethign
--and so on 
--around 6-7 queries in a row in a stored procedure.

通过使用视图

create view viewname
(
select ... from triggertable join t2 join t3 and so  on
)

select a,b, c from viewname --do something
select d,e,f from viewname ---do somethign
--and so on 
--around 6-7 queries in a row in a stored procedure.

这个视图也可以在其他地方使用。所以我将在数据库而不是在 sp 中创建

使用直接查询

select a,b, c from select ... into #tx from triggertable join t2 join t3 join ... --do something
select a,b, c from select ... into #tx from triggertable join t2 join t3 join ... --do something
.
.
--and so on 
--around 6-7 queries in a row in a stored procedure.

现在我可以在所有即将到来的查询中创建视图/临时表/直接查询使用情况。

在这种情况下最好使用什么。

【问题讨论】:

【参考方案1】:

如果triggertable 在设置时只创建一次,那么只需直接查询表即可。如果您将 SQL 查询包装在一个应防止其他用户在您查询时更新 triggertable 的事务中。

在这种情况下使用视图没有任何好处。

您可以将triggertable 复制到临时表中,但我认为在这种情况下没有任何实际好处。

【讨论】:

【参考方案2】:

加入的总是来自同一来源的数据吗?如果是这种情况,视图上的索引可以提高性能。

我可以看到临时表的唯一原因是,如果您在那里有一个 WHERE,它选择了所有后续 6-7 个查询都可以使用的小子集,但您没有说明一种或另一种方式在你的问题中。

这两个选项可以结合使用,但还有更多您没有提及的因素,例如总数据的大小等。

否则我就懒得直接查询表了,select triggertable.a, t2.b, t3.c from triggertable join t2 join t3 ...

【讨论】:

是的,可触发表的来源将始终相同。它将始终具有相同的列数和相同的名称。只有我需要的是在不同的不同存储过程中的多个位置使用该表的子集。甚至我谈到的这种观点也可能在多个过程中使用。

以上是关于我应该使用啥来提高性能。查看/查询/临时表的主要内容,如果未能解决你的问题,请参考以下文章

JAVA进阶:提高SQL性能的几种方法

如何提高我的查询性能 SQL Server

提高大型表上的 SQL Server 查询性能

将数据从 EBS 移动到临时存储会提高 MySQL 查询性能吗?

什么索引应该提高选择查询的性能?

如何提高大型表上基于日期的查询性能?