17

何十回もテーブルに参加していますが、毎回、列の 1 つの SUBSTRING の結果に基づいて結合 (またはフィルター処理) しています (文字列ですが、左側にゼロが埋め込まれています。最後の 4 桁は気にしないでください)。その結果、この列にインデックスが付けられ、クエリでインデックスが使用される場合でも、SUBSTRING 自体にインデックスが付けられていないためテーブル スキャンが実行されるため、SQL Server は結合する前にすべての行に対してそれを計算する必要があります。

このプロセスをスピードアップする方法についてのアイデアを探しています。現在、テーブルにビューがあり (テーブルにわかりやすい名前を付けるためだけに「SELECT * FROM」です)、計算されたビューに列を追加し、それをインデックス付けすることを検討しています。ただし、他の提案も受け付けています-何か考えはありますか?

詳細: 最初にこれを共有する必要がありました。テーブルは課金システムからレプリケーションを受信するため、基になるテーブルを編集して計算列を追加することはできません。計算列は、テーブルのビューに追加する必要があります。また、先行ゼロは常に先行ゼロであるとは限りません。それらは、私が興味のない他のデータである場合もあります。本当の問題は、「VARCHAR 列の途中にあるデータに結合しながら、それを利用するにはどうすればよいか」だと思います索引の? 全文検索?

私の例を明確に するために単純化していますが、基本的には、次の値を持つ列の値を検索しようとしているとしましょう:

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff

SUBSTRING(7,5)="12345" の行に興味があるので、行 1 ~ 4 が必要ですが、行 5 は必要ありません。私が提案しているのは、「SELECT *」ビューに列を追加することです。この部分文字列が含まれており、それに基づいてインデックスが作成されます。それはもっと理にかなっていますか?

4

4 に答える 4

13

フィールドが次の形式であると仮定します。

00Data0007
000000Data0011
0000Data0015

、次のことができます。

  • 計算列を作成します。ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    これにより、列が次のように変換されます。

    ataD00
    ataD000000
    ataD0000
    
  • その列にインデックスを作成します

  • 次のクエリを発行して、文字列を検索しますData

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    最初の条件は、粗いフィルタリングにインデックスを使用します。

    2 つ目は、先頭のすべての文字 (計算列の末尾の文字になった) がすべてゼロであることを確認します。

パフォーマンスの詳細については、ブログの次のエントリを参照してください。

アップデート

SUBSTRINGスキーマを変更せずにインデックスのみが必要な場合は、ビューを作成することもできます。

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'
于 2009-08-24T16:46:59.733 に答える
6

テーブルに計算列を追加し、この列にインデックスを作成します。

ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)

次に、これに索引を作成します。

CREATE INDEX CodeHeadIdx ON MyTable.CodeHead
于 2009-08-24T16:46:14.040 に答える
1

LIKE 'something%' ステートメントの観点からフィルター基準を言い換えることはできますか? (これはインデックスに適用されます)

于 2009-08-24T16:02:30.413 に答える
0

列を 2 列 (結合するデータと余分な 4 文字) に変更します。これまで見てきたように、列の一部を使用すると処理が遅くなります

于 2009-08-24T16:43:37.773 に答える