我有一个基本查询,只需将一个连接从更改LEFT JOIN
为LEFT HASH JOIN
或“ LEFT LOOP
JOIN”即可将其从6秒更改为1秒。谁能解释为什么这会导致性能大幅提高,以及为什么SQL的优化器无法自行解决?
SQL大致如下所示:
SELECT
a.[ID]
FROM
[TableA] a
LEFT HASH JOIN
[TableB] b
ON b.[ID] = a.[TableB_ID]
JOIN
[TableC] c
ON c.[ID] = a.[TableC_ID]
WHERE
a.[SomeDate] IS NULL AND
a.[SomeStatus] IN ('X', 'Y', 'Z') AND
c.[SomethingElse] = 'ABC'
表A和B在所有ID字段上都有数百万条记录和索引。使用SQL Server 2005。
编辑: 一位同事建议使用LEFT LOOP JOIN,它似乎使它变得更快… SQL并不是我的强项之一,所以我试图了解这些“提示”是如何帮助的。
HASH JOIN
当大部分行对结果集有贡献时,此功能很有用。
在您的情况下,HASH TABLE
在A
或上建立一个B
表并扫描另一个表比NESTED LOOPS
在索引上执行索引B.ID
或合并优化程序在提示之前使用的排序结果集便宜。
SQL Server
的优化程序没有看到:可能是因为您没有收集统计信息,可能是因为您的数据分布不正确。
更新:
既然您提到LOOP JOIN
提高了速度,那么可能是因为JOIN
优化程序选择的顺序不正确。
问题内容: 我正在使用MS SQL Server,并且想通过执行“将viewname更改为([somesql])”之类的东西来更改存储过程中的视图。 google抛出的一些页面断言,它不直接受支持(也没有相关的alter-table语句),但是也有一些示例,说明了如何使用如下构造方法来解决此问题: 以文字字符串形式编写代码有一点气味,即使对于SQL来说也是如此。 我的问题: 为什么不支持此功能?从
问题内容: 我在代码的第34行上不断收到LineUnavailableException:https://www.refheap.com/21223 错误显示为。 我正在创建Sound类的多个实例(在我的refheap粘贴中实现)。似乎最初的实例没有问题。但是,当我开始使用相同的音频文件制作Sound对象的新实例时,便开始出现此错误。 知道如何解决吗? EIDT:我认为这个问题的 想法可能是我需要
我正在处理一个赋值,以获取用户提供的整数并确定它是否是素数。我编写的程序运行良好,我只是不完全明白为什么我需要在每个周期将edx设置为0。
问题内容: 今天,我遇到了一个有趣的SQL问题,尽管我想出了一个行之有效的解决方案,但我怀疑这是最佳还是最有效的答案。在这里,我请专家- 帮助我学习一些知识并改善查询条件!RDBMS是SQL Server 2008 R2,查询是SSRS报告的一部分,该报告将针对约100,000行运行。 本质上,我有一个ID列表,该ID可能具有多个与之关联的值,这些值是Yes,No或其他字符串。对于ID x,如果任
本文向大家介绍什么是存储过程?用什么来调用?相关面试题,主要包含被问及什么是存储过程?用什么来调用?时的应答技巧和注意事项,需要的朋友参考一下 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。
在实际开发过程中,业务需求修改的情况时有发生,所以修改 MySQL 中的存储过程是不可避免的。 MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程。本节将详细讲解修改存储过程的方法。 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 指定了存储过程的特性,可能的取值有: CONTAINS SQL 表示子程序包含 SQL