最好将两个字段结合在一起,或者将每个字段与相同的常量进行比较?

时间:2020-03-05 18:56:04  来源:igfitidea点击:

例如哪个更好:

select * from t1, t2 where t1.country='US' and t2.country=t1.country and t1.id=t2.id

或者

select * from t1, t2 where t1.country'US' and t2.country='US' and t1.id=t2.id

更好,因为数据库工作量更少,结果更快。

注意:Sybase,在" country + id"的两个表上都有一个索引。

解决方案

回答

我倾向于只在代码中包含常量一次。一种或者另一种方式可能会带来性能优势,但仅一个参数的维护优势可能会很小。

回答

正确答案可能取决于SQL引擎。对于MS SQL Server,第一种方法显然更好,因为可以为统计优化器提供其他线索,这可能有助于它找到更好的(更好的)解析路径。

回答

我认为这取决于库和数据库引擎。每个人将以不同的方式执行SQL,并且无法确定哪个将被优化。

回答

如果我们希望使查询更通用,也许用参数代替目标国家,那么我将举第一个示例,因为它只需要进行一次更改。不必担心将来会出错。

回答

我怀疑这将取决于表,数据和元数据。我希望我可以整理一些示例,以显示两种基准的结果!

回答

我认为问题没有全球性的答案。这取决于特定的查询。我们必须比较两个查询的执行计划,以查看是否存在重大差异。

我个人更喜欢第一种形式:

从t1,t2中选择*,其中t1.country ='US'和t2.country = t1.country和t1.id = t2.id

因为如果我想更改文字,只需要更改一项即可。

回答

扩展名应该与任何体面的优化程序都等效,但它取决于我们使用的是哪个数据库以及在表上定义了哪些索引。

我建议使用EXPLAIN功能来找出最合适的表达式。

回答

我们在这里忽略了很多因素。它是什么样的数据库?这些表被索引了吗?他们如何索引?这些桌子有多大?

(过早的优化是万恶之源!)

如果索引了" t1.id"和" t2.id",则数据库引擎可能会基于这些字段将它们连接在一起,然后使用WHERE子句的其余部分过滤掉行。

它们可以被索引但非常小的表,并且都可以放在一个内存页中。在这种情况下,数据库引擎可能只对两者都进行了完整扫描,而不必费心加载索引。

我们只是不知道,实际上,除非我们尝试。

回答

我认为更好的SQL将是:

从t1,t2中选择*,其中t1.id = t2.id
和t1.country ='US'

除非有可能在相同ID的情况下t2中的国家可能不同于t1,否则无需将第二个比较与"美国"使用。

回答

而不是使用隐式内部联接,我将显式联接表。

由于我们希望id字段和country字段都相同,并且我们提到了两者都已建立索引(我想在同一个索引中),因此我会将两个列都包含在联接中,以便可以利用索引查找而不是扫描。最后,添加where子句。

SELECT *
  FROM t1
  JOIN t2 ON t1.id = t2.id AND t1.country = t2.country
 WHERE t1.country = 'US'

回答

我遇到的情况与此类似,而这就是我采取的解决方案:

选择 *
从t1开始
内联接t2 ON t1.id = t2.id AND t1.country = t2.country AND t1.country ='US'

我注意到在这种情况下我的查询运行得更快。我假设加入该常量可以节省引擎时间,因为WHERE子句将在最后执行。加入" US"然后按" US"进行过滤意味着我们仍然需要从表中拉出所有其他国家/地区,然后必须过滤掉想要的国家/地区。此方法最终只提取较少的记录,因为它只会找到美国记录。