返回存储过程的SQL性能

时间:2012-08-16 17:32:47

标签: sql performance stored-procedures

我被问到以下问题,当您想要提高存储过程性能时,您会考虑什么?存储过程返回一些值,并在其中有三个连接。 除了确保连接写得很好,人们可以做些什么来使它表现更好?这是一个普遍的问题,没有提供任何代码。 有什么想法吗?

5 个答案:

答案 0 :(得分:2)

检查连接中使用的表的索引。特别是,连接中使用的列是否已编入索引?

示例 -

SELECT     *
FROM       SomeTable a
    JOIN   SomeOtherTable b on a.ItemId = b.ItemId

如果这些表很大,两个表中的索引ItemId通常会有很大的帮助。

如果您的查询中有一个列,则应对WHERE子句中使用的任何列执行相同的操作。

WHERE  a.ProductId = @SomeVariableYouPassedToTheStoredProc
在这种情况下,

索引ProductId可能有所帮助。

查询性能是你可以进入兔子洞的东西,但这是一个合乎逻辑(和快速)的起点。

答案 1 :(得分:0)

这是一个存储过程与它几乎无关的事实。优化里面的sql。

关于如何,所有通常的嫌疑人,包括那些认为你可以猜到什么是错的eejit写的。

将sql从proc复制到一个合适的工具中,在Explain前面加上解释,看看发生了什么。

答案 2 :(得分:0)

我认为还有其他选择。例如: 1.每个连接都可以使用看起来像'和permited_used_name =(从user_list中选择user_name)'的限制条件。在程序启动期间(我的意思是第一个程序字符串),可以通过许多类似的查询来重载数据。 2.从Oracle11开始,您可以将函数声明为具有缓存结果的函数(即函数计算一次,每次调用时不重新计算)定义一组更改无效缓存的表。

无论如何,问题主要是针对特定数据库的。

答案 3 :(得分:0)

在SQL语句

上运行查询分析器

答案 4 :(得分:0)

您可以做很多事情来优化程序,但听起来您的SQL语句非常简单。有些事需要注意:

  • 内联函数。这些可能会导致SQL逐行评估并减慢速度
  • 加入声明的数据转换。这些可以防止使用索引。
  • 确保将在where子句中/上连接的列编入索引(对于大型数据集)

您可以查看此网站以获取更多性能提示,但我认为我涵盖了简单陈述所需的大部分内容:

SQL Optimizations School