查询3个单独的数据集或1个连接集?

时间:2012-05-18 07:58:28

标签: c# sql performance

这个问题实际上可以应用于任何语言。 它类似于this one,但不完全相同。

我有一个网站应用程序,它将显示数据库中的数据。 三个DB表:

tblProfessor(Id,FirstName,LastName)
tblStudent(Id,FirstName,LastName)
tblProfessorStudent(Id,StudentId,ProfessorId)

所以我们有学生和教授。学生可以由多位教授授课,教授可以教授多名学生。

两种查询数据的方式:

  1. 返回所有三个表的连接,在这种情况下我们转移一些 重复数据。
  2. 为每个表返回三组。我知道 可以通过我的网络在一次通话中返回多组数据 应用。我不清楚那个电话的机制,但我想 它只是与DB的一个连接(与上面提到的类似问题相反)。
  3. 第一种情况下的查询:

    select
        ProfessoirId = p.Id
       ,ProfessorFirstName = p.FirstName
       ,ProfessorLastName = p.LastName
       ,StudentId = s.Id
       ,StudentFirstName = s.FirstName
       ,StudentLastName = s.LastName
    from tblProfessorStudent ps
    inner join tblProfessor p
       on p.id = ps.ProfessorId
    inner join tblStudent s
       on s.id = ps.StudentId
    

    我所说的重复是每行返回学生和教授的名字和姓氏 - “学生由教授教授”和“教授教学生”的组合。复制会导致需要从DB传输到应用程序的额外kb数量。

    第二种情况下的查询将如此简单:

    select <columns> from tblProfessor
    select <columns> from tblStudent
    select <columns> from tblProfessorStudent
    

    如何从性能角度查询我的应用的数据?

3 个答案:

答案 0 :(得分:1)

从纯粹的性能角度来看,没有什么比SQL Server在T-SQL中加入数据集的能力更好了。特别是当我们谈论大数据集时 它的唯一目的是管理数据和数据集,并在数据来源的地方进行管理 在客户端加入“无线”/将会引入大量(网络)开销,冗余数据流量,并且没有或几乎没有办法让花哨的客户端算法能够克服这个问题。

当然,和往常一样:YMMV,“它取决于”总是适用于我的陈述。

答案 1 :(得分:0)

如果您担心性能,则不应返回表中的所有行。一旦数据库增长,这将导致应用程序变慢。您应该过滤数据以仅获取需要向用户显示的行。您还可以考虑实现分页,这样就不会一次显示很多行。

答案 2 :(得分:0)

我认为在这种情况下最重要的是你如何使用数据。如果您实现了正确的索引,SQL Server将很好地加入表,不用担心。我很确定它会比运行3次选择更快。你说你担心重复的数据,但是什么样的重复?如果您加入3个表,您将获得真实数据,我的意思是,教X学生和X教师教授的学生。没有重复!所以,这又取决于你如何使用结果集。您只是显示学生名单和教师名单吗?在这种情况下,请使用选项2.如果您需要显示教师A有以下学生,那么选择加入选项1,因为如果您选择选项2,您将必须操纵ProfessorStudent数据集(我假设只有ID)从其他2个数据集中获取名称,这在我看来太麻烦了。