Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Update语句执行时间过长_Sql_Sql Server_Indexing_Cardinality - Fatal编程技术网

Sql Update语句执行时间过长

Sql 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语句。执行起来时间太长了。以下是更新和索引的详细信息

导出列的默认值为0

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