我正在编写一个程序,在客户特定的当地时间发送电子邮件。 我有一个.NET方法,它采用时区和时间和目的地时区,并返回该时区的时间。 因此,我的方法是选择数据库中的每个不同时区,使用该方法检查是否是正确的时间,然后使用该时区选择数据库中的每个客户端。

查询将看起来像其中之一。 请记住,结果集的顺序无关紧要,因此联合会没问题。 哪个运行得更快,还是他们真的做同样的事情?

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)

要么

SELECT email FROM tClient WHERE timezoneID = 1
    UNION ALL SELECT email FROM tClient WHERE timezoneID = 4
    UNION ALL SELECT email FROM tCLIENT WHERE timezoneID = 9

编辑: timezoneID是tTimezone的外键,tTimezone是一个具有主键timezoneID和varchar(20)字段timezoneName的表。 此外,我和WHERE IN一起去了,因为我不想打开分析仪。

编辑2: 查询在100毫秒内处理200k行,所以此时我已经完成了。

===============>>#1 票数:3 已采纳

嘿! 这些查询不等同。

仅当假设一封电子邮件仅属于一个时区时,结果才相同。 当然它确实是SQL引擎不知道并试图删除重复。 所以第一个查询应该更快。

除非您知道为什么要使用UNION,否则始终使用UNION ALL。

如果您不确定有什么区别,请参阅 SO问题。

注意:该喊叫属于以前版本的问题。

===============>>#2 票数:2

对于大多数与数据库相关的性能问题,真正的答案是运行它并分析数据库对数据集的作用。 运行解释计划或跟踪以查看您的查询是否正在访问正确的索引或在必要时创建索引。

我可能会使用第一个使用IN子句,因为它带有你想要的最多语义。 timezoneID似乎是某个时区表上的主键,因此它应该是电子邮件和索引的外键。 根据数据库优化器,我认为它应该对外键索引进行索引扫描。

===============>>#3 票数:1

我的第一个猜测是

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)
会更快,因为它只需要对表进行单次扫描即可找到结果,但我建议检查两个查询的执行计划。

===============>>#4 票数:1

我手头没有MS SQL查询分析器来实际检查我的假设,但认为WHERE IN变体会更快,因为UNION服务器必须进行3次表扫描,而WHERE IN只需要一次。 如果您有查询分析器检查两个查询的执行计划。

在Internet上,您可能经常遇到避免使用WHERE IN的建议,但这是指使用子查询的情况。 因此,此案例超出了本建议的范围,而且更易于阅读和理解。

===============>>#5 票数:1

我认为这个问题中缺少一些非常重要的信息。 首先,天气timezoneID是否被索引是非常重要的,它是主键等的一部分。我建议大家看看分析器,但根据我的经验,WHERE子句应该更快,特别是一个索引。 逻辑是这样的,联合查询中有额外的开销,检查类型,每个列中的列号等。

===============>>#6 票数:1

在“SQL性能调优”一书中,作者发现UNION查询在他们测试的所有7个DBMS中都较慢(SQL Server 2000,Sybase ASE 12.5,Oracle 9i,DB2等): http:// books。 google.com/books?id=3H9CC54qYeEC&pg=PA32&vq=UNION&dq=sql+performance+tuning&source=gbs_search_s&sig=ACfU3U18uYZWYVHxr2I3uUj8kmPz9RpmiA#PPA33,M1

后来的DBMS可能已经优化了这种差异,但这是值得怀疑的。 此外,UNION方法更长,更难以维护(如果你想要第三个?),而不是IN。

除非你有充分的理由使用UNION,否则坚持使用OR / IN方法。

===============>>#7 票数:0

一些DBMS的查询优化器会修改您的查询以使其更高效,因此根据您使用的DBMS,您可能不应该关心。

  ask by Shawn translate from so

未解决问题?本站智能推荐:

1回复

包含WHERE的MySQL / InnoDB表的最佳键

给定一个(简化的)表 以及一个相对昂贵的普通查询 我正在尝试确定是否有更好的索引策略。 阅读最常见 COMPANY_ID具有相当的选择性(表中有数百家公司,并且发展迅速)。 STATUS_IND选择性不是很强(共有5种常见状态,少数具有较少的常见状态),并且其值经常更
4回复

如何使用Union优化Mysql Select查询?

我正在使用InnoDb存储引擎处理mysql数据库。 我的表结构如下: 表名称:archiveincomingsms 的索引详细信息:archiveincomingsms 表名称:archiveoutgoingsms 的索引详细信息:archiveoutgoings
3回复

避免UNION在MySQL中使用两个几乎相同的表

我不是很擅长MySQL,我打算写一个查询来计算用户发送的消息 ,根据它的类型和is_auto字段。 消息可以是“小文本消息”或“简报”类型。 我创建了两个实体,它们之间有一些不同的字段。 重要的是在表newsletter没有的messages_count ,它在查询中使用 :
1回复

MySQL连接和联合优化

我有这个SQL,它的运行方式与原先的想法一样,但是我想有一种更好的方法来编写它,以避免重复的句子并提高性能。 有什么建议么?
1回复

如何优化包含多个UNION的多个子查询的MySQL查询

我有一个要优化的查询,但没有取得太大的成功。 我正在尝试使用以下sql查询来计算每日使用情况数据并返回正确的结果,但是我想对此进行优化。 在这里,我正在使用具有多个union。的多个子查询。我有它的工作,但我试图进行优化,使其运行速度更快。 在下面的链接中找到数据库表架构和一些测试数
1回复

如何从具有UNION ALL的查询中获取优化的分页列表?

我有一个由两个表的UNION ALL组成的查询。 结果必须排序和分页(类似于Web应用程序的典型列表)。 原始查询(简体)为: 问题是2个表每个表都有超过100万行,查询非常慢。 如何从UNION ALL获取优化的分页列表? 发布数据: 我使用了Stack Ov
2回复

无法测试查询,但需要针对WHERE OR..OR..OR子句的最佳索引策略

应用程序每周运行一次例程。 上次运行非常慢,我们知道在下一次运行期间将处理更多数据。 到目前为止,例程中最慢的语句将临时表连接到产品表。 Profiler显示的读取次数很高,表明索引编制不正确。 在上一次运行期间,“产品”表具有200,000行,而“临时”表具有1200。 我只有
1回复

SQL多视图视图,然后使用联合查询

我在一起统一两个SQL Server密集查询。 我对SQL相当陌生,因此我使用多个视图来准备数据。 到我使用View 3C时,大约有400万行数据和52列。 当我从SQL Server Management Studio运行视图时,有时会出现“时间过期错误”。 有时它运行良好,
1回复

SQL Union查询简化

我不知道这个问题在这个论坛上是否合适。 我有一个巨大的查询: 而且我认为可以做得更好,但是经过一整天的尝试,我没有找到给出相同结果的更好查询。 为了澄清起见,我有一个库存(带有current_stock,商品,产品和交货)。 我也有门槛。 我想要的是检查每个阈值,是否存在
1回复

UNION ALL的Oracle Optimizer问题

我对Oracle优化器中的这种行为感到很困惑。 这与联合CTE的所有操作有关。 如果有人有任何想法我都是游戏。 这使用了合理的访问路径。 但是,如果从CTE向此选择添加UNION ALL,则查询如下所示: 优化器现在想要实现CTE(TEMP TABLE TRANSFO