2014-02-28 37 views
1

我想從一個表中選擇100行,然後命令這100行。這個SQL:如何選擇N行然後命令它們?

select * from (select top 100 * from myTable) top100 order by myColumn 

很慢,似乎訂購整個表,然後取前100

鑑於此SQL:

select top 100 from myTable 

是相當快的

編輯:

第一個查詢肯定排序整個表,然後選擇排名前100

我正在使用Sybase 15

+2

您的查詢對我來說是正確的。 –

+0

桌上的任何索引?優化器將爲整個檢索構建查詢計劃,然後在返回行數後停止。如果沒有索引或較差的索引,則可能需要一段時間,因爲它必須執行表掃描。 –

+1

此外,將您的第一個查詢的性能與'selectTable 100 * from myTable ORDER BY myColumn'進行比較可能會更有幫助。 –

回答

-2

也許你沒有把ASC或DESC?例如在這個代碼中。

SELECT field1, field2,...fieldN table_name1, table_name2...ORDER BY field1, [field2...] [ASC [DESC]] 
+1

SQL語法正常,很確定ASC是默認值 – lockstock

-1

使用CTE:

EX:

;with mycte as 
( 
select top 100 from mytable 
)select * from mycte order by 1 
+0

Sybase ASE 12.5(還有15.0)doesn' t支持CTE :( – lockstock

0

的答案,慢速查詢通常不會改變語法,而是要看看錶。在你的情況下,在索引。

的差

之間
select top 100 from myTable 

select top 100 from myTable order by myRow -- (really? myRow? Not myColumn?) 

是第一個查詢是沒有意義的。表格沒有訂單,所以「top」100的意思就是任何 100.不知道你可以把它賣給Casey Kasem。

通過將表格加入到自身,並將輸出限制爲WHERE myRow <= 100,優於非標準topproduce a real ranking

確保有一個索引myRow作爲第一列。索引列的查找複雜度爲O(log n),它將在非常普通的硬件上以秒爲單位回答數百萬行。

+0

是的,我的意思是myColumn感謝 – lockstock

+0

第一個查詢不是沒有意義的,它從表中返回100行並且很快,我不在乎它是如何選擇這些行的,並且它對於任何索引都足夠快是不存在的,改變索引不是一種選擇,根本不需要很長的時間來排序這些行,所以很明顯第二個查詢不是以與第一個查詢相同的方式選擇100行 – lockstock

相關問題