2011-02-01 23 views
1

我需要創建SQL查詢,可以選擇讓一行1000行的訂單,然後只返回100行。SQL查詢,可以選擇n行順序,然後返回m行

爲什麼?我的查詢可以選擇〜1 000 000行(或更多),我想先取1000行,從這1000行中只顯示100個相關性最好的行。我擔心這樣一個選擇的性能,所以我想介紹這第一步(只需要1000行)。我知道我可能會遺漏更好的相關文檔,但在這種情況下,這並不重要。

+1

您是否要求查詢選擇給定排序的前1000行,然後通過*不同*排序返回該結果的前100行? – 2011-02-01 01:00:02

+1

你正在使用哪個DBMS? – RichardTheKiwi 2011-02-01 01:01:52

+0

@ Cyber​​kiwi我使用MS Sql。 @AdamRobinson。不,我想選擇1000行排序,然後返回100行。 – Darqer 2011-02-01 01:17:04

回答

2

字面解釋會導致

select top 1000 from tbl order by columnname 

而下一步

SELECT TOP 100 FROM (select top 1000 from tbl order by columnname) SQ 

但是沒有給出比直接

select top 100 from tbl order by columnname 

不同除非你是後2個不同的排序

SELECT TOP 100 
FROM (
    select top 1000 from tbl 
    order by columnname) SQ 
ORDER BY othercolumn 

或ASC之間切換/遞減

SELECT TOP 100 
FROM (
    select top 1000 from tbl 
    order by columnname ASC) SQ 
ORDER BY columnname DESC 
5

如果您不選擇第一個1000,這有什麼關係嗎?也就是說,如果你只是用...

Select top 100 * 
From table 
Order by column 

你得到相同的結果和其他地方指出,你會不會有可能降低性能,而不是提高它。

如果要優化此查詢,請確保在column上存在索引,然後SQL服務器將能夠優化記錄的檢索和排序,從而爲您提供所需的內容。

1

你可以使用子查詢。喜歡的東西:

select top 100 * from (
    select * from tablename 
    limit 1000 
) 
order by fieldname 

我的SQL是一個有點生疏所以語法可能斷了一下,有可能是一個更好的辦法做到這一點取決於你正在使用的平臺上,但希望這有助於。

4

我想,我終於明白你想要知道的,但現在看來你對數據庫執行如何排序操作非常困惑。

如果我正確理解你,你關心排序大量行的性能影響(在你的例子中爲1,000,儘管這不是大量的行)。所以你試圖通過僅僅對你感興趣的100行進行排序來實現智能。

如果你應用where子句將其限制爲100行,在大多數情況下,現代數據庫系統會自動延遲執行直到它縮小了結果以避免做額外的工作之後。這不是100%的時間,但是當數據庫優化器決定首先進行排序時,通常基於性能或者因爲查詢已經識別出必須首先執行排序才能獲得準確結果的條件。

訣竅是你必須明白tSQL是一種聲明性語言,而不是程序性語言。也就是說,您使用該語言來描述您想要的內容,並且優化器會找出確切的算法來實現此目的。看起來您正在嘗試像您編寫過程語言(如C#或Java)那樣優化您的代碼。 SQL將您的查詢轉換爲代碼,但不會在您輸入時運行它。長話短說,DB引擎非常擅長這種簡單的優化(以及一些非常複雜的優化)。你不會用這樣的噱頭來優化優化器,所以甚至不用麻煩。你不會獲得更多的性能,並且取決於你如何編寫查詢,你實際上可能會降級它。