有一个功能:
- 仅返回 1 行
- 只有1个参数
- 在不同的表上有多个连接,每个只返回一个标量值
- 每次登录 Web 应用程序时只调用一次
它目前是用 c# linq-to-sql 编写的,执行需要 150-300 毫秒。
使用非常简单的语句在 SQL 中重写后SELECT
,执行需要 30ms。
现在我想将此选择包含在数据库函数中,这样做的最佳(最快执行)方法是什么?
- 制作一个视图,并在每次通话时执行类似的操作
select * from viewXX where id=123
- 做一个存储过程
- 做一个表值函数
在这种情况下我可以利用任何技巧吗?
这是查询的示例
declare @id int=162;
select top 1 i.id, i.name, itd.description,
(select top 1 case when count(*)>0 then '1' else '0' end from category where category_desc=itd.description) "HasCategory",
(select top 1 number from wheels where wheel_item_id=i.id) "WheelCount"
from items i left items_desc itd on i.id=itd.itemid where i.id=@id
如果数据不经常更改,请将快速运行的 SELECT 打包为视图并在其上定义索引。
索引视图带有一些限制,这些限制最低限度地限制了未来更改的灵活性。然而,没有什么是非常糟糕的。
如果数据经常更改,并且更新对性能至关重要,那么维护视图的额外时间可能是一个问题,但与任何其他索引一样。