2011-03-29 30 views
1

我在我的系統中生成報告,但一些報告返回了大量的結果。爲了解決這個問題,我先用數字命中數據庫,然後在我的代碼中檢查這個數是否高於某個閾值(例如2000),然後不生成報告。SQL停止計數在給定的閾值

這在大多數情況下都很好,但有些報告有超過一百萬個結果,這意味着需要計數幾秒鐘才能返回結果。理想情況下,我想要做的是將我的閾值(2000)放入我的sql語句中,如果達到此值,則停止計數並返回一些值(例如true或false,0或1,所有內容)我知道它已經超出了它的極限。這是可能的SQL,到目前爲止我找不到解決方案。

僞代碼:從表中SELECT COUNT(1),而數< =門檻

我使用Java,休眠,SQL Server 2005中

任何幫助將非常感激。

問候,

埃蒙

回答

1

我覺得這樣的事情應該工作:

select count(1) from (
    select top 2000 * 
    from table 
    where ... 
) 
1

我不喜歡運行查詢兩次的想法,一旦檢查行計數,然後再實際獲取數據。因此,如果要報告限制爲2000行,只是做這樣的事情:

SELECT TOP 2001 
    ... 
    from... 

在應用程序檢查,如果行數超過你的極限>2000返回一個錯誤,或者跳過顯示它更大。

0

我並沒有真正意識到Hibernate對TOP指令的等價性,但即使存在第一個,你也必須檢索2000行,然後計算它現在可能會很慢。因此,您可以捕捉allredy 2001行,然後在應用程序中對其進行驗證。

但我認爲你應該優化的是查詢本身。 如果查詢不存在某些外部聯接只是在語句中指定索引列

SELECT count(*) from test1 inner join test2 on test1.id = test2.id; 

888毫秒

SELECT count(test.id) from test1 inner join test2 on test1.id = test2.id; 

88ms

關係35排在test1的比賽進行到1 TEST2;

行1252080;