2

例如哪个更好:

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

4

11 回答 11

3

我认为你的问题没有一个全球性的答案。这取决于具体的查询。您必须比较两个查询的执行计划以查看是否存在显着差异。

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

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

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

于 2008-09-16T14:16:37.013 回答
3

这里有很多你忽略的因素在起作用。它是什么样的数据库?这些表是否已编入索引?它们是如何编入索引的?这些桌子有多大?

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

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

它们可以被索引但非常小的表,并且都适合一页内存。在这种情况下,数据库引擎可能只是对两者进行全面扫描,而不是费心加载索引。

你只是不知道,真的,直到你尝试。

于 2008-09-16T14:19:09.970 回答
1

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

于 2008-09-16T14:15:08.220 回答
1

我认为这取决于库和数据库引擎。每一个都会以不同的方式执行 SQL,并且不知道哪一个会被优化。

于 2008-09-16T14:15:18.047 回答
1

我有类似的情况,这是我采取的解决方案:

选择 * FROM t1 INNER JOIN t2 ON t1.id = t2.id AND t1.country = t2.country AND t1.country = 'US'

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

于 2008-09-16T17:13:44.640 回答
0

我倾向于只在代码中包含你的常量一次。可能有一种或另一种方式的性能优势,但它可能是如此之小,只有一个参数的维护优势胜过它。

于 2008-09-16T14:14:49.840 回答
0

如果您希望使查询更通用,也许为目标国家/地区替换一个参数,那么我将使用您的第一个示例,因为它只需要进行一次更改。这样就不用担心将来会出错。

于 2008-09-16T14:15:18.750 回答
0

我怀疑这将取决于表格、数据和元数据。我希望我可以设计出能够以两种方式显示结果的示例 - 基准测试!

于 2008-09-16T14:15:48.390 回答
0

扩展应该与任何体面的优化器等效,但这取决于您使用的数据库以及表上定义的索引。

我建议使用 EXPLAIN 功能来确定哪个表达式是最佳的。

于 2008-09-16T14:16:56.280 回答
0

我认为更好的 SQL 是:

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

除非 t2 中的国家/地区可能与相同 id 的 t1 不同,否则无需使用第二个比较与“US”。

于 2008-09-16T14:51:15.120 回答
0

我不会使用隐式内部连接,而是显式连接表。

由于您希望 id 字段和 country 字段相同,并且您提到两者都已编入索引(我假设在同一个索引中),因此我会将两列都包含在连接中,以便您可以使用索引查找而不是扫描。最后,添加您的 where 子句。

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

于 2008-09-16T15:57:06.523 回答