查询优化提示

Posted

技术标签:

【中文标题】查询优化提示【英文标题】:Query Optimization Tips 【发布时间】:2012-08-22 23:39:20 【问题描述】:

我一直在寻找一些关于 SQL Server 2008 中查询优化的一般提示和技巧。

我遇到了以下情况,我很不确定使用视图/触发器的后果是什么

尝试用原始源表替换视图 如果可能,不应使用触发器,将触发器的逻辑合并到存储的 程序

有人可以解释这些解释的利弊,并指出查询优化的一般提示和技巧列表。

【问题讨论】:

我的问题不明智吗?还是投反对票的人太天才了,以至于他不明白在问什么?至少在投票时发表评论;以便其他人可以了解您在做什么或问题有什么问题 也许他们根据*** FAQ 认为您的问题不合适。这不是一个具体的问题,而是一个开放式讨论的邀请。无论如何,我都没有投票。 【参考方案1】:

视图是由查询形成的虚拟表,例如“SELECT a, b FROM tableC”这将创建 a & b 的“虚拟表”。源表是它自己的表,并且能够'SELECT * FROM tableC'这样效率更高,因此不会创建虚拟表。

触发器是在指定事件发生时触发的事件,例如特定查询。存储过程是编译的事务,可以像触发器一样工作,只是它们的效率要高得多。简而言之,不要使用触发器。

我会认真考虑http://www.amazon.com/SQL-Tuning-Dan-Tow/dp/0596005733/ref=sr_1_1?ie=UTF8&qid=1345679033&sr=8-1&keywords=sql+optimization

【讨论】:

对于虚拟表的回答。数据库设计应该使得查询通常需要从返回的每一行的给定源列返回的所有信息。因此,如果您的查询仅从表中选择某些列,则您的架构效率不高。 我不同意视图是“虚拟表”。但是@David我不确定我是否遵循您的逻辑。因此,如果我有一个 OrderDetails 表,并且我使用查询来获取尚未发货的订单所需的产品 x 的总单位数,那么我的模式就是垃圾,因为我的查询没有查看单价列,这与我当前正在运行的查询无关? 您将使用诸如“SELECT COUNT(unit) FROM OrderDetails”之类的查询,并且由于 count 不会仅使用“unit”列返回“行列表”,因此不会创建虚拟表,所以不,在这种情况下,您的架构不是垃圾。如果您正在运行“SELECT unit FROM OrderDetails”,然后使用其他函数进行计数,那么您正在创建一个虚拟表,并且效率不高。

以上是关于查询优化提示的主要内容,如果未能解决你的问题,请参考以下文章

查询优化的 SQL 提示 [关闭]

有关优化此多层(具有多层子查询)SQL 查询的提示

查询优化器的提示

如何向 Hibernate 标准 api 查询插入“优化器提示”

关于sparksql中的hint

lightdb21.3-新增优化器提示no_merge