0

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

4

5 回答 5

2

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

例子 -

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

如果这些表很大,那么ItemId在这两个表中建立索引通常会对性能有很大帮助。

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

WHERE  a.ProductId = @SomeVariableYouPassedToTheStoredProc

ProductId在这种情况下,索引可能会有所帮助。

查询性能是您可能陷入困境的东西,但这是一个合乎逻辑(且快速)的起点。

于 2012-08-16T17:34:47.943 回答
0

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

至于如何,所有常见的嫌疑人,包括那种认为你可以猜出问题所在的eejit。

将 sql 从 proc 复制到合适的工具中,在其前面加上 Explain 以查看发生了什么。

于 2012-08-16T17:42:18.737 回答
0

我想还有其他选择。例如: 1. 这些连接中的每一个都可以使用类似于“and permited_used_name = (select user_name from user_list where )”的限制条件。该值可以在过程启动期间派生一次(我的意思是过程的第一个字符串),以免许多类似查询使数据库过载。2. 从Oracle11 开始,您可以将函数声明为具有缓存结果的函数(即函数计算一次,每次调用时都不会重新计算)定义一组更改无效缓存的表。

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

于 2012-08-16T18:36:49.113 回答
0

对 SQL 语句运行查询分析器

于 2012-08-16T19:21:07.113 回答
0

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

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

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

SQL 优化学校

于 2012-08-16T22:35:15.480 回答