查询不同的表比使用where子句要快得多

时间:2011-09-29 12:05:57

标签: sql sql-server database

想象我们有这个表:

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

3 个答案:

答案 0 :(得分:5)

潜在地,使用多个表可能比使用单个表更快(特别是如果这些表将具有数百万个记录),但是在易用性方面会有折衷。使用,可管理性等。

但是,您可以通过partitioning your table获得两者的好处。

答案 1 :(得分:2)

尚北道 - 不 - 执行 - 这 -

哦,等等,这没什么用,只是好意而言:)


以这种方式对数据进行分区可以带来性能优势。但他们也引入了其他费用:
- 需要跨越所有三个表的查询变得更加复杂 - 你的架构变得更加混乱 - 犯错更容易 - 很难确保参照完整性 - 您可能需要包含一个视图来统一3个表


对于其中包含k的索引,您最有可能好多了。根据您查询数据的方式,k可能是该索引中的第一个字段。当您指定k = ?时,只需要快速检查索引,然后您只需查看表格的相关部分。并且,如果索引是clustered索引,则数据甚至以该顺序物理存储。


我强烈建议在对数据进行分区之前以这种方式使用索引。这是一项成本优化,因此在需要时可以展示,而不是在设计早期作为安全网。

答案 2 :(得分:1)

它可能取决于数据库,因此需要一个真实的例子。例如,在Oracle中,您可以使用分区,它完全按照您在窗帘后面所说的内容进行操作,或者使用联合创建物化视图,然后可以选择执行这两种操作。 通常,我会说你应该创建一个正确的实现,然后调整;早期优化是所有邪恶的根源,特别是对于DB。我认为你的瓶颈很可能不会出现在你预期的地方。