我有2個文件,我想導入到MS SQL中。第一個文件是2.2 GB,第二個文件是24 GB的數據。 (如果你很好奇:這是一個撲克相關的查找表)非常巨大的SQL數據庫:模式應該如何?
將它們導入MS SQL不是問題。感謝SqlBulkCopy,我能夠在短短10分鐘內導入第一個文件。我的問題是,我不知道實際的表模式應該如何讓我做一些非常快的查詢。我第一次嘗試天真看起來是這樣的:
CREATE TABLE [dbo].[tblFlopHands]( [hand_id] [int] IDENTITY(1,1) NOT NULL, [flop_index] [smallint] NULL, [hand_index] [smallint] NULL, [hs1] [real] NULL, [ppot1] [real] NULL, [hs2] [real] NULL, [ppot2] [real] NULL, [hs3] [real] NULL, [ppot3] [real] NULL, [hs4] [real] NULL, [ppot4] [real] NULL, [hs5] [real] NULL, [ppot5] [real] NULL, [hs6] [real] NULL, [ppot6] [real] NULL, [hs7] [real] NULL, [ppot7] [real] NULL, [hs8] [real] NULL, [ppot8] [real] NULL, [hs9] [real] NULL, [ppot9] [real] NULL, CONSTRAINT [PK_tblFlopHands] PRIMARY KEY CLUSTERED ( [hand_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
動態指數是從1到22100的值(前3張常見的德州撲克卡,52選3)。每個觸發器索引都有一個從1到1176的hand_index(49選擇2)。所以總共有25,989,600行在這張表中。
用我上面的「模式」做一個查詢需要約。 25秒。經過一些Google搜索後,我發現SQL服務器正在進行表掃描,這顯然是一件壞事。我運行了「數據庫引擎優化顧問」,並建議在flop_index列上創建一個索引(合理)。創建索引後,DB所需的磁盤空間增加了一倍! (加上日誌LDF文件增長了2.6 GB) 但是在索引之後,查詢只花了幾個毫秒。
現在我的問題是,我該如何正確地做到這一點?我從來沒有用過這麼龐大的數據,我之前創建的數據庫只是一個笑話。
需要注意的一些事項:將數據導入MS SQL後,永遠不會插入或更新數據,只需選擇即可。所以我想知道我是否需要主鍵?
編輯:我提供一些更多的信息,使我的問題更加清晰:
1)我將永遠不會使用hand_id。我只是把它放在那裏,因爲很久以前有人告訴我,我應該總是爲每個表創建一個主鍵。
2)將基本只有一個查詢,我將使用:
SELECT hand_index, hs1, ppot1, hs2, ppot2, hs3, ppot3, hs4, ppot4, hs5, ppot5, hs6, ppot6, hs7, ppot7, hs8, ppot8, hs9, ppot9 WHERE flop_index = 1...22100
此查詢將始終與我所需要的數據返回1176行。
編輯2:只是更具體:是的,這是靜態數據。我有這個數據在一個二進制文件。我已經編寫了一個程序來在幾毫秒內用我需要的數據查詢這個文件。我想在數據庫中使用這些數據的原因是,我希望能夠從網絡中的不同計算機查詢數據,而無需在每臺計算機上覆制25 GB的數據。
HS表示手牌強度,它會告訴你當前手牌與翻牌或轉牌相結合的手牌強度。 ppot意味着積極的潛力,這是一旦下一張普通卡被處理,你的手就會處於領先地位的機會。 hs1到9是對抗1到9個對手的手牌。同一個ppot。實時計算ppot非常密集,需要幾分鐘才能計算。我想創建一個撲克分析程序,該程序給出了在任何翻牌圈/轉牌圈的每個可能的底牌組合以及他們的hs/ppot。
只是爲了將來的參考,這是一個小型SQL數據庫,而不是一個巨大的;) – 2009-08-31 19:43:20
嗯,它是*不*小。但無論如何,說數據庫真的很大是主觀的。有很多更大的數據庫的例子。只要說出幾千兆字節就可以了。 – 2009-08-31 19:45:00
好吧,它可能不是一個巨大的谷歌數據庫或類似,但對於一個寵物項目,我認爲它是相當巨大的:) – Simon 2009-08-31 19:46:56