Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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删除性能_Sql_Sql Server_Sql Server 2008_Sql Delete - Fatal编程技术网

SQL删除性能

SQL删除性能,sql,sql-server,sql-server-2008,sql-delete,Sql,Sql Server,Sql Server 2008,Sql Delete,表A包含大约5000条记录,A.ID是表A中的主键。但是删除它需要很长时间。有时它也会超时。该表包含三个索引,并由三个外键引用。有人能解释一下为什么即使我们根据主键进行删除,也要花很长时间。请告诉我一些优化这个问题的方法…?显然,这不会花费很长时间。然而,这里并没有足够的信息来解释原因。不过,我可以告诉你,你应该关注外键 如果它们从其他更大的表中施加约束,则会减慢速度。您还可能会发现您的超时是由于阻止删除的完整性检查造成的(那么问题是为什么您没有得到异常而不是超时) 我的下一步是删除外键,然后检

表A包含大约5000条记录,A.ID是表A中的主键。但是删除它需要很长时间。有时它也会超时。该表包含三个索引,并由三个外键引用。有人能解释一下为什么即使我们根据主键进行删除,也要花很长时间。请告诉我一些优化这个问题的方法…?

显然,这不会花费很长时间。然而,这里并没有足够的信息来解释原因。不过,我可以告诉你,你应该关注外键

如果它们从其他更大的表中施加约束,则会减慢速度。您还可能会发现您的超时是由于阻止删除的完整性检查造成的(那么问题是为什么您没有得到异常而不是超时)

我的下一步是删除外键,然后检查性能。然后一次添加每一个,并在运行时检查性能

其他操作(如插入、选择、更新)是否需要很长时间?

可能的原因:

1) 级联删除操作

2) 扳机

3) 主键列的类型不是整数,因此强制对每个pk值进行类型转换以进行比较。这需要进行完整的表扫描

4) 您的查询是否真的以一个点结束,就像您在问题中发布的那样?如果是,则该数字可能被视为浮点数而不是整数,从而导致类似于3)的类型转换


5) 您的删除查询正在等待其他速度较慢的查询释放锁,您首先想到的是:外键上的索引

  • 这与前面提到的级联删除有关
  • 所有子表都将被检查,如果您总共有500000个子行,这当然可能需要一些时间
第二个想法:触发射击

  • 在此表或子表上,或尝试通过代码等进行级联
  • 上帝禁止,删除中每一行的光标

正如其他人所观察到的,可能的嫌疑人是外键

首先,如果依赖表依次被其他表引用,则ON-DELETE级联可以聚集动量,而其他表又可能被引用,依此类推


其次,因为其他用户可能对需要删除的行有锁。这是最有可能导致超时的原因。具体如何工作取决于数据库的风格和版本。例如,较旧版本的Oracle(尝试更新统计数据。5000行不是什么大问题。如果您定期这样做,您也应该安排对该表的维护(即重新构建索引、更新统计数据等)。

您所说的“长时间”是什么意思?在5000行的表上,任何操作,即使是完整的表扫描,都应该是快速的。尤其是检查是否对任何本身索引严重的大型表进行级联删除。
delete from a A where a.ID = 132.