2017-10-22 2 views
-1

特定の条件に達した後に実行を停止または停止できるSQL Server 2016クエリを開発することは可能ですか?カウントに基づいてSQLクエリを停止する

SELECTステートメントから返された別個のレコードの数が10K未満の場合にのみデータを返すストアドプロシージャを開発しました。したがって、プロシージャは最初に異なる値のカウントを取得し、次にSELECT文を実行して、実際のデータを取得して戻します。カウントが10Kを超えて戻った場合、実際のデータをフェッチするためにクエリを再度実行する代わりに、単にカウントを返すだけです。

テーブルには、特定の入力パラメータに対して、8000万レコード近くの実績があり、結果のレコード数が10K未満の場合は10-15秒で結果が返されます。

特定の入力パラメータの場合、手続きは4〜5分近く実行され、出力として約15-20,000,000を返します。

私は10001番目のレコードに達するとすぐにカウントクエリを停止する方法を探しています。私はあなたが一時的に使用することを示唆している

DECLARE @Count BIGINT 

SELECT @Count = COUNT(DISTINCT ZIP) 
FROM dbo.Member (NOLOCK) 
WHERE FirstName = @FirstName 

IF @Count < 10001 
BEGIN 
    SELECT * 
    FROM dbo.Member 
    WHERE FirstName = @FirstName 
END 
ELSE 
BEGIN 
    SELECT @Count --When Count is greater than 10K, returns just count 
END 

おかげ

+0

このような意味がありますか?SELECT TOP 10000 column_name FROM table_name WHERE条件; ?それとも私が見ていない別の問題がありますか? – koksalb

+0

'MemberNumber'は本当に複製されていますか? –

+0

@Koksalbプロシージャは、SELECTクエリが10K未満のレコードを返す場合にのみデータを返します。 10Kを超えるレコードがある場合、プロシージャはデータを返さず、単にカウントを返し、データは返しません。 TOPキーワードは私の場合は助けにならないでしょう。 – Sharmi

答えて

0

ストアド・プロシージャは、この(実際の手順では、select文はWHERE句に複数の条件を持つことになります)のようになります。表:次に

select top 10001 m.* 
into #member 
from dbo.Member m 
where . . . ; 

if (@@rowcount > 10000) 
begin 
    select count(distinct MemberNumber) 
    from . . . 
end; 
else 
begin 
    select * 
    from #member; 
end; 

少なくとも、必要な場合にのみcount(distinct)のオーバーヘッドが発生します。

これらの場合、クエリの処理速度は向上しませんが、distinctを取り除くとパフォーマンスに大きな影響が出ます。

+0

提案いただきありがとうございます。あなたが提案した一時テーブルアプローチを試してみます。テーブルにレコードが重複しているため、クエリでdistinctを回避することはできません。あなたの提案をもう一度おねがいします。 – Sharmi

関連する問題