2014-11-04 31 views
1

比方说,我有一个客户表:第一个和最后一个名称表可提高性能?

CustomerID | FirstName | LastName 
1   | John  | Smith  
2   | John  | Adams 
3   | Kevin  | Smith 
4   | Kevin  | Adams 

现在想象一下这个表有20万个+行。它会提高性能来创建一个单独的FirstName和LastName表,如下所示,然后使用连接来获取上面的视图?

例子:

FirstNameID | FirstName 
1   | John 
2   | Kevin 

LastNameID | LastName 
1   | Adam 
2   | Smith 

CustomerID | FirstNameID | LastNameID 
1   | 1   | 2 
2   | 1   | 1 
3   | 2   | 2 
4   | 2   | 1 
+1

因此,不是在一张表中查询一行,而是在客户表中查询一行,然后再添加两个查询并加入结果?你猜猜哪个更快。 – JJJ 2014-11-04 17:37:13

+0

我不这么认为...... – 2014-11-04 17:37:48

+2

这与标准化有*无关。 – 2014-11-04 17:40:25

回答

2

这取决于您的查询工作量。这是一种简单的数据压缩形式。减少回答给定查询所需的一组数据可以提高性能。

另一方面,你在许多地方引入开销。这是一个权衡。如果你想检索这些列的值,你现在需要加入。 DML也变慢了。

由于名称列可能相当小,因此很难想象会受益于此方案的查询工作负载。

DATA_COMPRESSION和备份压缩可以替代。他们做出了非常不同的折衷。

只是为了证明你的方案有价值:想象一下很长的名字和一个巨大的(TB大小)表。节省的空间将会非常重要,因为名称并不多。

+0

不,压缩不起作用,因为聚集键可能在CustomerId上 - 这意味着您可以获得有效的随机名称。会有所作为,但不是那么高。当您设法拥有正确的聚簇索引时,压缩功能非常棒。 – TomTom 2014-11-04 17:54:16

+0

取决于页面上有多少个名字。也许很多“史密斯”的。好点子。 – usr 2014-11-04 17:58:45

+0

其实没有。问题是,除非你居住在中国(其中大部分有5个姓我被告知),你有很多。可悲的是,人们不会被“史密斯”命令,但最有可能是一个ID(1,2,3)....这意味着名称的顺序是随机的。然后在一页上没有多少史密斯。 – TomTom 2014-11-04 18:00:31

0

没有涉及该会作出具有联接三个表更快名称的任何行动。

简短的回答:第

+0

使用ID号替换文本与规范化无关。 – 2014-11-04 17:42:20

+0

我已经删除了对标准化的引用。当我了解到正常化时,我很确定我得到了一个这样的例子。它必须去除所有冗余数据。我被教导说,这是“超越”第三范式的,超越实际的 - 一种没有益处的学术活动。但那是很久以前的事了,我可能记错了。 – 2014-11-04 17:49:44

+1

它肯定与标准化有关,但我同意这可能不值得。 – 2014-11-04 17:51:45

4

是否有这样的举动会提高性能取决于什么查询执行的,但它很可能做相反的许多我想象你想要执行的查询。

+0

我很好奇哪些查询可以更快? – 2014-11-04 17:54:55

+1

智能开发人员在主要可视化的服务器上编写的任何内容。只要不过滤,就不需要在任何查询中读取名称和姓氏表,因为您可以从缓存中获取名称。在那里,做到了,速度提高了10倍以上 - 但我们的用例非常特殊。 – TomTom 2014-11-04 17:56:13

+2

我很惊讶这是被接受的答案,因为它所说的是“也许它有效,也许不是”。 – usr 2014-11-04 18:02:08

相关问题