2012-01-11 2 views
0

私はHostNameという1つのフィールドを持つテーブルを持っています。これはテキストフィールドで、最大100文字です。私はそれを使用してDNSホスト名を格納します。このフィールドはプライマリキーとして設定されています。私は次のクエリを実行する場合には、期待される結果を返しますが、1万件のレコードをテーブルの上に完了するまでに約8秒かかります:(((HostsRev.HostName)> HostsRev FROMインデックスを使用しないアクセスクエリ

SELECT TOP 1 HostsRev.HostName = "test")) ORDER BY HostsRev.HostName;

"ORDER BY"部分を削除した場合、1秒未満で戻りますが、> = "テスト"の最初のレコードではありません。

私はC++アプリケーションからADOを使用してクエリを実行していますが、Accessでもテストを行い、クエリを作成して同じ結果を得ました。

私が必要とするのは、指定された文字列で始まる最初のレコードがあれば、それを素早く見つけることです。 LIKEクエリを使ってみましたが、同じ結果が出ました。 images.google.comで検索した場合、リストにgoogle.comは含まれていますが、images.google.comは含まれていないかどうかを知る必要があるため、これを行う必要があります(実際に正しく動作させるには、ルックアップを実行する前に文字列を反転させてください)。

答えて

1

それは異なる順序で返すため、異なる結果が得られます、ORDER BYなしで、あなたの代わりに、次の試みることができるように、問題は、それ自身のTOPコマンドがデータに並べ替え適用されないということです。

SELECT Min(HostName) FROM HostsRev WHERE HostName >= "test" 

わからないとはいえ、これは任意のより良い性能を与えるが、価値が行く場合:)

+0

これは問題でしたが、私はちょっと別の方法で解決しました。私のホスト名は既知の形式を使用しているので、WHERE HostName> = "test" AND HostName <= ".test"のようなものを追加しました。 – eselk

0

私はあなたがC++プログラマされていない、C++からこの操作を行うことができるかどうかわからないが、しかし、ADOはにプロパティ.INDEXをサポートしています使用するインデックスを設定し、そのインデックスで検索する.seekメソッドを使用できます。ここにはVBでの価値のあるコードがいくつかあります。

Dim conn As ADODB.Connection 
Dim rs As ADODB.Recordset 

Set conn = New ADODB.Connection 
conn.Open ConnectionString 

rs.Open "mytable", conn 
rs.Index = "primarykey" 
rs.Seek "test", adSeekAfterEQ 
If rs.EOF Then ' record not found 
関連する問題