我继承了多年前软件供应商安装的一个应用程序(和关联的 MS SQL 数据库)。我们目前没有任何类型的供应商支持。除了使用应用程序之外,我们还独立于应用程序访问数据库,经常直接更新数据库并查询数据以进行报告。
为了提高性能,我删除了一些不必要的索引并创建了其他索引。这会导致应用程序在执行某些任务时出现错误。该应用程序不显示任何类型的任何错误消息,并且似乎正常执行,但应用程序未按预期更新数据库。我无权访问源代码。
我的理论是应用程序在其查询之一的 with(index) 语句中明确指定了一个已删除的索引。这将导致服务器返回错误而不是完成查询,如果应用程序抑制错误,用户将不会意识到某些表已更新而其他表未更新。还有什么其他想法可能导致这种行为?
假设我的理论是正确的,我仍然认为索引实际上是不必要的,应用程序不应该指定索引。也许一种解决方法是创建一个具有相同名称但列数尽可能少的新索引。有没有办法创建没有列的索引?使用与聚集索引相同的列创建非聚集索引是否最有效?优化器在这种情况下做了什么——它是否仍然计划包含这些仅引用聚集索引的“坏”索引,或者它是否知道忽略 with(index) 请求?
我确实运行了跟踪以查看应用程序正在运行哪些查询。我得到了一堆 RPC 调用,如“exec sp_cursorfetch”和“exec sp_cursorexecute”(我不明白)而不是实际的 SQL。也许我会在一个单独的问题中询问这些,但如果您知道我如何将这些语句解释或解码为常规 SQL,那么这至少可以让我证实我的理论。