它是更好地加入两个领域在一起,或者对它们进行比较的每一个相同的恒?

StackOverflow https://stackoverflow.com/questions/72699

  •  09-06-2019
  •  | 
  •  

例如,这是更好的:

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.

有帮助吗?

解决方案

我有一个情况与此类似,这是解决我使出:

选择* 从t1 内加入t2在t1。id=t2。id和t1。国=t2。国家和t1。国="我们"

我注意到,我的查询跑得更快在这种情况。我假设加入不断保存的引擎的时间,因为其条款将执行的末尾。加入,然后过滤通过"我们"是指你仍拉的所有其他国家从你的表格,然后过滤出那些你想要的。这种方法拉少记录在结束,因为它只会找到我们的记录。

其他提示

我不认为这是一个全球性的回答你的问题。它取决于特定的查询。你会有比较执行计划的两个询问是否有显着的差异。

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

select*from t1,t2在t1。国='我们的'和t2。国=t1。国家和t1。id=t2。id

因为如果我想要改变该文本只有一个改变的需要。

有很多因素在起作用,在这里,你已经离开了。什么样的数据库?是那些表编制索引?他们是如何编制索引?如何大的是那些表?

(早优化是所有罪恶的根源!)

它可能是,如果"t1。id"和"t2。id"编制索引的,该数据库引擎加入他们一起根据这些领域,然后使用的其余部分的其中条款,以筛选出行。

他们可能被编入索引的,但令人难以置信的小型表,以及两者合在一个页面上的存储器。在这种情况下,该数据库引擎可能只是做一个完整的扫描的两个而不是打扰装载了索引。

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

正确的答案可能取决于你的SQL引擎。为MS SQL服务器上,第一种方法是清楚越好,因为统计优化被给予一个额外的线索,这可能帮助它找到一个更好的(更佳)号决议的路径。

我认为它取决于图书馆和数据库引擎。每一个会执行SQL不同,而且也没有告诉哪一个将最优化。

我会倾向于只包括你不断在代码中的一次。有可能是一个性能优点的一种方式或其他,但它可能使小型维修优势的唯一的一个参数的王牌。

如果你希望使查询更一般的,或许替代参数的目标的国家,然后我会去你的第一个例子,因为它仅需要一个单一的改变。这是不用担心得到错误的未来。

我怀疑这要取决于表,数据和元数据。我希望我可以工作了实例,显示结果这两种方法的基准!

该extressions应相当于任何体面的优化,但这取决于其数据库使用的是什么指数的定义是在你的表。

我建议采用的解释功能,以图出其中表现最佳。

我觉得一个更好的SQL将是:

select*from t1,t2在t1。id=t2。id 和t1。国="我们"

有没有需要使用第二相比,"我们的"除非它是possisble,该国在t2可能不同于t1于同样的身份证。

而不是使用隐含的内加入,我要明确地加入该表。

因为你想要两个id域和国家的领域是相同的,你提到,这两种索引(我假定在相同的索引),我将包括两个列在加入,所以你可以使用的一个指数,而不是寻求一个扫描。最后,添加那里的条款。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top