文本解析的优化-oraclesql

文本解析的优化-oraclesql,sql,oracle,oracle11g,sql-like,Sql,Oracle,Oracle11g,Sql Like,我正在处理一个SQL查询,该查询将统计某些单词在长文本中的外观,或是一个CLOB数据类型的巨大文本字段 我的数据集非常庞大,大约500万行,看起来像这样: SELECT TheTask AS Tasking, SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%LONG%' THEN 1 ELSE 0 END) AS LongCount, SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%TEXT%'

我正在处理一个SQL查询,该查询将统计某些单词在长文本中的外观,或是一个CLOB数据类型的巨大文本字段

我的数据集非常庞大,大约500万行,看起来像这样:

SELECT
  TheTask AS Tasking,
  SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%LONG%' THEN 1 ELSE 0 END) AS LongCount,
  SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%TEXT%' THEN 1 ELSE 0 END) AS TextCount,
  SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%ENGLISH%' THEN 1 ELSE 0 END) AS EnglishCount
FROM
  example
GROUP BY
  TheTask
我有一个问题,像这样:

SELECT
  TheTask AS Tasking,
  SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%LONG%' THEN 1 ELSE 0 END) AS LongCount,
  SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%TEXT%' THEN 1 ELSE 0 END) AS TextCount,
  SUM(CASE WHEN TRIM(UPPER(TheTaskText)) LIKE '%ENGLISH%' THEN 1 ELSE 0 END) AS EnglishCount
FROM
  example
GROUP BY
  TheTask
但是,在完整的数据集上运行需要非常长的时间,大约需要3个小时。我相信这是由于,但我不确定如何实现这一目标。我曾尝试研究其他文章,但是否有可能REGEX或其他东西会更快?我希望通过评估LIKE性能来优化此查询。

上下文索引类型用于索引长文本。您可以使用:

在示例TrimUpper上创建索引idx_thetasktext,tasktext索引类型为CTXSYS.CONTEXT

并收集统计信息以使优化器生效:

EXEC DBMS_STATS.GATHER_TABLE_statuser,'EXAMPLE',cascade=>TRUE

打电话

SELECT
  TheTask AS Tasking,
  SUM(CASE WHEN CONTAINS(TRIM(UPPER(TheTaskText)), 'LONG', 1) > 0 THEN 1 ELSE 0 END) AS LongCount,
  SUM(CASE WHEN CONTAINS(TRIM(UPPER(TheTaskText)), 'TEXT', 1) > 0 THEN 1 ELSE 0 END) AS TextCount,
  SUM(CASE WHEN CONTAINS(TRIM(UPPER(TheTaskText)), 'ENGLISH', 1) > 0 THEN 1 ELSE 0 END) AS EnglishCount
FROM example
GROUP BY TheTask
HAVING 
       SUM(CASE WHEN CONTAINS(TRIM(UPPER(TheTaskText)), 'LONG', 1) > 0 THEN 1 ELSE 0 END) * 
       SUM(CASE WHEN CONTAINS(TRIM(UPPER(TheTaskText)), 'TEXT', 1) > 0 THEN 1 ELSE 0 END) *
       SUM(CASE WHEN CONTAINS(TRIM(UPPER(TheTaskText)), 'ENGLISH', 1) > 0 THEN 1 ELSE 0 END) 
       IN (0,1)

我不知道那是什么。`LIKE'%sth'是不可销售的,所以它的性能很差。如果您真的需要搜索文本,那么FTI就是您所需要的。每次运行查询时,单词是否不同?如果没有,则可以在插入带有TIRGER的行时计算它们,例如,并使用单独的列存储值。问题是我正在处理历史数据集,我无法控制对数据库应用程序@PavelSmirnov的任何“W”权限