2016-11-18 10 views
3

数百万行のNVARCHAR(255)列をクリーンアップしようとしています。 355問題文字リストにある文字を置き換えたい(Á - > A)か、文字を削除したい。私は、問題の文字と置換文字を含むテーブルを作成しました。大規模なデータセットでSQL Server Characterが置換される

ループ型のバッチでいくつかのシナリオを試しました。私のローカルデベロッパーボックスで得た最高のパフォーマンスは、1分〜1.5分で約50,000行です。私はそれを改善することを望んでいます。新しいフィールドにはインデックスがありません。まず、問題キャラクタテーブルに参加するCTEです。

;WITH UctE (ID, Name, [Count]) AS (

      SELECT ID, Name, 1 AS [Count] 
      FROM dbo.tableName t1 
      WHERE t1.ID BETWEEN @StartAtID2 AND @EndAtID2 

      UNION ALL 

      SELECT UctE.ID, CONVERT(NVARCHAR(255), REPLACE(UctE.Name, cr.ProblemChar, COALESCE( cr.ReplacementChar, '')))AS Name, [Count] + 1 
      FROM UctE, 
        dbo.CharReplace cr 
      WHERE cr.CharReplaceID = [Count] 

     ) 
      UPDATE mp 
       SET nameversioned = ucte.Name 
       FROM dbo.Table1 mp 
     INNER JOIN UctE 
       ON UctE.Id = mp.ID 
       AND ucte.[Count] = 335 
      OPTION(MAXRECURSION 0); 

このバージョンの別のバージョンでは、問題のある文字と置換文字をすべて含むreplaceステートメントが使用されています。 REPLACE(REPLACE ...無限大に。

;WITH UctE (ID, Name) AS (

      SELECT ID, (SuperLongReplacestatement) 
      FROM dbo.tableName t1 
      WHERE t1.ID BETWEEN @StartAtID2 AND @EndAtID2 

     ) 
      UPDATE mp 
       SET nameversioned = ucte.Name 
       FROM dbo.Table1 mp 
     INNER JOIN UctE 
       ON UctE.Id = mp.ID 
      OPTION(MAXRECURSION 0); 

(REPLACE(REPLACE私もCTEのせずに試してみたが、私はバッチサイズは、CTEでパフォーマンスが向上することを期待していた。また、これは私の最初のものです時間の投稿は、私がrambledか悪いこれを書いているので、もし、私に知らせてください

+0

大きなテーブルを更新する必要はありません。このような置換は、データのロード中に行われます。 –

+0

データの何%を変更する必要がありますか? INSERT文を使用すると、すべてのデータを新しいテーブルにコピーし、元のテーブルとの間でパーティションを切り替えることができます。パーティションの切り替えはほとんど瞬間的です。これはETLジョブの一般的なテクニックです –

+0

また、これらの文字はなぜ問題になると考えられていますか?彼らは単なる文字です。おそらく変換の問題はありますか?有効な文字を置き換えることは良い考えではありません。どこにいても変換問題を修正する方が良い –

答えて

0

以上の部分にクエリを分解し

プロセス:。。

  1. あなたが希望のすべての行のキーを探します更新したい - >検索するあなたが置きたい文字を含むすべての文字列。
  2. キーの文字列を取得します。
  3. 不要な文字をすべて削除します。
  4. キーとキーを結合して、クリーンな文字列を混乱した文字列に設定します。

あなたは、(一バッチで)直接更新する場合、排他的なロックでテーブルを長期間ロックすることができます。

特別な照合を試すことができます。たとえば、SQL_Latin1_General_CP1251_CI_ASを使用すると、ěščřžýáíéúůや他の多くの「不要な」文字を削除できます。

+0

問題の文字が出現したときにテーブルを結合する方法を試しましたが、照合コストは屋根を通過していました。 – jmhill

+0

はい、プロセス "getwrongdata"と "setcorrecteddata"を分けなければなりません。照合を使って魔法を試したり、間違ったデータの例を追加したりしてください。 – Deadsheep39

関連する問題