我是sql server新手,
我的经理给了我一份工作,我必须找出sql server 2008中查询的性能。
该查询非常复杂,在视图和表之间进行连接。我在网上读到视图和表之间的连接会导致性能受损吗?
有没有专家可以帮我解决这个问题?我在哪里找到了关于这方面的知识,有什么好链接吗?如何计算sql server中的查询性能?
发布于 2011-09-23 17:04:23
看看查询计划--它可以是任何东西。缺少某个基础视图表上的索引,缺少join表上的索引,等等。
看看这篇由Gail Shaw撰写的关于在SQL Server - part 1、part 2中查找性能问题的文章。
发布于 2011-09-23 17:50:38
视图(未被索引/物化)只是一个宏:不多也不少
也就是说,it expands into the outer query。因此,具有3个视图(分别具有4、5和6个联接)的联接成为具有15个联接的单个查询。
这是一个常见的“我可以重用它”的错误: DRY通常不适用于SQL代码。
否则,请参阅Oded的答案
发布于 2011-09-23 17:41:29
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 ),您应该可以获得更好的性能。
同样(与所有性能优化场景一样),您仍然应该从查询计划开始,看看这是否真的是查询的最大问题。
https://stackoverflow.com/questions/7526545
复制相似问题