我正在编写一个程序,在客户特定的当地时间发送电子邮件。 我有一个.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

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