我想從一個表中選擇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
我想從一個表中選擇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
也許你沒有把ASC或DESC?例如在這個代碼中。
SELECT field1, field2,...fieldN table_name1, table_name2...ORDER BY field1, [field2...] [ASC [DESC]]
SQL語法正常,很確定ASC是默認值 – lockstock
使用CTE:
EX:
;with mycte as
(
select top 100 from mytable
)select * from mycte order by 1
Sybase ASE 12.5(還有15.0)doesn' t支持CTE :( – lockstock
的答案,慢速查詢通常不會改變語法,而是要看看錶。在你的情況下,在索引。
的差
和 之間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
,優於非標準top
,produce a real ranking。
確保有一個索引myRow
作爲第一列。索引列的查找複雜度爲O(log n),它將在非常普通的硬件上以秒爲單位回答數百萬行。
您的查詢對我來說是正確的。 –
桌上的任何索引?優化器將爲整個檢索構建查詢計劃,然後在返回行數後停止。如果沒有索引或較差的索引,則可能需要一段時間,因爲它必須執行表掃描。 –
此外,將您的第一個查詢的性能與'selectTable 100 * from myTable ORDER BY myColumn'進行比較可能會更有幫助。 –