【问题标题】:Effective Indexing for Lookup Tables in Normalized Database规范化数据库中查找表的有效索引
【发布时间】:2018-09-13 07:15:25
【问题描述】:

在 3NF (SQL Server) 数据库中,应该对哪些列(集群和非集群)进行索引以提高搜索效率?

考虑以下场景:
表 1:员工
列:ID、EmployeeSerial、…columnN
表 2:工作
列:ID、JobCode、…columnN
表 3:Employee_Job
列:ID、Employee_ID、Job_ID

补充:

  • “ID”列是自动递增的数字主键 每个表,但没有商业价值(将其视为只是记录 数字)。它的唯一目的是连接 Employee 和 Job 表。
  • 执行的大多数查询都需要来自 Employee 和 Job 的数据 表,其中一个或两个 EmployeeSerial 和 JobCode 指定为 “WHERE”子句中的条件。

后续问题:为了获得推荐的索引方案的优势,选择查询中连接 3 个表的顺序是否重要?

【问题讨论】:

  • 用于连接的列应该被索引。 where 子句中用于相等条件的列应该被索引。但这些是非常笼统的指导方针,您的问题非常广泛。
  • 如果你只是做内部连接,顺序无关紧要。但是,如果您使用left/right 连接,则顺序很重要,因为它从根本上改变了结果集。您可以强制 sql 以特定顺序执行操作,但默认情况下,SQL 会找出它认为最好的任何内容。除非你有充分的理由重写它,否则你应该让它在这方面做它的事情。
  • 告诉你的导师,Employee_Job 中的 ID 完全没用,实际的 Key 是 Employee_ID, Job_ID(无论如何都必须定义)。
  • 请阅读How to Ask并采取行动,点击谷歌搜索“stackexchange homework”和向下投票箭头鼠标悬停文本。

标签: sql sql-server database indexing database-normalization


【解决方案1】:

每个id 都应该是一个主键,从而创建一个索引。

那么,您的典型查询将是:

select . . .
from employee e join
     employee_job ej
     on ej.employee_id = e.id join
     job j
     on ej.job_id = j.id
where e.serial = ?/j.job_code ?;

对于这种类型的查询,您需要在 employee(serial, id)employee_job(employee_id, job_id)job(job_code, id)employee_job(job_id, employee_id) 上添加其他(非主键)索引。

from 子句中的表顺序几乎没有影响——三个表都没有影响。 SQL Server 的优化器在优化连接时确实有限制,但是应该总是使用相关的索引,所以我认为你是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2016-06-06
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2018-05-09
    相关资源
    最近更新 更多