【发布时间】:2015-01-18 11:20:15
【问题描述】:
如果您能帮助我解决我遇到的问题,我将不胜感激。 我有这个加入条件:
SELECT *
FROM
T1_STAGING.(first_table) AS STG
JOIN T1_STAGING.(second_table) AS B
ON
(
STG.DLOF_ID_NO=B.DLOF_ID_NO_RU
)
这个简单的连接需要很长时间才能完成,超过 20 分钟。每个表的数据少于 600,000K 数据。我尝试了以下方法:
我对每张桌子进行了统计。 我将列更改为 PRIMARY INDEX。 我为第二个表创建了 JOIN INDEX 但仍然没有! 查询永远不会结束,需要 20 分钟++。这似乎是第二个表中的数据分布问题,但我对数据无能为力。 请记住,如果我与其他任何人一起加入我的 first_table 只需几秒钟。
你能给我一个尝试的建议吗?我需要对其进行优化以获得更好的性能。
以下是对 TERADATA 的解释:
解释 SEL *
来自
T1_STAGING.DLS_DLO_OWS_STAGE_STG 作为 STG
加入 T1_STAGING.DLS_ACQUISITION_STG 作为 B
在
(
STG.DLOF_ID_NO=B.DLOF_ID_NO_RU
)
1) 首先,我们锁定一个不同的 T1_STAGING."pseudo table" 以供读取 RowHash 以防止 T1_STAGING.STG 的全局死锁。 2) 接下来,我们锁定一个不同的 T1_STAGING."pseudo table" 以供读取 RowHash 以防止 T1_STAGING.B 的全局死锁。 3) 我们锁定 T1_STAGING.STG 以供读取,我们锁定 T1_STAGING.B 以供读取。 4)我们并行执行以下步骤。 1)我们通过 T1_STAGING.B 执行全 AMP 检索步骤 没有残留条件的全行扫描拆分为 Spool 2 (all_amps) 条件为 ("DLOF_ID_NO_RU IN (:)") 使用条件限定倾斜行和 Spool 3 (all_amps) of ("DLOF_ID_NO_RU IN (:)") 来限定匹配倾斜的行 倾斜关系和 Spool 4 (all_amps) 的行 剩余的行分散到 2 个散列连接分区中。阀芯 2 在 AMP 上本地构建。然后我们进行排序以订购 假脱机 2 按行哈希。 Spool 2 的大小估计为 高置信度为 303 行。 Spool 3 在本地构建 AMP。 Spool 3 的尺寸估计很高 置信度为 4,710 行。阀芯 4 由重新分配 散列码到所有 AMP。 Spool 4 的大小估计为 高置信度为 97,742 行。预计时间 这一步是 1.27 秒。 2) 我们通过 T1_STAGING.STG 执行全 AMP 检索步骤 没有残留条件的全行扫描拆分为 Spool 6 (all_amps) 条件为 ("DLOF_ID_NO IN (:)") 到 使用条件限定倾斜行和假脱机 5 (all_amps) of ("DLOF_ID_NO IN (:)") 来限定匹配倾斜的行 倾斜关系和 Spool 7 (all_amps) 的行 剩余的行分散到 2 个散列连接分区中。阀芯 6 在 AMP 上本地构建。阀芯 6 的尺寸为 以高置信度估计为 21,587 行。阀芯 5 是 在 AMP 上本地构建。估计 Spool 5 的大小 高置信度为 7 行。阀芯 7 重新分配 通过哈希码到所有 AMP。估计 Spool 7 的大小 高置信度为 301,682 行。预计时间 这一步是 4.20 秒。 5)我们并行执行以下步骤。 1) 我们从 Spool 5 (Last Use) 通过 全行扫描到 Spool 8 (all_amps) 的方式,即 在所有 AMP 上重复。然后我们进行排序以订购 Spool 8 通过 (T1_STAGING.STG.DLOF_ID_NO) 的哈希码。的大小 阀芯 8 以高置信度估计为 336 行( 640,080 字节)。此步骤的估计时间为 0.01 秒。 2) 我们从 Spool 3 (Last Use) 通过 全行扫描到 Spool 9 (all_amps) 的方式,即 在所有 AMP 上重复。结果假脱机文件不会 缓存在内存中。 Spool 9 的尺寸估计很高 置信度为 226,080 行(391,796,640 字节)。这 此步骤的估计时间为 1.05 秒。 6) 我们从 Spool 8 (Last Use) 做一个全 AMPs JOIN 步骤。 RowHash匹配扫描,通过方式加入Spool 2(Last Use) RowHash 匹配扫描。线轴 8 和线轴 2 使用 合并连接,连接条件为 ("DLOF_ID_NO = DLOF_ID_NO_RU")。 结果进入本地构建的 Spool 1 (group_amps) 在 AMP 上。结果假脱机文件不会缓存在内存中。 Spool 1 的大小估计为 2,121 行(11,491,578 字节)。此步骤的估计时间为 0.03 秒。 7) 我们从 Spool 6 (Last Use) 通过 全行扫描,通过 全行扫描。线轴 6 和线轴 9 使用单个连接 分区哈希连接,连接条件为 ("DLOF_ID_NO = DLOF_ID_NO_RU")。结果进入 Spool 1 (group_amps),其中 在 AMP 上本地构建。结果假脱机文件不会 缓存在内存中。 Spool 1 的尺寸估计为低 置信度为 9,243,161 行(50,079,446,298 字节)。这 此步骤的估计时间为 0.60 秒。 8) 我们从 Spool 4 (Last Use) 开始执行一个全 AMPs JOIN 步骤 全行扫描,通过 全行扫描。 Spool 4 和 Spool 7 使用散列连接进行连接 2 个分区,连接条件为 ("DLOF_ID_NO = DLOF_ID_NO_RU")。结果进入 Spool 1 (group_amps),其中 在 AMP 上本地构建。结果假脱机文件不会 缓存在内存中。 Spool 1 的尺寸估计为低 置信度为 731,525 行(3,963,402,450 字节)。这 此步骤的估计时间为 0.96 秒。 9) 最后,我们向所有涉及的 AMP 发送 END TRANSACTION 步骤 在处理请求时。 -> Spool 1 的内容作为以下结果发送回用户 语句 1. 总估计时间为 6.84 秒。
【问题讨论】:
-
这是一个 n-1 连接,即其中一列是否有主键?否则你可能会简单地创造一个巨大的结果......你能展示一下解释吗?
-
结果并不大,大约是 400,000 条数据。我在任何表中都没有任何主索引。正如我所说,我用 PRIMARY INDEX 重新创建了表,但什么也没发生。
-
您能否显示解释并添加更多详细信息,例如连接列的统计信息?
-
您获得了“部分重新分配/部分复制”连接优化,因此您正在运行 TD14.10。分区连接对错误估计非常敏感,您能检查统计信息是否是最新的吗?
-
您好,很抱歉回答迟了。是的,我的统计数据是最新的!
标签: join optimization teradata jointable