Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化联接(超过2个表,其中包含筛选器)_Sql_Database_Sybase - Fatal编程技术网

Sql 优化联接(超过2个表,其中包含筛选器)

Sql 优化联接(超过2个表,其中包含筛选器),sql,database,sybase,Sql,Database,Sybase,几个Sybase数据库查询问题: 如果我做一个连接并且有一个where子句,那么过滤器会在实际连接之前应用吗?换句话说,它比没有任何where条件的join快吗 我有一个涉及3个表的示例(下面列出了列): 所以我的连接看起来像: select A.*, B* from B,C,A where C.E1=B.E1 and C.E2=B.E2 and C.O1=A.O1 and A.O2 in (...) and B.E3 in (...) 如果我取消了C并将O1添加到表B中,我的连接会显著

几个Sybase数据库查询问题:

  • 如果我做一个连接并且有一个where子句,那么过滤器会在实际连接之前应用吗?换句话说,它比没有任何where条件的join快吗

  • 我有一个涉及3个表的示例(下面列出了列):

  • 所以我的连接看起来像:

    select A.*, B* from B,C,A
    where 
    C.E1=B.E1 and C.E2=B.E2 and C.O1=A.O1 
    and A.O2 in (...)
    and B.E3 in (...)
    
    如果我取消了C并将O1添加到表B中,我的连接会显著加快吗

    B:E1,E2,O1....
    

    首先,应使用正确的联接语法:

    select A.*, B.*
    from B join C
         on C.E1=B.E1 and C.E2=B.E2 join
         A
         on C.O1=A.O1
    where B.E3 in (...)
    
    “,”表示交叉连接,由于容易遗漏,因此容易出现问题。如果你说“fromc,A”,你的查询就会大不相同。此外,它还允许您访问外部联接,并使语句更具可读性

    你的问题的答案是“是”。如果联接的表较少,查询将运行得更快。如果您在主键上进行连接,并且表适合内存,那么连接并不昂贵。但是,只在B中的记录中查找数据更快


    正如我所说的,在某些数据库中可能存在一些边界情况,而这不一定是真的。例如,如果列中只有一个值,而该列是一个长字符串,则将该列添加到页面上可能会增加B所需的页面数。这种极端情况不太可能发生,您应该会看到性能改进。

    速度通常取决于SQL Server必须读取的行数

  • 我认为使用where子句或join没有任何区别
  • 视情况而定。。表中有多少行
  • 它可能取决于您在中添加联接或where子句的顺序,例如,如果C中只有几行,并且您首先将其添加为表或where,则会立即减少中可能的匹配数。但是,如果C中有数百万行,那么必须读取数百万行才能找到匹配项

    现代优化器可以重新安排查询以提高效率,但不要依赖它


    真正可以减少读取的行数的是向联接列添加索引-如果在A.O1和C.O1上有索引,那么它可以大量减少读取的行数。

    我认为我们需要进一步了解您的关系实际上代表了什么。从技术上讲,是的,如果从查询中删除
    C
    ,您的
    加入
    s会更快。然而,如果您开始违反良好的规范化实践,这可能会适得其反(因此,这取决于您的实际情况)。不要使用隐式连接语法(逗号分隔的
    FROM
    子句),始终明确限定您的
    连接
    s-这是20年来的建议。一些RDBMS足够聪明,可以将这种事情转换为常规联接,但我不知道Sybase。
    select A.*, B.*
    from B join C
         on C.E1=B.E1 and C.E2=B.E2 join
         A
         on C.O1=A.O1
    where B.E3 in (...)