2010-12-13 10 views
0

SQL Server 2008では、ユーザーがデータベースに対してクエリを実行できるアプリケーションがあります。数百万の結果と税制のシステムリソースを返すクエリを実行しないようにしたい。ユーザーが自分でCOUNT(*)を実行しようとするまで細かい作品一般的なSQL Serverのカウントの構文

Select count(*) as COUNT 
from (SELECT SOMETHING FROM SOMETABLE) as TMPCOUNT0; 
:現在のソリューションはそうのような数(*)関数内で入力されているものは何でも、クエリのラップです。いいえ列名が「TMPCOUNT0」の1列目に指定されなかった

Select count(*) as COUNT 
from (SELECT COUNT(*) FROM SOMETABLE) as TMPCOUNT0; 

--(should return 1) 

ただしSQL Serverは、と私のインナーCOUNT(*)コラムは私の派生テーブルとエラーアウトに名前がないことを好きではありません。

は、私は、内数名を指定して、クエリを実行していた場合、私はこの問題を解決する可能性が知っているが、エンドユーザーはこのことを認識しないので、私はよりエレガントな解決策を見つけることを願っています。

アイデア?

+0

私はいつもこうします:SELECT count( 'x')FROM SOMETABLE;任意の列をフェッチする必要はありません。 count()を2回も実行しません。 –

+0

@Eric K. Yung:「COUNT(1)」がCOUNT(*)より効率的であるという都市神話です.SQL Serverのクエリオプティマイザは、これが単なるCOUNT操作であることを理解するほどスマートです。式の中の(*)のためにすべてのデータを "フェッチ"します... –

+0

@Eric K. Yung、@marc_s:都市の神話確かに:-) http://stackoverflow.com/questions/1221559/count-vs- count1/1221649#1221649 – gbn

答えて

0

エラー

ませ列名を 'TMPCOUNT0' の1列目に指定されませんでした。

内部クエリに列名を指定しなかったために発生しました。内側のクエリが

SELECT COUNT(*) **as c** FROM SOMETABLE as TMPCOUNT0 

として読むべき

このクエリは1を返しますが、内側のクエリでその数のエイリアス名を指定する必要があります。

Select count(c) as [COUNT] from (SELECT COUNT(*) as c FROM SOMETABLE) as TMPCOUNT0 
+0

これは彼が内側のクエリを制御しないので、OPを助けません。 –

+0

別のオプションは、一時テーブルに結果を取得し、そこからカウントを取得することで、結果を制御することもできます。 – wizzardz

+0

テンポラリテーブル全体を構築することは、依然として問題を求めています。 –

3

最初のを返すために

SELECT TOP(1000) ...

またはSET ROWCOUNT 1000

代わり

を指定することで、あなたは結果を制限について(*)の問題が、何をCOUNT解決する方法がわかりません千行

4

Stack Exchange Data Explorerが存在する前に、私は小さなサイトでプレイして、人々がパブリックStack Overflowデータセットでクエリを実行できるようにしました。私の最初のサービスは、Atom 330によるもので、私の家では2GBのRAMしかホストされていなかったので、私はサーバを完全に引き継ぎ、私の家庭のブロードバンド接続を氾濫させないように制限されたクエリを心配しました。

最後に、@Philip Fourie's answerSET QUERY_GOVERNOR_COST_LIMITに記載されているSET ROWCOUNTオプションの組み合わせがありました。後者は多くのチューニングが必要で、ユーザーが知っているか試してみるとどちらも上書きできるため、すべてのクエリが記録されていますので、不正使用を発見することができます。

この組み合わせには弱点がありますが、うまく機能しました。

+0

+1についてはQUERY_GOVERNOR_COST_LIMIT - それについては知らなかった! – egrunin

関連する問題