想象我们有这个表:
create table Foo(
id int,
name varchar,
k int --can be 1 or 2 or 3
)
或者我们可以为k
的每个值设置3个表create Fook1(
id int,
name varchar
)
...
create table Fook2
...
createa table Fook3
这样做会快得多:
select * from Foo where k = 3
比做:
select * from Fook3
答案 0 :(得分:5)
潜在地,使用多个表可能比使用单个表更快(特别是如果这些表将具有数百万个记录),但是在易用性方面会有折衷。使用,可管理性等。
但是,您可以通过partitioning your table获得两者的好处。
答案 1 :(得分:2)
尚北道 - 不 - 执行 - 这 - 的
哦,等等,这没什么用,只是好意而言:)
以这种方式对数据进行分区可以带来性能优势。但他们也引入了其他费用:
- 需要跨越所有三个表的查询变得更加复杂
- 你的架构变得更加混乱
- 犯错更容易
- 很难确保参照完整性
- 您可能需要包含一个视图来统一3个表
对于其中包含k
的索引,您最有可能好多了。根据您查询数据的方式,k
可能是该索引中的第一个字段。当您指定k = ?
时,只需要快速检查索引,然后您只需查看表格的相关部分。并且,如果索引是clustered
索引,则数据甚至以该顺序物理存储。
我强烈建议在对数据进行分区之前以这种方式使用索引。这是一项成本优化,因此在需要时可以展示,而不是在设计早期作为安全网。
答案 2 :(得分:1)
它可能取决于数据库,因此需要一个真实的例子。例如,在Oracle中,您可以使用分区,它完全按照您在窗帘后面所说的内容进行操作,或者使用联合创建物化视图,然后可以选择执行这两种操作。 通常,我会说你应该创建一个正确的实现,然后调整;早期优化是所有邪恶的根源,特别是对于DB。我认为你的瓶颈很可能不会出现在你预期的地方。