我在SQL DB Server中有一个表。 (表名:材料,6列)。它包含260万条记录。我需要根据两个列值更新此表。对于更新,系统需要2秒钟。
请帮我优化以下查询。
activate: function( event, ui ) {
$(ui.newHeader).get(0).scrollIntoView();
}
答案 0 :(得分:2)
在我们可以确切地告诉您什么(如果有的话)可能有帮助之前,您确实需要提供查询计划。
话虽如此,我要检查的第一件事是该计划是否显示了大量时间进行表扫描。如果是这样,通过在.cakebg {
background-color: #F8BBD0;
background-size: 25%;
position: relative;
}
.cakebg::after {
content: "";
background: url(img/cake.png);
opacity: 0.5;
top: 0;
left: 0;
bottom: 0;
right: 0;
position: absolute;
z-index: -1;
}
和SM
上添加索引,可以大大提高性能,这将允许分析器使用索引来执行索引搜索而不是表扫描,并且可以大大提高性能。
答案 1 :(得分:1)
由于您获得大数据,因此很少有调整可以提高查询性能
(1)如果要更新的列已编入索引,请删除索引
(2)以较小批量执行更新
DECLARE @i INT=1
WHILE( @i <= 10 )
BEGIN
UPDATE TOP(20000) Material
SET Value = @Value,
Format = @Format,
SValue = @SValue,
CGroup = @CGroup
WHERE
SM = @SM
AND Characteristic = @Characteristic
SET @i=@i + 1
END
(3)禁用删除触发器(如果有)
希望这有帮助!
答案 2 :(得分:1)
尝试为SM&amp;放置综合指数特点。通过这样做,sql server将能够更轻松地选择记录。操作方面,更新是插入和放大的组合。删除。如果您的表中包含更多列,即使您没有尝试更新所有列,也可能会降低更新速度。
我喜欢的步骤
答案 3 :(得分:1)
2.6 mil行并不是那么多。 2秒的更新可能太多了。
话虽如此,更新时间可能取决于两件事。
首先,使用单个更新命令更新了多少行,即它只是一行还是一些更大的集合?你可以做很多事情,只是说应该考虑它。
另一件事是索引 - 你可能有太多当时或不够。
如果表中缺少索引(SM,特征) - 或(特性,SM),取决于选择性 - 那么它可能每次都是全表扫描。如果更新仅触及几行,则浪费时间。所以,这是第一件要检查的事情。
如果受影响列上的索引太多,这也可能会降低更新速度,因为每次更改数据都必须维护这些索引。您可以通过查询sys.dm_db_index_usage_stats DMV来检查索引的有用性(在互联网上有很多解释,所以我不会在这里进入它)并删除未使用的。只要小心这一点并彻底测试。
要检查的另一件事是受影响的列是否是某些外键约束的一部分。在这种情况下,引擎必须每次都检查约束的有效性(iow,检查引用表中是否存在新值,或检查引用表中是否有数据,具体取决于FK的哪一侧)专栏是)。如果此检查没有支持索引,则会(再次)对所涉及的其他表进行扫描。
但要真正确定,检查执行计划和IO统计数据(SET STATISTICS IO ON),它会告诉你究竟发生了什么。