【问题标题】:Teradata SQL Performance Tuning: STRTOK_SPLIT_TO_TABLE: EXPLAIN Failed. 3738: String is longer than 31000 charactersTeradata SQL 性能调整:STRTOK_SPLIT_TO_TABLE:EXPLAIN 失败。 3738:字符串长度超过 31000 个字符
【发布时间】:2016-02-26 06:49:15
【问题描述】:

我可能再次抱有希望,但在列表中使用 STRTOK_SPLIT_TO_TABLE 时,我的列表中的字符 > 32K,它给了我上述错误

EXPLAIN Failed. 3738:  String is longer than 31000 characters

我做了什么

拆分字符串并使用2个STRTOK_SPLIT_TO_TABLE创建2个不同的表 然后加入我的主表

TD Error 文档中的实际错误翻译建议使用“USING 后跟数据包”。据我了解,您不能在 UDF 中做所有这些事情 那么除了拆分字符串之外,还有其他方法吗? 我有 400K 的列表内字符串,我想避免加载到 VT,因为这似乎有其自身的开销成本,所以使用这个函数,但它从来没有工作过。


    EXPLAIN 
SELECT  COL1 
FROM    DB.TB1 , ( 
SELECT  TOKEN2 
FROM    TABLE ( STRTOK_SPLIT_TO_TABLE( 1 , '123456,123456,43456,......20K Long string' ,
','  ) 
RETURNS ( OUTKEY INT , TOKENNUM INT , TOKEN2 VARCHAR ( 20 ) CHARACTER 
SET unicode ) ) DD ) D2 ,


 ( 
SELECT  TOKEN1
FROM    TABLE ( STRTOK_SPLIT_TO_TABLE( 1 , '123456,123456,43456.....20K long string' ,','  ) 
RETURNS ( OUTKEY INT , TOKENNUM INT , TOKEN1 VARCHAR ( 20 ) CHARACTER 
SET unicode ) ) DD ) D1 

WHERE   SUBSTR ( TB1.COL2 , 21 , 9 ) = d2.token2 

or  SUBSTR ( TB1.COL2 , 21 , 9 ) = d1.token1
GROUP BY 1 ;


/* the same logic can be re-wrritten 
   with a UNION  or  Where EXISTS logic  
      but focus's on that UDF */

所以总结一下......

  • 我必须将字符串长度进一步拆分为更小的位。两个还不够。当字符串真的那么大以至于值得运行拆分字符串 UDF 时,您如何利用 UDF 功能? 这是我使用较小字符串时遇到的错误。我的explain 会运行良好,因为 UDF 会抛出这个错误

    Query Failed. 9134:  STRTOK: Input string exceeded the max. allowed string   length. 
    
  • 它不允许我使用拉丁语。我的表是拉丁语,因此它使用导致字符集转换的翻译开销。这里有解决方法吗? (也许您自己从 UDF 转换输出列,因此优化器不会在连接列上执行此操作。但这在改进方面并不重要,因为优化器无论如何都会选择用较少的行转换字符集)

顺便说一句:我在 14.1 上,如下所示

    instring
a character or CLOB argument.
If instring is NULL, the STRTOK_SPLIT_TO_TABLE returns NULL.

从文档中 - 我可以为 instring 粘贴一个 CLOB。因此,即使在我的 > 32K 字符串被投射为 CLOB 之后,它也会抛出

EXPLAIN Failed. 3738:  String is longer than 31000 characters

最后 ....使用 character_length ('string in D1') 和 (' ditto d2') 我得到 19K。它说 instring 的 varchar (32000 ) 限制,所以想知道为什么拒绝?

更新:我可以 CLOB D1 和 D2 并限制为 2 个字符串的方法并溜出 9134 错误。但是仍然存在 2 个警告 -

  • 这个 UDF 只喜欢 UNICODE 作为 token 。我为令牌添加了一个“翻译”,无论它值多少钱。
  • 当我用这个进行测试时,我不太了解 32K 逻辑是如何工作的

    sel Character_length ('string here' )

    返回一个

因此,在查询的较小组件中使用它可以正常工作。我可以将字符串列表转换为表格,让这些加入并拉出我感兴趣的 ID 列表,但是当我将组件插入到更大的报告中时,它会变得异常 - “本地 AMP 中的分段错误不重新提交”。 ... 所以我不得不适应另一种方法。

【问题讨论】:

    标签: sql user-defined-functions teradata data-warehouse sqlperformance


    【解决方案1】:

    这可能是teradata UDF 中的一个错误,尽管instring 的长度小于 32K,但它会拒绝它。

    sel char_length ('string 32K or less' ) will give o/p 
    31890 
    

    当我在这里使用它时

    SELECT  COL1 
    FROM    DB.TB1 , ( 
    SELECT  TOKEN2 
    FROM    TABLE ( STRTOK_SPLIT_TO_TABLE( 1 , '123456,123456,43456,......32K Long string' ,
    ','  ) 
    RETURNS ( OUTKEY INT , TOKENNUM INT , TOKEN2 VARCHAR ( 20 ) CHARACTER 
    SET unicode ) ) DD ) D2 
    

    它将失败,失败点在 32K 的一半左右。超过 16K 个字符将失败。 但是使用 CLOB 使它工作 除了一个错误,我无法提供其他解释

    SELECT  COL1 
    FROM    DB.TB1 , ( 
    SELECT  TOKEN2 
    FROM    TABLE ( STRTOK_SPLIT_TO_TABLE( 1 , '123456,123456,43456,......32K Long string' ( CLOB)  ,
    ','  ) 
    RETURNS ( OUTKEY INT , TOKENNUM INT , TOKEN2 VARCHAR ( 20 ) CHARACTER 
    SET unicode ) ) DD ) D2
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2012-09-08
      • 1970-01-01
      • 2020-03-19
      • 2021-06-20
      相关资源
      最近更新 更多