SQL 每个 ID 的服务器词频

SQL Server Word Frequency for Each ID

我有一个 SQL 服务器 table,它有一个 ID 和一个大小约为 15,000 字的文本列。对于每个 ID,我想 return 一个包含每个唯一单词及其出现次数的列表。

CREATE TABLE MyComments (
Textid char(20) NOT NULL,
Comments VARCHAR(MAX)
)

Answer would look like
    TextID  Word     WordCount
    ------- ------   ----------
    1        cost     5
    1        expense  7
    2        cost     12
    2        revenue  11
 

..

这并不是 SQL 服务器的设计目的;对于很大的 table(大量的行,像 15K 这样的超长文本,或两者兼而有之),执行此操作将非常昂贵。如果你的 table 很小:

SELECT c.Textid, Word = s.value, WordCount = COUNT(*)
  FROM dbo.MyComments AS c
  CROSS APPLY STRING_SPLIT(c.Comments, ' ') AS s
  GROUP BY c.Textid, s.value
  ORDER BY Textid;

在规模上,这个查询会很糟糕。

@lptr pointed out 一样,在大规模情况下可能会更好地以更复杂的方式重新排列此查询,以便拆分与其余逻辑分开:

SELECT c.Textid, Word = s.value, s.WordCount
  FROM dbo.MyComments AS c
  CROSS APPLY
  (
    SELECT value = CONVERT(varchar(255), value),
           WordCount = COUNT(*)
      FROM STRING_SPLIT(c.Comments, ' ')
      WHERE LEN(value) > 0
      GROUP BY CONVERT(varchar(255), value)
  ) AS s
  ORDER BY c.textid;

但这仍然很慢(对于 8,000 行 table,它执行了将近 600,000 次读取并花费了大约 15 秒)。我不相信 SQL 服务器是做这项工作的地方。