小编rsj*_*ffe的帖子

我可以重构此查询以使其并行运行吗?

我有一个查询在我们的服务器上运行大约需要 3 个小时——而且它没有利用并行处理。(大约 115 万条记录dbo.Deidentified, 300 条记录dbo.NamesMultiWord)。服务器可以访问 8 个内核。

  UPDATE dbo.Deidentified 
     WITH (TABLOCK)
  SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml),
      DE461 = dbo.ReplaceMultiWord(DE461),
      DE87 = dbo.ReplaceMultiWord(DE87),
      DE15 = dbo.ReplaceMultiWord(DE15)
  WHERE InProcess = 1;
Run Code Online (Sandbox Code Playgroud)

ReplaceMultiword是一个过程定义为:

SELECT @body = REPLACE(@body,Names,Replacement)
 FROM dbo.NamesMultiWord
 ORDER BY [WordLength] DESC
RETURN @body --NVARCHAR(MAX)
Run Code Online (Sandbox Code Playgroud)

是呼吁ReplaceMultiword阻止形成平行计划吗?有没有办法重写它以允许并行?

ReplaceMultiword 以降序运行,因为某些替换是其他替换的简短版本,我希望最长的匹配成功。

例如,可能有“乔治华盛顿大学”和另一个来自“华盛顿大学”。如果“华盛顿大学”比赛是第一场,那么“乔治”就会被甩在后面。

查询计划

从技术上讲,我可以使用 CLR,只是我不熟悉如何使用。

performance sql-server parallelism sql-server-2016 query-performance

12
推荐指数
2
解决办法
838
查看次数

将行转换为包含列名的串联字符串

我有一张几百列宽的桌子。有没有办法将每一行转换为包含列标题的单个串联字符串,而不必列出查询中的每一列?

我这样做是因为列代表事件报告中的字段。我将它们重新组合在一起,以便人们可以以合乎逻辑的方式阅读报告。

我已经通过查询完成了其中的一些工作,但是为每一列都做起来很费力,而且似乎容易出错。

这是一个简短的片段,显示以我需要的格式连接的三列,在逐列方法中完成:

SELECT 
 Concat( 
   IIf(Id IS NULL, Null, Concat('Id: ' , [Id] , '\n') )  , 
   IIf(StandardClientId IS NULL, Null, 
     Concat('StandardClientId: ' , [StandardClientId] , '\n') )  , 
   IIf(ClientName IS NULL, Null, 
     Concat('ClientName: ' , [ClientName] , '\n') ) 
 )  AS ReportLine
FROM dbo.DataDecoded; 
Run Code Online (Sandbox Code Playgroud)

谢谢

sql-server pivot

6
推荐指数
3
解决办法
2480
查看次数

可以向 SQL Server 添加一个 CLR 函数,但不能在同一程序集中添加第二个:加载错误的 DLL

使用以下代码,我使用 csc 来编译 dll。然后我将程序集添加到 sql server 2014 使用

CREATE ASSEMBLY ReplaceMultiWord from 'd:\bcp\ReplaceMultiWord.dll' WITH PERMISSION_SET = SAFE;
Run Code Online (Sandbox Code Playgroud)

然后成功添加了第一个功能

CREATE FUNCTION dbo.ReplaceMultiWord
(@inputString AS NVARCHAR(MAX), @replacementSpec AS XML) RETURNS NVARCHAR(MAX)
AS
EXTERNAL NAME ReplaceMultiWord.UserDefinedFunctions.ReplaceMultiWord;
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试添加第二个功能时

CREATE FUNCTION dbo.CanReplaceMultiWord
(@inputString AS NVARCHAR(MAX), @replacementSpec AS XML) RETURNS BIT
AS
EXTERNAL NAME ReplaceMultiWord.UserDefinedFunctions.CanReplaceMultiWord;
Run Code Online (Sandbox Code Playgroud)

我收到错误

Could not find method 'CanReplaceMultiWord' for type 'UserDefinedFunctions' in assembly 'ReplaceMultiWord'
Run Code Online (Sandbox Code Playgroud)

下面是我的代码。为什么 sql server 看不到第二个函数?

using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Xml;

public partial class …
Run Code Online (Sandbox Code Playgroud)

sql-server c# sql-clr sql-server-2014

3
推荐指数
1
解决办法
934
查看次数