Nel*_*son 0 sql-server optimization
TL;DR:你为什么要创建一个没有任何类型的键(甚至不是主键),也没有索引的数据库?
我加入了一个非盈利组织,该组织在 14 个月后迁移到定制的前端以进行财务处理。该组织有大约 60 名员工。
我有 6 年的软件开发经验,所以他们足够信任我,可以让我访问他们的数据库。
瞧,前端 SQL Server 生产数据库绝对没有任何类型的键,也没有索引。但是,该界面实际上运行良好。创建该系统的外部公司在创建新功能方面反应相对较快,并且该系统确实有效。
我已经在那里工作了大约 6 个月。大多数问题相对较小。我还没有看到由于公司方面的错误而导致的任何灾难性错误。再说一次,根本没有 UAT(用户验收测试),我也不知道这家外部公司的 QA 是如何工作的。我只与销售/技术联络员联系。
我高度怀疑这家公司只是为了将来的维护费而从非营利组织中掠夺。我厌倦了缓慢的数据库,以至于我根据最常用的报告添加了一堆多列、非聚集、非唯一索引,并将数据库速度提高了大约 100 倍(我没有打扰基准)。
我以前从未见过这种类型的设置,而且解决方案非常简单,以至于我很难理解为什么没有完成。我尝试询问销售联系人,但他只是不知道我在说什么。
我的评估是正确的还是有合法的理由这样做?
说明:
“DB关系是本质的吗?”
我相信是这样。他们每周和每月运行 DR/CR 报告。它在很大程度上是一个会计数据库。即使没有设置主键,它们也已在应用程序级别强制执行唯一性。
“数据库有多大”
它应该是一个全新的、定制的系统,在 SQL Server 2014 上运行。但是,我还发现他们将 DB 置于 2008 兼容模式(兼容代码 100)。我已经问过这个问题,但我的联系人没有回复我。
评论中列出了许多可能性。有几个不是没有索引或主键的“合法”理由:应用程序开发人员的无知,或所有索引的意外删除。
在一个INSERT操作优先于其他任何事情的系统中,从技术上讲,索引确实会减慢速度。可能认为对报告等的缓慢响应是可以接受的,只要尽可能快地完成插入即可。
Aaron Bertrand做了一个重要的说明——主键是一个约束。它对数据进行了限制,防止输入重复值。这同样适用于唯一索引。
考虑到这一点,至少有一个可能的原因可以避免实现这些:应用程序旨在在应用程序级别管理数据的关系方面。
如果应用程序最初是在很久以前(例如 1980 年代或 1990 年代)开发的,则更有可能出现这种情况。我使用 SQL Server 数据库工作了大约 10 年,该数据库支持最初在 FoxBase 中开发的应用程序,它没有外键;所有的关系都是通过触发器来维护的。他们开始对新表使用外键,但几年前才开始更改现有表。
根据代码的编写方式,您实际上有可能通过添加主键或唯一索引来破坏应用程序。这不太可能,但并非不可能。
如果应用程序确实需要保持插入尽可能精简,那么添加常规索引只会破坏事情。这在某些时候可能是一个限制,但它可能不再存在。
请注意,这只是一种可能的情况。正如 Aaron 所建议的,最好的选择是与供应商沟通。检查您可以进行多少调整以优化组织的工作负载并不是一个坏主意,尊重应用程序的创建者(无论他们是否应得的 :-) )是建立关系的好方法。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |