我被问到以下问题,当您想提高存储过程的性能时,您会考虑什么?存储过程返回一些值,其中包含三个连接。除了确保连接写得好之外,还可以做些什么来使其性能更好?这是一个普遍的问题,没有提供任何代码。有任何想法吗?
5 回答
检查连接中使用的表的索引。特别是,连接中使用的列是否已编入索引?
例子 -
SELECT *
FROM SomeTable a
JOIN SomeOtherTable b on a.ItemId = b.ItemId
如果这些表很大,那么ItemId
在这两个表中建立索引通常会对性能有很大帮助。
WHERE
如果您的查询有一个,您应该对子句中使用的任何列执行相同的操作。
WHERE a.ProductId = @SomeVariableYouPassedToTheStoredProc
ProductId
在这种情况下,索引可能会有所帮助。
查询性能是您可能陷入困境的东西,但这是一个合乎逻辑(且快速)的起点。
它是一个存储过程的事实与它几乎没有关系。优化里面的sql。
至于如何,所有常见的嫌疑人,包括那种认为你可以猜出问题所在的eejit。
将 sql 从 proc 复制到合适的工具中,在其前面加上 Explain 以查看发生了什么。
我想还有其他选择。例如: 1. 这些连接中的每一个都可以使用类似于“and permited_used_name = (select user_name from user_list where )”的限制条件。该值可以在过程启动期间派生一次(我的意思是过程的第一个字符串),以免许多类似查询使数据库过载。2. 从Oracle11 开始,您可以将函数声明为具有缓存结果的函数(即函数计算一次,每次调用时都不会重新计算)定义一组更改无效缓存的表。
无论如何,问题主要是特定于数据库的。
对 SQL 语句运行查询分析器
您可以做很多事情来优化过程,但听起来您的 SQL 语句非常简单。需要注意的一些事项:
- 内联函数。这些可能会导致 SQL 逐行执行评估并减慢速度
- 连接语句的数据转换。这些可以防止使用索引。
- 确保在 where 子句中连接的列被索引(对于大型数据集)
您可以查看此网站以获取更多性能提示,但我认为我涵盖了您对简单语句所需的大部分内容: