0

複数のクエリを同時に実行する検索機能をセットアップしました。各クエリの上位 1000 件の結果がテーブルに書き込まれます。(これらは非同期で実行されます。そのために使用しているコードを省略しています)

Insert into Results
Select Top 1000 Text from A where Contains(Text,'"searchString"')

Insert into Results
Select Top 1000 Text from B where Contains(Text,'"searchString"')

Insert into Results
Select Top 1000 Text from C where Contains(Text,'"searchString"')

次に、そのテーブルから上位 1000 件の結果を選択します。

Select Top 1000 * from Results

プロセスの早い段階で、すでに 1000 件の結果があるかどうかを効率的にチェックし、ある場合は、他のクエリをキャンセルして 1000 件の結果をできるだけ早く選択する良い方法はありますか。

4

4 に答える 4

2

以下は、1,000 番目の行が見つかった後は行を処理しないという目的の結果を達成する計画を示している可能性があります。

WITH CTE
     AS (SELECT Text
         FROM   A
         WHERE  CONTAINS(Text, '"searchString"')
         UNION ALL
         SELECT Text
         FROM   B
         WHERE  CONTAINS(Text, '"searchString"')
         UNION ALL
         SELECT Text
         FROM   C
         WHERE  CONTAINS(Text, '"searchString"'))
INSERT INTO Results
SELECT TOP 1000 Text
FROM   CTE 
于 2012-11-09T14:51:45.530 に答える
1

ID列を使用して結果テーブルを設定すると、このクエリを使用して目標を達成できます(「counter」をその列にします。インデックスを付けることを忘れないでください)。

declare @remaining int
select @remaining = 1000 - (max(counter) - min(counter) + 1) from result
if @result>0
  insert into Result (Text) select top (@remaining) Text from MyTable

また、テーブル名のリストがある場合は、whileループを使用して、@resultが0の場合に終了できます。

于 2012-11-11T09:33:00.367 に答える
0
insert into #tt2 
SELECT TOP 1000 [sID]
FROM [docSVsys]
where (select count(*) from #tt2) < 1000

しかし、私はまだ.NETとTPLを使用します。

これでもすべてのテーブルが処理されますが、1000に達すると0行が処理されます。

于 2012-11-09T16:56:03.300 に答える
0

次の SQL は、後続のクエリからの行数を 4 に制限します。

SET ROWCOUNT 4

SET @Rows = @@ROWCOUNT

前の選択から行数を取得する

のようなもの

SELECT TOP など

SET @Rows = @@ROWCOUNT

SET ROWCOUNT 1000 - @Rows

@row がゼロを下回ると、おそらくエラーになります

しかし、これをIFでトラップし、PROC_LABLEに移動します

于 2012-11-09T14:52:11.703 に答える