文本解析的优化-oraclesql
我正在处理一个SQL查询,该查询将统计某些单词在长文本中的外观,或是一个CLOB数据类型的巨大文本字段 我的数据集非常庞大,大约500万行,看起来像这样:文本解析的优化-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%'
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”权限