Sql Update语句执行时间过长
我正在运行一个简单的Update语句。执行起来时间太长了。以下是更新和索引的详细信息 导出列的默认值为0Sql Update语句执行时间过长,sql,sql-server,indexing,cardinality,Sql,Sql Server,Indexing,Cardinality,我正在运行一个简单的Update语句。执行起来时间太长了。以下是更新和索引的详细信息 导出列的默认值为0 UPDATE PAR_ITM SET exported = -1 WHERE exported < 1 了解此文件中包含多少条记录可能会有所帮助: Select Count(*) FROM PAR_ITM WHERE exported < 1 基本上是更新了多少行。当然,即使是一百万行也会相对较快地完成 其他类型的查询在您的服务器上执行得慢吗?因此您将导出设置为-1,其中导
UPDATE PAR_ITM SET exported = -1 WHERE exported < 1
了解此文件中包含多少条记录可能会有所帮助:
Select Count(*)
FROM PAR_ITM
WHERE exported < 1
基本上是更新了多少行。当然,即使是一百万行也会相对较快地完成
其他类型的查询在您的服务器上执行得慢吗?因此您将导出设置为-1,其中导出已经等于-1。也许将WARE子句更改为WHERE EXPORT=0会减少行数?我认为您不应该在此处使用非聚集索引,因为似乎导出时没有唯一性。非聚集索引的经验法则是95%的唯一性,因为查询优化器可能不会以其他方式使用索引,这意味着您无缘无故地降低了索引的速度 有关非聚集索引的解释,请参阅本文:
您还可能在另一个查询中遇到阻塞情况。基数较低 你正在为一个叫做低基数的问题而痛苦。 看 问题 简而言之,我所知道的每个数据库都会拒绝在低基数列上使用索引 还有更多 如果一个好的数据库猜测许多行将被select的select低基数击中,那么它也会拒绝使用索引,即使列本身有许多不同的值,列的高基数也是如此 为什么要在此处插入DB而不使用索引? 问题出在这里。 如果一个数据库中所有行的值相同,每个数据库的差异超过50%,DB将不使用索引,因为使用索引是没有意义的 如果可以对表本身进行一次读取,那么对大多数行执行2次读取是没有意义的,对索引执行1次读取,对表执行2次读取。 无论如何,数据库必须读取大多数行,因此它只需继续读取它们。 事实上,DB不得不使用其最慢的访问机制全表扫描,这是导致您速度缓慢的原因 解决方案 增加列的基数或增加select的基数。 在其他工作中,确保选择的行少于所有行的50%,并确保SQL server知道或能够猜到这一点 DB如何知道列的基数? 一个好的数据库在执行选择/更新/插入操作时保持表和列的统计信息。通过这种方式,它拥有做出明智决策所需的信息 强制使用索引会加快查询速度吗? 不,它会减慢速度 所以链接
请使用代码块格式化此文件。它根本不可读。查询计划会有用。完整的表定义和执行计划是什么?服务器上的其他查询不会慢。表中几乎有65000行。OP没有告诉我们谓词的选择性有多高。@Martin Smith,语句:UPDATE PAR_ITM SET exported=-1,其中exported<1是一个非常强烈的提示,每次更新查询都会命中很大比例的行。那么,如果我在导出列上删除非聚集索引,那么另一个选项是什么呢?我想删除它可能会使查询运行得更快。记住,索引会加速选择,但会减慢插入和更新。如果列不是索引的好候选,它可能会对插入和更新的性能产生相当大的影响。我已经删除了索引。我检查了查询执行计划,主要60%的成本在更新聚集索引中。导出的此列也与其他几列一起位于聚集索引中。您可以从该列中删除索引。该列根本不应编入索引。删除非聚集索引后,查询的执行速度是否加快了?在[dbo].[PAR_ITM][Business_Date]ASC、[Store_ID]ASC、[Exported]ASC、[Item_折扣编号\u RRN]ASC、[Combo_编号]ASC中创建非聚集索引[IX_PAR_ITM Exported],[Item_折扣金额],[Item_作废原因],PAD_index=OFF,统计信息\u NORECOMPUTE=ON、SORT\u IN\u TEMPDB=OFF、IGNORE\u DUP\u KEY=OFF、DROP\u EXISTING=OFF、ONLINE=OFF、ALLOW\u ROW\u LOCKS=ON、ALLOW\u PAGE\u LOCKS=ON、FILLFACTOR=80 ON[PRIMARY]GO这是表上的非聚集索引查询未被阻止
Select Count(*)
FROM PAR_ITM
WHERE exported < 1