视图和表之间的连接是否会损害性能?

时间:2011-09-23 08:58:04

标签: sql-server sql-server-2005 sql-server-2008

我是sql server的新手,

我的经理给了我一份工作,我必须在sql server 2008中找到查询的性能。

该查询非常复杂,在视图和表之间有连接。我在互联网上读到视图和表之间的连接导致性能受损?

如果有专家可以帮我这个吗?我知道这个的任何好的链接?如何在sql server中计算查询性能?

3 个答案:

答案 0 :(得分:4)

查看查询计划 - 它可以成为任何东西。缺少其中一个基础视图表上的索引,缺少连接表上的索引或其他内容。

请看看Gail Shaw撰写的关于在SQL Server中查找性能问题的文章 - part 1part 2

答案 1 :(得分:3)

视图(未编入索引/实现)只是一个宏:不多也不少

expands into the outer query。因此,具有3个视图(分别具有4,5和6个连接)的连接将成为具有15个JOIN的单个查询。

这是一个常见的“我可以重用它”的错误:DRY通常不适用于SQL代码。

否则,请参阅Oded的回答

答案 2 :(得分:1)

Oded是正确的,你一定要从查询计划开始。也就是说,您可以在高层次上看到一些事情,例如:

  

CONVERT(VARCHAR(8000),CN.Note)LIKE'%T B9997%'

由于索引的工作方式,

LIKE前面的通配符在性能方面是坏消息。如果你考虑一下,很容易找到名字以“Smi”开头的电话簿中的所有人。如果您尝试查找名称中任何位置都有“mit”的所有人,您会发现需要阅读整本电话簿。 SQL Server做同样的事情 - 这称为全表扫描,通常很慢。另一个问题是条件的左侧使用函数来修改列(特别是将其转换为varchar)。从本质上讲,这再次意味着SQL Server无法使用索引,即使CN.Note列有一个索引也是如此。

我的猜测是该列是text列,并且不允许您在搜索开始时更改过滤器逻辑以删除通配符。在这种情况下,我建议您查看Full-Text Search / Indexing功能。通过启用全文索引并使用CONTAINS等特定关键字,您应该可以获得更好的效果。

再次(与所有性能优化方案一样),您仍应从查询计划开始,看看这是否是查询的最大问题。