2

文字列 (完全なパスを含むファイル名) に MSSQL の別の文字列が含まれているかどうかをテストする必要があります。

私のスクリプトは、コミットしようとしているファイルが特定の列の下のデータベースに存在するかどうかを確認する必要があります (プレフック スクリプト)。

列のデータ定義を実際に変更することはできませんが、現在テキストTEXTを使用しており、ファイルは改行文字で区切られています。TSQL 関数を使用しようとしましCONTAINSたが、全体的なパフォーマンスはあまり良くありません。

すべてのデータを PHP 配列にロードし、ローカルで比較を行う方がよいでしょうか?

ここで何をするのが最善の方法なのかよくわかりません。

更新:データベースには約 194,530 行あります。

4

3 に答える 3

1

LIKE演算子を使ってみませんか?あなたはこのようなことをすることができます

SELECT * FROM TABLE WHERE COLUMN LIKE '%' + @FilePath +'%'

これがあなたのニーズに合わない場合は、プログラムでこれを行う方が良いかもしれないことに同意します。問題は、SQLがセットベースのロジックを使用しているため、より手続き的な(関数)何かを始めたときに、SQLが機能しなくなることです。明らかに、テストを実行しますが、プログラムでこれをより速く実行できるはずです。正規表現やcontainsなど、php内で最適なものを使用できます

于 2012-03-26T17:24:27.090 に答える
1

私はこれがより速いと思います:

SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%'
于 2012-03-26T17:40:18.003 に答える
1

文字列を検索する際に留意すべき主な点は、検索する文字列の長さを制限することです。現在、複数のパスとファイル名の値が 1 つの行と列のペアに押し込まれています。上で述べたように、これは正規化が不十分です (これがルックアップに問題がある理由の 1 つです)。

問題が発生しているテーブルのスキーマを実際に変更できないことを考えると、より良い代替手段は、特定の行に格納されているファイルを記述するメタデータを操作する構造を作成することです。

たとえば、元のテーブルの各行が、その行の列内の解析されたファイル名にリンクされているfilename-ペアを含むテーブルを作成することが 1 つのオプションである可能性があります。これにより、最初に短い文字列 ( ) を検索して検索を制限し、次にその制約を使用してより少ない数の行を検索し、パスとファイル名の組み合わせを満たし、一意の結果を得ることができます。rowIDTEXTfilename

同じ名前のファイルが多数ある場合、別のオプションとしてrowID、元のテーブルの s を使用してハッシュ インデックスを実装し、その行の各パス + ファイル名のハッシュを使用するCHECKSUM()か、使用可能な任意のハッシュ関数を使用することもできます。

このような「インデックス作成」テーブルを使用すると、オーバーヘッドが追加されます。元のテーブルが更新されるときにメタデータを維持する必要がありますが、それはまた、事前に面倒な作業を行い、データの将来のクエリをはるかに高速にすることも意味します。

于 2012-03-26T18:20:14.893 に答える