2010-04-16 70 views
1

我只是读this文章,我碰到这个传来:替代视图?

过滤器:拆下 任何功能WHERE子句,不包括意见 您的Transact-SQL代码,可能需要额外 索引。

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

我该如何有效地做到这一点?

感谢所有

+0

请具体说明。从上下文来看,该报价是毫无意义的。 – RedFilter 2010-04-16 15:43:23

+0

视图顶部的视图很差(tm),但视图正常。这是不明确的,因为它是重要视图的SQL。 – 2010-04-16 15:45:08

+0

对不起,我以为我已经链接到文章。我现在有。 – Abs 2010-04-16 15:47:23

回答

2

该文章没有一定的上下文是误导。

红门在Execution Plans上有更好的文章。和site search

为了解决你什么上市...

  • 上的连接和不列上使用函数WHERE子句

这是不好:WHERE DATEADD(day, a, column) = ...。把DATEADD移到另一边是中立的。

  • 意见并非天生就是邪恶的。

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

见我的答案和HLGEMs comment here

  • 使用动态管理视图和数据优化顾问来看待指标

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

+0

谢谢你的解释和执行计划的链接,它比我阅读的更清晰明了。 – Abs 2010-04-17 23:08:15

0

与存储过程和临时表

+2

-1:这是荒谬的建议,不知道任何细节。 – RedFilter 2010-04-16 15:45:48

+0

@OrbMan,真的吗?怎么会这样?显然,即使没有文章链接,引用也是指查询优化。因此,不要在where子句中使用view和functions。 OP然后继续说他们做了一个查询,然后想要在这个子集上工作。因此,使用临时表。没有什么可笑的。 – CaffGeek 2010-04-16 15:56:09

+0

OP表示*我想从表中选择一些数据,然后使用其他一些选择查询来处理来自第一个选择查询*的数据子集。没有迹象表明性能问题,他的声明实际上听起来像SQL在单个查询(基于集合的操作)中表现良好。但没有更多细节,*我们不知道*。为了建议他抛弃函数(不再需要'GetDate()'!)和视图,并转到存储过程/临时表是不成熟的,因此也是不好的建议。 – RedFilter 2010-04-16 16:11:05

1

存储程序和临时表做它在某些情况下一个伟大的选择,有时是最好的方式。

但有时候,你可以做这样的事情:

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

就是你写里面查询从更大的查询的部分。我一开始并不喜欢这个,但是随着时间的推移,我意识到有些查询可以毫不费力地解决这个问题。

HTH(希望这会有所帮助)!

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 ... 

你可以连续使用尽可能多的热膨胀系数如你所愿。如果你正在创建各种ad-hoc视图,只是为了让一小部分查询更容易编写,那么这将是一个更好的选择。但这是一个很大的“如果” - 这取决于你使用的观点。