我有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