对于所有ASCII字符1-255,我需要计算列(varchar(x))包含特定字符的记录数。这就是我到目前为止(在一个过程中)......
DECLARE @CHAR TINYINT = 1
CREATE TABLE #CHARCOUNTS (CHAR TINYINT, COUNT INT)
WHILE @CHAR < 255
BEGIN
INSERT INTO #CHARCOUNTS(CHAR, COUNT) VALUES (@CHAR,(SELECT COUNT (ID) FROM MyTable WHERE CHARINDEX(CHAR(@CHAR), MyColumn) > 0))
SET @CHAR = @CHAR + 1
END
SELECT CHAR, COUNT FROM #CHARCOUNTS
这会返回一个结果集,告诉我有包含CHAR(1)
的X记录,包含CHAR(2)
的X记录等等,但是我猜这个查询需要几分钟才能完成约500万条记录它必须遍历每条记录255次。有关更有效/更快的方法的任何建议吗?
非常感谢。
答案 0 :(得分:2)
试试这个基于SET的方法。
使用Recursive CTE
生成数字。
然后使用cross apply
查找列中每个count
的{{1}}。在一次性镜头中,您可以找到所有char
计数,并且在500万条记录中也char
插入而不是single
插入,因此这将具有更好的性能。
255
注意:有很多方法可以生成数字,因为这里的计数非常少,我选择了;WITH cte
AS (SELECT 1 chars
UNION ALL
SELECT chars + 1
FROM cte
WHERE chars < 255)
INSERT INTO #CHARCOUNTS
(CHAR,COUNT)
SELECT chars,
[count]
FROM cte
CROSS apply (SELECT Count (ID) [count]
FROM MyTable
WHERE Charindex(Char(chars), MyColumn) > 0) cs
OPTION (maxrecursion 256)
而不是其他方法。查看here了解详情