2015-09-07 59 views
4

我一直在试图检查不同类型的数据库设计的性能,但我不确定我得到的结果是否正确。SQL Server不同的设计查询性能

我有两个数据库,不同的表,但意味着存储相同的信息。

  1. 在我的第一个设计中,我把所有的字段放在一张表中。
  2. 在第二个设计中,我有多个表,并希望使用连接来查找我的记录。

更详细的信息可以查看该图像:

enter image description here

当运行下面针对它在0.03秒执行第一数据库中的查询。

SELECT 
    a.[idPerson], a.[Id], a.[Description], a.[LastName], a.[nme], 
    a.[Email], a.[Phone], a.[grp] 
FROM 
    [Student] a 
WHERE 
    a.[grp] = 'R3PU56' 
    AND a.[nme] = 'tZv5oxqSDEoXPnU' 
    AND a.[Email] = 'gyRpWWCopv' 

当我对第二个数据库运行下面的查询时,它也在0.03秒内执行。

SELECT 
    a.[Id], a.[grp], b.[Email], b.[Phone], 
    c.[Description], c.[LastName], c.[nme] 
FROM 
    [Student2] a 
JOIN 
    [AdvancedPerson2] AS b ON (a.[Id] = b.[Id]) 
JOIN 
    [Person2] AS c ON (a.[Id] = c.[Id]) 
WHERE 
    a.[grp] = 'R3PU56' 
    AND b.[Email] = 'gyRpWWCopv' 
    AND c.[nme] = 'tZv5oxqSDEoXPnU' 

我期待第二个查询将比第一个查询要多得多,因为联接。我的问题是,为什么两个问题都花费大量的时间?如果它们与我应该使用的数据库结构相同?有些人可能会说第二个结构因为多个表而变得复杂,但我不在乎。我正在使用Telerik ORM,两者在C#代码中看起来都一样。

+0

如果行数少于4位数(通常不需要'4位数',这只是一个粗略的指示),并且服务器没有负载,使用这样简单的几乎不可能有差异查询和结构。这个问题就是你的期望:你不能仅仅看着表格来“猜测”表演,而且你也没有考虑到各种rdbms组件在幕后做出的优化。 – Paolo

+0

您可能会发现有用[不同继承映射策略的经典描述和比较](https://docs.oracle.com/cd/E19798-01/821-1841/bnbqr/index.html)。 –

回答

1

你的第一个案例,denormalize表,理论上应该更快,但DB做得很好,使得规范化版本非常快,并且轻视了连接的额外工作。如果您拥有大量数据,您可能只会注意到非规范化模式的好处。

关于使用哪种模式,我想我会去第二个,但没有高级人员2表,为什么你需要它?

+0

仅用于测试目的我有Person2表 这不是我真正的数据库设计。 – Anvarjon

1

扁平数据结构几乎总是可以执行得更好,但正确索引的数据库的差异可能会很小。就你而言,它看起来像一个扁平的数据结构也会占用更少的空间。

也就是说,数据库设计应该更多地关于逻辑分组。有时扁平更好;大多数情况下,我认为标准化会更好。

0

这并不直接回答问题的表现部分,但如果我诚实的话,我不会同意您的任何一项设计。

我可能会去这样的事情,而不是:

教师

Id (PK) 
PersonId (FK) 

学生

Id (PK) 
PersonId (FK) 

老师和学生都被分类为具有个人联系信息的人员。不知道为什么你需要AdvancedPerson表时,它是1对1映射。

Id (PK) 
FirstName 
LastName 
Tel 
Email 
-- other contact type info 

主题

只是为了与老师的Id科目表。这假设主题只有一名教师。

Id (PK) 
TeacherId (FK) 
SubjectName 

StudentSubject

链接表一批学生,他们采取的主题。

StudentId (FK) 
SubjectId (FK) 
0

哪个查询具有更好的性能,你要比较的不仅仅是乳宁的时间多一点。你简单的查询可以触发统计更新,这不是你想要测量的。 运行以下代码:

SET STATISTICS IO, TIME ON 

并再次运行您的查询。它为您提供了有关查询的更多信息。