【发布时间】:2010-11-24 10:45:48
【问题描述】:
我有 2 个文件要导入 MS SQL。第一个文件是 2.2 GB,第二个文件是 24 GB 的数据。 (如果你好奇:这是一个扑克相关的查找表)
将它们导入 MS SQL 不是问题。感谢 SqlBulkCopy,我能够在 10 分钟内导入第一个文件。我的问题是,我不知道实际的表模式应该是什么样子才能让我进行一些非常快速的查询。我的第一次天真的尝试是这样的:
创建表 [dbo].[tblFlopHands](
[hand_id] [int] IDENTITY(1,1) 非空,
[flop_index] [smallint] NULL,
[hand_index] [smallint] NULL,
[hs1] [真实] NULL,
[ppot1] [真实] NULL,
[hs2] [真实] NULL,
[ppot2] [真实] NULL,
[hs3] [真实] NULL,
[ppot3] [真实] NULL,
[hs4] [真实] NULL,
[ppot4] [真实] NULL,
[hs5] [真实] NULL,
[ppot5] [真实] NULL,
[hs6] [真实] NULL,
[ppot6] [真实] NULL,
[hs7] [真实] NULL,
[ppot7] [真实] NULL,
[hs8] [真实] NULL,
[ppot8] [真实] NULL,
[hs9] [真实] NULL,
[ppot9] [真实] NULL,
约束 [PK_tblFlopHands] 主键集群
(
[hand_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) 在 [主要] 上
翻牌指数是一个从 1 到 22100 的值(德州扑克中的前 3 张普通牌,52 选 3)。每个翻牌指数都有一个从 1 到 1176 的 hand_index(49 选择 2)。所以这个表总共有 25,989,600 行。
使用我上面的“模式”进行查询大约需要。 25 秒。经过一番谷歌搜索后,我发现 SQL 服务器正在执行表扫描,这显然是一件坏事。我运行了“Database Engine Tuning Advisor”,它建议在 flop_index 列上创建一个索引(有意义)。创建索引后,数据库所需的磁盘空间正好翻了一番! (加上日志 LDF 文件增长了 2.6 GB) 但是在建立索引之后,查询只需要几毫秒。
现在我的问题是,我应该如何以正确的方式做到这一点?我从来没有处理过这么大的数据,我之前创建的数据库就是个笑话。
需要注意的事项:将数据导入 MS SQL 后,将永远不会插入或更新数据,只需选择即可。所以我想知道我是否需要主键?
编辑:我提供更多信息以使我的问题更清楚:
1) 我永远不会使用 hand_id。我只是把它放在那里,因为很久以前有人告诉我我应该总是为每个表创建一个主键。
2) 基本上我只会使用一个查询:
选择 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 行包含我需要的数据。
EDIT2:更具体地说:是的,这是静态数据。我在二进制文件中有这些数据。我编写了一个程序,可以在几毫秒内用我需要的数据查询这个文件。我希望这些数据在数据库中的原因是我希望能够从网络中的不同计算机查询数据,而无需在每台计算机上复制 25 GB。
HS 表示手牌强度,它告诉您当前底牌与翻牌或转牌的手牌强度。 ppot 意味着积极的潜力,这是你的手牌在下一张普通牌发出后领先的机会。 hs1 to 9 是对抗 1 到 9 对手的手力。 ppot 也一样。即时计算 ppot 占用大量 CPU 资源,需要几分钟的时间来计算。我想创建一个扑克分析程序,它给我一个列表,列出所有可能的底牌组合在任何给定的翻牌/转牌与他们的 hs/ppot。
【问题讨论】:
-
仅供参考,这是一个小型 SQL 数据库,不是一个庞大的数据库;)
-
嗯,它不小。但无论如何,说数据库真的很大是主观的。有很多更大的数据库的例子。只需说出多少 GB 就可以了。
-
好吧,与 Google 数据库或类似数据库相比,它可能并不庞大,但对于一个宠物项目,我认为它相当庞大 :)
-
@Simon - 这听起来很粗鲁,但这不是我的本意。我希望了解您可能没有提到的任何限制。如果您打算每次都返回相同的记录集/数据,那么将其作为数据库而不是平面文件或硬编码对您有什么价值?