2013-05-01 60 views
1

我必须有一些SQL查询每一天,它通常涉及加入 我想知道这是最正确的方式做,例如在该表联接SQL优化加入

A("a",x,y) 
B("b",'a',z,w) 

哪里a和b是主键,
哪个更好?

SELECT * 
FROM a,b 
WHERE a.a=b.a AND a.x<constant 

SELECT * 
FROM (SELECT * FROM a WHERE x < constant) t, b 
WHERE t.a=b.a 

这意味着,最好使第一where子句和地方

感谢你使后加入或者我可以做的加入和过滤后!

+1

这两个查询都是交叉连接。我会说“更好”取决于你之后的数据类型,这是你不能解释的。 – Makoto 2013-05-01 04:53:23

+1

检查您的查询执行计划。我敢打赌,他们的处理方式与我相同 – 2013-05-01 05:26:48

回答

2

你的第一种方法是更好的方法。第二种方法是使用子查询并在查询中使用子查询会降低性能。因为在第二种方法中,查询必须首先获取表中的所有行,然后根据连接条件对其进行过滤,但在第一种方法中,查询只会获取匹配总是更快的连接条件的行。希望我所做的尽可能简单......!

+0

我不同意,因为我们假设数据的大小(如果数据的大小相对较小,那么对性能的影响应该不会有明显的影响),以及被问到的问题 - 如果他们要追踪其他数据,那么使用其他类型的连接可能更有效。 – Makoto 2013-05-01 05:02:56

+0

是的,我对数据的大小做了一个假设。我假定两张表中的数据都很大,如果不是很大的话。但即使数据量在数千人之中,我的感觉仍然很好。如果我错了,请纠正我。 – Abhi 2013-05-01 05:11:30

+0

@Abhi你说得很对。连接总是更快。 – 2013-05-01 05:26:33

0

智能优化器(如Oracle的)会以同样的方式执行他们两个:

如果SELECT * FROM a WHERE x < constant结果是比较小:

Nested loop join

否则:

Hash join

0

首先写清代码,尽可能干净清晰e,针对特定的问题,而不是微观管理优化器。在过去的一周中,我使用了这两种查询风格。无论您今天测试的数据量如何,我都可以保证您明年的数据量将更多。

您将始终需要调整生产速度较慢的查询,但要猜测哪些查询是杯子游戏。这个时间比猜测哪个查询可能成为问题要花费得多,并且事先优化所有这些查询。