SQL优化:连接方式。。。从

SQL优化:连接方式。。。从,sql,oracle,connect-by,Sql,Oracle,Connect By,我有一个使用connectby和START WITH语句的查询,如下所示。in子句中的查询运行不到5秒,返回3000行事实表包含2000万条记录。我如何优化下面的SQL,因为此查询需要永远运行:( 使用“in”非常慢。 如果此数据不需要实时更新。 我想你可以试试这个: 1、 不要使用distinct 2、 使用表连接而不是“in” 3、 使用物化视图 希望有帮助。等待更好的答案。:)我想是甲骨文吧?说真的,你为什么不告诉我你在用什么RDBMS?@Erwin,是的,是Oracle,很抱歉我错过了。

我有一个使用
connectby
START WITH
语句的查询,如下所示。in子句中的查询运行不到5秒,返回3000行<代码>事实表包含2000万条记录。我如何优化下面的SQL,因为此查询需要永远运行:(

使用“in”非常慢。
如果此数据不需要实时更新。
我想你可以试试这个:
1、 不要使用distinct
2、 使用表连接而不是“in”
3、 使用物化视图

希望有帮助。等待更好的答案。:)

我想是甲骨文吧?说真的,你为什么不告诉我你在用什么RDBMS?@Erwin,是的,是Oracle,很抱歉我错过了。你能告诉我们哪些索引是在事实表上定义的吗?这是事实表上定义的索引。这是事实表上定义的索引。这是唯一的SRC_ID_KEY,DST_ID_KEY,SRC_START_DTTM IX_事实表上唯一的DST_ID_KEY,SRC_ID_KEY,SRC_START_DTTM IX_FACT_TABLE_03位图是_directix_FT_dtu 1普通SRC_ID_KEY IX_R_FT_dtu 2普通DST_ID_KEY IX_R_FT_DTV普通MES ID_KEY你能指导我如何用表连接或物化视图替换IN吗?对不起,我误导了你。2、 使用表连接而不是“in”是不可行的。您可以尝试这样做:在表b中的列名和学校上创建索引,因为在这种一般形式中,“in”非常慢,这完全是错误的。
SELECT DISTINCT CONNECT_BY_ROOT a.dst_ID_key AS root_ID_key, a.src_ID_key
  FROM fact_table a
  CONNECT BY NOCYCLE PRIOR a.src_ID_key = a.dst_ID_key
   START WITH a.dst_ID_key IN (SELECT b.ID_key
                           FROM TableA b
                           JOIN TableB c
                             ON (c.name = b.name AND c.school = b.school)
                          WHERE b.status = 'Active')