sql-server - SQL Server 更新查询不使用索引

标签 sql-server performance indexing

我有一个运行缓慢的更新查询(请参阅下面的第一个查询)。我在PhoneStatus 表和PhoneID 列上创建了一个索引,名为IX_PhoneStatus_PhoneID。 Table PhoneStatus 包含 2000 万条记录。当我运行以下查询时,没有使用索引,而是使用了聚集索引扫描,反过来更新运行缓慢。

UPDATE PhoneStatus    
SET RecordEndDate = GETDATE()    
WHERE PhoneID = 126  

如果我执行以下查询(其中包括新的 FROM),我仍然遇到未使用索引的相同问题。
UPDATE PhoneStatus    
SET RecordEndDate = GETDATE()   
FROM Cust_Profile.PhoneStatus     
WHERE PhoneID = 126 

但是,如果我添加 HINT 以强制在 FROM 上使用索引,则它可以正常工作,并且使用了索引查找。
UPDATE PhoneStatus     
SET RecordEndDate = GETDATE()   
FROM Cust_Profile.PhoneStatus WITH(INDEX(IX_PhoneStatus_PhoneID))   
WHERE PhoneID = 126    

有谁知道为什么第一个查询不使用索引?

更新

2000万条记录表中,每个phoneID最多出现10次

巴德夫

最佳答案

20M 表中有多少个不同的 PhoneID?如果条件where PhoneID=126不够挑剔,你可能打到指数tipping point .如果此查询和访问条件非常频繁,PhoneID 是聚集索引最左键的良好候选者。

关于sql-server - SQL Server 更新查询不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3524871/

相关文章:

sql - 为什么 sqlParameter 请求一个 sourceColumn?

c++ - MinGW vs Visual Studio 2008 输出代码质量

sql-server - SonarQube 数据库使用太多空间(60+ GB)

c# - 线程池饥饿

java - 整数集。在增加新条目的情况下可能会提高性能

c# - 更新记录时性能非常慢

python - Numpy,我如何索引一个数组,以保留小于前后 5 个项目的项目?

java - 在 Java 中元素编号应该从 0 还是 1 开始?

mysql - 多列索引比mysql中的单列索引慢

sql-server - 从存储过程读取 INSERT 输出