2013-03-15 57 views
3

我有一個擁有超過3,000,000行的數據庫,每個數據庫都有一個帶varchar(6000)的id和xml字段。從一個巨大的數據庫中選擇ID's

如果我這樣做SELECT id FROM bigtable它需要+2分鐘才能完成。有什麼方法可以在30秒內完成?

+7

3.000.000行不是很多(並且它肯定不是很大)。創建適當的索引。 – 2013-03-15 10:25:02

+0

你的表格是否索引? – 2013-03-15 10:25:49

+0

是'id'表上的聚集索引? – Jodrell 2013-03-15 10:28:18

回答

2

您可以將索引應用於表格。在你的情況下,一個聚集索引。

聚集索引:

http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx

我也建議篩選查詢,因此不會每次都返回所有3個百萬行,這可以通過使用TOPWHERE完成。

TOP:

SELECT TOP 1000 ID 
FROM bigtable 

WHERE:在id列

SELECT ID FROM 
bigtable 
WHERE id IN (1,2,3,4,5) 
+0

沒有'order by','TOP'沒有意義,但是分頁數據很有意義。 – Jodrell 2013-03-15 11:01:24

0

首先,3 milion唱片不會製作一張'巨大'的唱片。

要優化您的查詢,您應該執行以下操作。

  1. 篩選您的查詢,您爲什麼需要獲取所有ID?
  2. 爲ID列創建聚簇索引以獲得較小的查找表,以便在指向所選行之前先進行搜索。

幫助線程,herehere

0

好了,你爲什麼要重新調整所有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個聚集索引將提供比這些查詢和所有沒有更多的有用信息它將實現爲您的網絡和客戶端的鍛鍊。

0

你可以index你的表更好的表現。

還有其他選項可以用來提高性能,如partion功能。