视图的替代方案?

时间:2010-04-16 15:40:52

标签: sql-server tsql

我正在阅读this文章,我偶然发现了这一点:

  

过滤:删除中的任何功能   WHERE子句,不包括视图   您的Transact-SQL代码可能需要   附加索引。

如果我不使用观点,有哪些替代方案?我的意思是,在我的情况下,我想从表中选择一些数据,然后使用一些其他选择查询来处理来自第一个选择查询的数据子集?

我怎样才能有效地做到这一点?

全部谢谢

4 个答案:

答案 0 :(得分:2)

如果没有某些背景,这篇文章会产生误导。

Red Gate在Execution Plans上有更好的文章。还有site search

解决你列出的内容......

  • 不要在JOIN和WHERE子句的列上使用函数

这很糟糕:WHERE DATEADD(day, a, column) = ...。将DATEADD移动到另一侧是中立的。

  • 观点本身并不邪恶。

嵌套视图通常是。索引视图非常有用。

请参阅我的回答和HLGEMs comment here

  • 使用DMV和Data Tuning Advisor查看索引

SQL 2005+为您提供了更好的调优选项

答案 1 :(得分:1)

在某些情况下,商店程序和临时表是一个很好的选择,有时候是最好的方法。

但有时,你可以这样做:

SELECT *
FROM (SELECT IdC, Name FROM Customer WHERE ....)

也就是说,您在较大查询的FROM部分内编写查询。起初我并不喜欢这个,但随着时间的推移,我意识到有些问题可以毫不费力地解决。

HTH(希望这有帮助)!

答案 2 :(得分:0)

使用存储过程和临时表执行此操作

答案 3 :(得分:0)

  

...在我的情况下,我想从表中选择一些数据然后使用其他一些选择查询来处理来自第一个选择查询的数据子集?

这有点模糊,但听起来你可能正在寻找Common Table Expressions,你可以用它构建一个查询,如:

WITH First_CTE AS
(
    SELECT Col1, Col2, Col3, ...
    FROM Table
    WHERE ...
    GROUP BY ...
),
Second_CTE AS
(
    SELECT Col1, Col2, Col3, ...
    FROM First_CTE
    WHERE ...
    GROUP BY ...
)
SELECT *
FROM Second_CTE
WHERE ...
GROUP BY ...
ORDER BY ...

您可以根据需要将尽可能多的CTE链接在一起。如果您正在创建各种临时视图只是为了使一小部分查询更容易编写,那么这将是一个更好的选择。但这是一个很大的“如果” - 它实际上取决于你使用的是什么。