是的,你很担心这一点,我很害怕。
存储过程的一个好处是计算 怎么样 获得结果而不是 什么 结果也需要处理时间 - 就是这样 execution plan 由存储过程缓存的。
execution plan
看到 http://www.simple-talk.com/sql/performance/execution-plan-basics/
存储过程的更大好处可能是能够更精细地保护对数据的访问,并在不更改外部(SP)接口的情况下隐藏或更改模式 - 即:我可以阻止任何用户发布 INSERT , UPDATE 要么 DELETE 命令对我的数据,只允许他们访问执行类似任务或多个任务的某些过程。
INSERT
UPDATE
DELETE
如果你确实想存储总和计算的结果,你可以这样做,但它必须是在专用表中,或者如果要对总和进行分组,则必须在现有表中的附加字段中 - 并且计算必须手动编写 - 或者在触发器上 INSERT , UPDATE 和 DELETE 事件,或者您编写的存储过程中的其他代码来执行这些数据操作函数 - 所以现在您的存储过程读取类似的内容
create proc SellProduct (@productID int, @price money) as begin insert ProductSales (ProductID, SalePrice) values (@productID, @price) update Products set TotalSales = TotalSales + @price WHERE productid = @productID end
(并且您可能希望在完成上述代码之前阅读有关事务的信息)
所以,我删除了MDX标签,因为你的问题是关于存储过程,你只是使用olap来举例说明你的问题。
因此,当您说存储过程是预编译的时,请记住这不适用于过程的结果。如果你有一个带有select(sum)的过程,那么每次运行它时,select(sum)都将被提交到数据库。结果不会存储在任何地方。
你提到了性能优势。在过程中包装查询不会带来任何性能优势。在幕后,无论是否在proc中,查询都将被执行。程序的好处与@podiluska说的更相关。
我认为你的主要困惑(基于这一行你的担忧: Whenever line 20,001 is added, the amount of the sale would automatically be saved so the result of the above stored procedure )你认为程序是一个包含数据的对象,而不是。过程,视图(非持久性)和函数是用于更好地查询或数据的机制
Whenever line 20,001 is added, the amount of the sale would automatically be saved so the result of the above stored procedure
OLAP在您的数据集市中存储一百万个不同SUM的结果。 OLTP(“普通”SQL数据库)仅存储基础数据,并在调用存储过程时计算SUM。
编译存储过程,就像C程序一样。您在过程外部编写的SQL查询在运行时进行转换,就像ASP网页一样。两者都不包含数据。