我想创建一个“视图”,从我正在开发的应用程序中的大约90个查询中删除相同的三行子查询。
问题是子查询包含基于变量的条件。

SELECT * FROM items WHERE id NOT IN (
  SELECT item_id FROM excluded_items WHERE user_id = 123
);

如果它不是可变的,我可以简单地创建一个视图并完成它。
不过,我不知道在这种情况下该怎么办。在一个视图后面采用同样的思路,我想创建一个返回所需记录集的存储过程,这样就可以这样调用它:
SELECT * FROM user_items(123);

现在我有一个唯一的地方来更新这个项目排除和任何其他条件,但我不知道如何索引受到影响,如果我想加入该SP的结果对其他表?
那么这种做法是好还是坏呢?有没有其他方法可以做到这一点,或者我应该把它吸收起来,继续复制这个子查询?

最佳答案

像往常一样,你的里程数可能会有所不同。如果您担心从代码语法的角度来看这是一个很好的实践,我认为这并不重要。使用存储过程从中返回记录集是很正常的事情,如果这样可以节省开发时间,那么为什么不这样做呢?但是,如果您已经确定查询执行时间的成本受到如此负面的影响,以至于您的业务成本超过了作为程序员的生产效率,那么一定不要使用存储过程。
这些年来,我听到很多关于存储过程的笑话,从人们称之为邪恶到最佳实践。我得出的结论是,在工作中一如既往地使用正确的工具。
要确定更改究竟如何影响性能,请使用以下命令执行一些测试查询:

EXPLAIN ANALYZE SELECT * FROM items WHERE id NOT IN (
  SELECT item_id FROM excluded_items WHERE user_id = 123
);

然后
EXPLAIN ANALYZE SELECT * FROM user_items(123);

然后比较执行时间和查询计划。我想这样你就能做出更明智的决定了。

关于sql - 使用存储过程作为“动态” View ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/775356/

10-16 03:51