我有一個擁有超過3,000,000行的數據庫,每個數據庫都有一個帶varchar(6000)的id和xml字段。從一個巨大的數據庫中選擇ID's
如果我這樣做SELECT id FROM bigtable
它需要+2分鐘才能完成。有什麼方法可以在30秒內完成?
我有一個擁有超過3,000,000行的數據庫,每個數據庫都有一個帶varchar(6000)的id和xml字段。從一個巨大的數據庫中選擇ID's
如果我這樣做SELECT id FROM bigtable
它需要+2分鐘才能完成。有什麼方法可以在30秒內完成?
您可以將索引應用於表格。在你的情況下,一個聚集索引。
聚集索引:
http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx
我也建議篩選查詢,因此不會每次都返回所有3個百萬行,這可以通過使用TOP
或WHERE
完成。
TOP:
SELECT TOP 1000 ID
FROM bigtable
WHERE:在id列
SELECT ID FROM
bigtable
WHERE id IN (1,2,3,4,5)
沒有'order by','TOP'沒有意義,但是分頁數據很有意義。 – Jodrell 2013-03-15 11:01:24
好了,你爲什麼要重新調整所有Id
s到客戶端?
即使你的表沒有聚集索引(我懷疑),處理時間將是客戶端,通過網絡傳輸的Id
值,並在屏幕上顯示它們絕大多數的你。
查詢所有值相當於打敗了查詢引擎。
唯一的原因,我能想到的(也許是我缺乏想象力)爲讓所有的Id
s是某種誤導緩存。
如果你想知道很多你必須做
SELECT count(*) FROM [bigtable]
如果你想知道一個Id
存在做
SELECT count([Id[) FROM [bigtable] WHERE [Id] = 1 /* or some other Id */
這將返回1成一行的1或0,指示存在指定的Id
。
這兩個查詢都將從Id
上的聚集索引大量獲益,並將返回最少的數據和最大的信息。
這兩個查詢將在不到30秒的回報,在不到30毫秒,如果你有Id
選擇所有的Id
個聚集索引將提供比這些查詢和所有沒有更多的有用信息它將實現爲您的網絡和客戶端的鍛鍊。
3.000.000行不是很多(並且它肯定不是很大)。創建適當的索引。 – 2013-03-15 10:25:02
你的表格是否索引? – 2013-03-15 10:25:49
是'id'表上的聚集索引? – Jodrell 2013-03-15 10:28:18