2

這裏的情景多個表,舊的數據庫具有這種設計單表,相較於數百萬條記錄

dbo.Table1998 
dbo.Table1999 
dbo.Table2000 
dbo.table2001 
... 
dbo.table2011 

的,我合併所有的數據1998年至2011年在此表中dbo.TableAllYears

現在他們都通過「申請號」現在索引,具有列數相同(實際上是56列。)

當我試圖

select * from Table1998 

select * from TableAllYears where Year=1998 

第一查詢有139669行@13秒 而第二個查詢具有相同的行數,但@30秒

所以對於你們,我是,我只是失去了一些東西或者多個表比單個表好?

+0

如果你能告訴我們你正在使用哪個數據庫服務器?和版本可以讓你很好的答案。首先,您可以查看按年份或月份對錶進行分區,並可能在要運行的查詢類型上添加非聚集索引。對於SQL Server [從這裏開始](http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx) – 2011-04-15 03:47:49

+0

MS SQL Server 2008 r2 – Leary 2011-04-15 04:19:58

+0

@ Sanjeevakumar - 對於遲到的回覆抱歉,我沒有注意到你的評論... – Leary 2011-04-15 04:20:44

回答

2

您應該每年對錶格進行分區,這幾乎相當於每年有不同的表格。通過這種方式,當您按年份查詢時,它將針對單個分區進行查詢,並且性能會更好。

+0

謝謝,我會嘗試這種方法。我從來沒有想過這個... – Leary 2011-04-15 04:08:17

0

如果你正在尋找1998年的數據,那麼只有1998年的數據是一個表格。這是因爲數據庫不必「搜索」記錄,但知道該表中的所有記錄都是從1998年開始的。嘗試將「WHERE Year = 1998」子句添加到Table1998表中,並且應該得到比較好一點。

就我個人而言,我會將數據保存在多個表中,特別是如果它是一個特別大的數據集,並且您不必頻繁地對舊數據進行查詢。即使你這樣做了,你也可能想要創建一個包含所有表數據的視圖並運行報表,而不必查詢多個表。

+0

哇!那很快......我期待着得到我的答案湯姆。 – Leary 2011-04-15 03:47:10

+0

哇!你是對的!當我添加一個條件,TableAllYears提取更快... – Leary 2011-04-15 03:48:38

+0

Table1998 = 10秒@ 139669行,而TableAllYears 8秒@ 139969 ... – Leary 2011-04-15 03:49:45

0

嘗試在您搜索的每個列上刪除索引(where子句)。這應該會加快查詢的速度。

所以在這種情況下,爲字段Year添加一個新的索引。

+0

yup的索引。我嘗試過...但是有時候,多張桌子仍然贏... – Leary 2011-04-15 04:05:31

+0

你能舉一個例子,它的速度更快嗎? – 2011-04-15 04:11:24

+0

選擇TableAllYears *從Table1998 = 7秒@ 139669行 和 選擇*其中年份= 1998 = 13秒@ 139669行 – Leary 2011-04-15 04:17:47

0

我相信你應該使用一張表。不可避免地,您需要跨多年查詢數據,並將其分隔成多個表格是一個問題。可以優化查詢和表結構,以便表中可以有數百萬行,並且仍然具有出色的性能。請確保您的年份列已編入索引,幷包含在您的查詢中。如果你確實遇到了數據大小的限制,你可以在MySQL 5中使用分區功能,允許它將表數據存儲在多個文件中,就像它是多個表一樣,同時使它看起來像是一個表。

無論如何,140k行不算什麼,它可能會過早地將其分割成多個表格,如果您需要跨多年查詢數據,甚至會對性能造成嚴重影響。