2012-08-16 98 views
0

我已经被问到以下问题,当您想要改进存储过程性能时,您会看到什么?存储过程返回一些值并在其中有三个连接。 除了确保连接写得很好之外,还可以做些什么来使其性能更好?这是一个普遍的问题,没有提供任何代码。 任何想法?返回存储过程的SQL性能

回答

0

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

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

您可以检查出这个网站获取更多性能的技巧,但我想我介绍你最需要什么简单的语句:

SQL Optimizations School

+0

内联函数与游标不同吧?游标也在逐行编译。感谢您的网站,这是一个很好的来源 – sheidaei 2012-08-17 14:49:37

+0

正确的,游标是循环数据的一种方式。内联函数只是在查询中计算数据的方法。如果您使用函数来计算where子句中的数据,然后将该计算与另一个值进行比较,那么很可能SQL不会使用索引,并且它可能必须一次一行地执行计算/比较,而不是按质量进行计算/比较。 – 2012-08-17 22:27:05

2

检查连接中使用的表上的索引。特别是,连接索引中使用了哪些列?

示例 -

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

如果这些表很大,索引ItemId两个表中通常会有助于性能提升不少。

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

WHERE a.ProductId = @SomeVariableYouPassedToTheStoredProc 

索引ProductId可能有助于在这种情况下。

查询性能是你可以进入兔子洞的东西,但这是一个合理的(快速)开始的地方。

+0

感谢指数,比我通常不能想其他任何事,他们都是查询具体,如使用TINYINT而不是INT等等,是不是? – sheidaei 2012-08-17 14:52:41

0

事实上,它是一个存储过程与它没有多大关系。优化里面的sql。

至于如何,所有常见的嫌疑犯,包括由那种认为你可以猜测出什么问题的eejit写的。

将proc中的sql复制到一个合适的工具中,并用Explain作为前缀以查看发生了什么。

+0

所以它与返回值无关,对吧?你正在谈论存储过程本身的sql。 – sheidaei 2012-08-17 14:53:30

+0

是的,以及它里面的SQL。实质上,所有的存储过程都是一个已命名和预编译的sql块,其中包含一些用于传入和传出值的修饰。 – 2012-08-17 15:40:23

0

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

在任何情况下,这个问题主要是针对数据库的。

+0

有关Oracle11中的缓存很好的知识,你能否把我推荐给在线的好例子? – sheidaei 2012-08-17 14:51:18

0

运行查询分析器的SQL语句

+0

谢谢,这可能是个好主意,没有想到它 – sheidaei 2012-08-17 14:48:43