查询计划:JOINS的顺序重要吗

时间:2019-05-22 13:11:41

标签: sql postgresql query-planner

我想检查JOINS的顺序在SQL查询中对于运行时和效率是否重要。

我正在使用PostgreSQL,为了检查,我使用了来自MYSQL(https://downloads.mysql.com/docs/world.sql.zip)的示例world db,并编写了以下两个语句:

查询1:

InRightPosition

查询2:

public class PanelManager : MonoBehaviour 
{ 
    List slots = new List(); 
    bool allInRightPosition

  void Start()
  {
     for (int i = 0; i < 9; i++)
         slots.Add(false);
     foreach(Transform child in transform)
     {
         int index = 0;
         do
         {
            index = Random.Range(0, 9);
         } while (slots[index]);
         slots[index] = true;
         child.localPosition = new Vector3(index/3, index%3-2,0) /* *3 */;
     }
 }
 void Update()
 {
     foreach (Transform child in transform)
     {
         if (child.GetComponent<PanelMove>() != null && child.GetComponent<PanelMove>().InRightPosition == true)
         {
             allInRightPosition = true;
             print(allInRightPosition);
         }
         else if (child.GetComponent<PanelMove>() != null &&
                  child.GetComponent<PanelMove>().InRightPosition == false)
         {
             allInRightPosition = false;
             break;
         }
     }
 }

查询计划1: enter image description here

EXPLAIN ANALYSE SELECT * FROM countrylanguage
    JOIN city ON city.countrycode = countrylanguage.countrycode
    JOIN country c ON city.countrycode = c.code

查询计划2: enter image description here

EXPLAIN ANALYSE SELECT * FROM city
    JOIN country c ON c.code = city.countrycode
    JOIN countrylanguage c2 on c.code = c2.countrycode

估计的成本和行不同,并且最后的哈希条件不同。这是否意味着查询计划程序未针对两个查询执行相同的操作,还是我走错了路?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

问题不是join的顺序,而是join条件不同-引用不同的表。

在第一个查询中,您正在使用countrylanguage中的国家/地区代码加入city。在第二个中,您正在使用country中的国家/地区代码。

对于内部连接,这不应影响最终结果。但是,它显然会影响优化器如何考虑不同的路径。

答案 1 :(得分:2)

  • (如上所述)查询不相同相同
  • 尽管不尽相同,但计划是可比的
  • 两个查询都在18毫秒内执行,将它们进行比较几乎是无用的
  • 在结构(键,索引,统计信息)不足但占用空间较小(work_mem)的表上查询总是会导致哈希联接。