我有一个C# CLR执行多个字符串操作。它返回一个int。我用的是
SELECT func(col1, col2) AS Score
INTO #A
FROM table;
SELECT *
INTO #B
FROM #A
WHERE Score > -1如果我做了这样的事
SELECT func(col1, col2) AS Score
INTO #A
FROM table
WHERE func(col1, col2) > -1;是否有两次调用和执行CLR?就性能/速度而言,是否有更好的方法来获得同样的结果?
col1是nvarchar(max),col2是nvarchar(800)。该函数包含业务逻辑。
大约有100亿行/计算
发布于 2022-08-24 17:00:15
如果您可以合理地将IsDeterministic和IsPrecise属性放在函数上(非常肯定IsDeterministic,非常肯定IsPrecise';我现在无法找到有关需求的文档),那么您可以向表中添加定义为func(col1, col2)的计算列并对其进行索引。它将使函数在查询时不被调用,而是在插入/更新行时调用。我的建议是尝试在运行之前添加计算列并将其索引到表的一个小版本上。这就是:
select top(100) * into dbo.TestTable from dbo.YourTable;alter table dbo.TestTable add NewColumn as dbo.func(col1, col2);create index FuncIndex on dbo.TestTable (NewColumn);和/或,如果您有一个非生产环境,做它的活桌子在那里。
如果对该列上可能查询的谓词进行筛选是有意义的,则可以对索引进行筛选。但这是一个普遍的索引问题,而不是特定于您的情况。
https://stackoverflow.com/questions/73428476
复制相似问题