Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否应始终为查找表外键编制索引?_Sql Server_Indexing - Fatal编程技术网

Sql server 是否应始终为查找表外键编制索引?

Sql server 是否应始终为查找表外键编制索引?,sql-server,indexing,Sql Server,Indexing,如果我有一个包含很少记录的查找表(比如,少于10条),我是否应该麻烦将索引放在另一个表的外键上?就这点而言,查找表甚至需要主键上的索引吗 具体来说,是否有任何性能优势超过了维护索引的开销?如果没有,除了速度之外还有其他好处吗 注意:查找表的一个示例可能是订单状态,其中元组为: 1 - Order Received 2 - In Process 3 - Shipped 4 - Paid 我个人的意见是你应该。。。它现在可能很小,但总是希望您的桌子越来越大。一个好的数据库模式很容易随着记录的增加而

如果我有一个包含很少记录的查找表(比如,少于10条),我是否应该麻烦将索引放在另一个表的外键上?就这点而言,查找表甚至需要主键上的索引吗

具体来说,是否有任何性能优势超过了维护索引的开销?如果没有,除了速度之外还有其他好处吗

注意:查找表的一个示例可能是订单状态,其中元组为:

1 - Order Received
2 - In Process
3 - Shipped
4 - Paid

我个人的意见是你应该。。。它现在可能很小,但总是希望您的桌子越来越大。一个好的数据库模式很容易随着记录的增加而增长。外键几乎总是一个好主意。

是的,总是有索引

现代数据库管理系统(DBMS)的查询优化器将确定哪个更快:(1)实际读取列上的索引,(2)执行完整表扫描


表大小(以行数为单位)需要“足够大”才能使用要考虑的索引。

在sql server中,如果还没有聚集索引,则主键是聚集索引(即聚集索引)。

两者都是。始终将索引作为经验法则

要点:

  • 如果在查找表上没有唯一索引,也无法设置FK
  • 如果要在查找表中删除或更新,该怎么办?尤其是偶然
然而,尽管如此,我们并不总是这样

我们有很多OLTP表(每天500万行以上)和几个父表。我们只在需要的FK列上创建索引。我们假设在某些父表上没有删除/密钥更新,因此我们减少了所需的工作量和使用的磁盘空间


我们使用SQLServer2005DMV来确定没有使用索引。不过,我们仍然保留了FK。

在事务系统上,将索引放在这样的列(即低基数引用列)上可能没有显著的好处,因为查询优化人员可能不会使用它。由于必须更新索引,它还会在写入表时产生额外的磁盘流量。因此,对于事务数据库上的低基数FK,通常最好不要对列进行索引。这尤其适用于大容量系统

请注意,您可能仍然希望FK具有引用完整性,并且对小型引用表的FK查找可能不会生成I/O,因为查找表几乎总是缓存的

但是,您可能会发现,出于某种原因,您希望在复合索引中包含该列—可能是为了为常用查询创建覆盖索引

在经常大容量加载的表(例如数据仓库)上,如果有许多索引列,则索引写入流量将远远大于表加载流量。如果存在任何索引,则可能需要删除或禁用批量加载的FKs和索引

在星型模式中,即使在SQL Server上,也可以从索引低基数列中获得一些好处。如果您正在执行高选择性查询(即,查询优化程序确定返回的行集很小的查询),那么它可以执行“星型查询”计划,使用称为索引交叉的技术

通常,星型模式上的查询计划应该基于事实表的表扫描,或者是一个高度选择性的过程,该过程将事实表标记为书签,然后返回一组较小的行。对于后一种类型的查询,索引交集是有效的,因为可以在对事实表执行任何I/O之前解析选择


位图索引对于支持位图索引的Oracle等平台上的低基数列来说是一个真正的胜利,但SQL Server不支持。即使如此,低基数索引仍然可以参与SQL Server上的星型查询计划。

带有外键的表的大小肯定会增加。订单状态表…不太多。+1预测增长,并为db引擎提供决策查询计划所需的工具。如果它不需要索引,它会忽略它,而在一个小表上建立索引的成本几乎是零。如果表中只有四条记录,那么该索引会被使用吗?@Robert Harvey-只有四条记录,可能不会-整个表都在一个数据页上,因此索引不会保存I/O。另一方面,索引实际上只对4行没有更改的行是免费的,因此您可以添加它,以防表以后增长。这意味着,查找表上的索引或没有索引的问题可能无关紧要?不,这个问题是合法的,外键不是自动索引的。我是在回答查找表是否需要主键上的索引。引用一位SQL专家的话:“如果它没有(主键)键,它就不是表”-因此,是的,即使如此小的查找表也应该始终有主键-无需讨论。