id!= id的意外表扫描

And*_*mar 11 sql sql-server indexing sql-server-2005

一个应用程序会导致我们的Sql Server 2005数据库负载过重.我们不控制运行此查询的应用程序每分钟一次:

select id,col1,col2,col3 from table where id != id
Run Code Online (Sandbox Code Playgroud)

注意id!= id,意味着行不等于它自己.不出所料,结果始终没有找到行.但是,每次运行此查询时,Sql Server都会执行聚簇索引扫描扫描!

id列定义为:

varchar(15) not null primary key
Run Code Online (Sandbox Code Playgroud)

查询计划显示"估计行数"的大量数字.有谁知道为什么Sql Server需要表扫描来找出明显的?

Jef*_*itz 6

我会伪造这个问题...抽象出一个视图,并欺骗查询.

将现有表'table'重命名为'table_org'或其他内容,并创建如下视图:

CREATE VIEW table
AS
SELECT * FROM table_org
WHERE id='BOGUSKEY'
Run Code Online (Sandbox Code Playgroud)

现在,您应该通过主键上的表进行1次扫描,它应该(就像原始查询一样)找不到任何内容.该应用程序不知道更聪明...


ang*_*son 2

阅读此处的答案和您的编辑后,让我总结一下您的选择:

  1. 更改 MS SQL Server 来处理这种情况(基本上,与 Microsoft 支持人员联系)
  2. 更改应用程序以避免这种情况,或者采取不同的方式(基本上,与提出应用程序的公司的支持人员联系)
  3. 更改为 SQL Server 以外的其他内容(如果应用程序允许),可以处理这种情况
  4. 更改为另一个应用程序

这些都不是好的解决方案,但不幸的是,它们是您唯一拥有的解决方案。你必须选择一个,然后选择它。

我会首先尝试解决方案 2,它是执行时间最短的解决方案。

另一方面,如果该公司不愿意更改应用程序,那么我会采用解决方案 4。这是一个主要的性能错误,如果该公司不愿意或无法解决该问题,您必须问自己,下一个角落还潜藏着什么?