【问题标题】:Can Joins between views and table hurt performance?视图和表之间的连接会损害性能吗?
【发布时间】:2011-09-23 08:58:04
【问题描述】:

我是 sql server 的新手,

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

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

如果有专家可以帮助我解决这个问题?我发现这方面知识的任何好的链接? sql server中如何计算查询性能?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Oded,我一定会通过这些链接。
    【解决方案2】:

    视图(未索引/物化)只是一个宏:不多也不少

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

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

    否则,请参阅 Oded 的回答

    【讨论】:

      【解决方案3】:

      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),您应该会获得更好的性能。

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

      【讨论】:

      • 谢谢,Daniel 我刚刚检查了视图,没有索引。它会产生性能问题吗?
      • @HemantKothiyal - 在这种情况下,我不相信您的查询会使用索引,即使它存在(出于我上面提到的原因)。但总的来说,是的,正确的索引可以让您解决大多数查询性能问题。这个话题太宽泛了,甚至无法在评论中涵盖,我建议您阅读索引和优化。一个相对较好的起点是here,尽管this 之类的内容更详细。
      猜你喜欢
      • 2011-10-13
      • 2010-12-17
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2013-11-26
      • 2011-01-11
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多