Questions tagged «update»

UPDATE更改所有满足条件的行中指定列的值。SET子句中仅需提及要修改的列;未显式修改的列将保留其先前的值。

1
Postgres UPDATE…LIMIT 1
我有一个Postgres数据库,其中包含有关服务器群集的详细信息,例如服务器状态(“活动”,“备用”等)。活动服务器在任何时候都可能需要故障转移到备用服务器,而且我不在乎使用哪个备用服务器。 我希望数据库查询更改备用数据库(仅一个)的状态,并返回要使用的服务器IP。选择可以是任意的:由于服务器的状态随查询而变化,因此选择哪个备用数据库都无关紧要。 是否可以将查询限制为仅一次更新? 这是我到目前为止的内容: UPDATE server_info SET status = 'active' WHERE status = 'standby' [[LIMIT 1???]] RETURNING server_ip; Postgres不喜欢这样。我可以做些什么?

4
如何动态基于另一个表的值更新一个表?
我有一个以ips为名的表格,如下所示: CREATE TABLE `ips` ( `id` int(10) unsigned NOT NULL DEFAULT '0', `begin_ip_num` int(11) unsigned DEFAULT NULL, `end_ip_num` int(11) unsigned DEFAULT NULL, `iso` varchar(3) DEFAULT NULL, `country` varchar(150) DEFAULT NULL ) ENGINE=InnoDB 假设我countryid在国家表的此表上有一个字段,如下所示: CREATE TABLE `country` ( `countryid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci …
40 mysql  update 

2
在PostgreSQL中优化批量更新性能
在Ubuntu 12.04上使用PG 9.1。 目前,我们最多需要24小时才能在数据库上运行大量的UPDATE语句,其形式为: UPDATE table SET field1 = constant1, field2 = constant2, ... WHERE id = constid (我们只是覆盖由ID标识的对象的字段。)这些值来自外部数据源(尚未存在于表的DB中)。 该表每个都有少量索引,没有外键约束。直到结束都不会进行COMMIT。 导入pg_dump整个数据库需要2小时。这似乎是我们应该合理定位的基准。 缺少生成自定义程序以某种方式为PostgreSQL重新构造数据集以重新导入的方法,我们是否可以做些什么使批量UPDATE性能更接近于导入?(这是我们认为日志结构的合并树可以很好处理的一个区域,但是我们想知道PostgreSQL中是否可以做任何事情。) 一些想法: 删除所有非ID索引并随后进行重建? 增加checkpoint_segments,但这实际上有助于持续的长期吞吐量吗? 使用这里提到的技术?(将新数据作为表加载,然后“合并”在新数据中找不到ID的旧数据) 基本上,有很多事情可以尝试,我们不确定最有效的是什么,或者我们是否忽略了其他事情。我们将在接下来的几天中进行实验,但我们也想在这里提出问题。 我确实在表上有并发负载,但是它是只读的。

6
如何尽可能快地更新MySQL单个表中的1000万行以上?
对大多数表使用MySQL 5.6和InnoDB存储引擎。InnoDB缓冲池大小为15 GB,Innodb DB +索引约为10 GB。服务器具有32GB RAM,并且正在运行Cent OS 7 x64。 我有一张大表,其中包含大约一千万条记录。 我每24小时从远程服务器获取一个更新的转储文件。该文件为csv格式。我无法控制该格式。该文件约为750 MB。我尝试将数据逐行插入MyISAM表中,这花了35分钟。 我只需要从文件中取出10-12行中的每行3个值,然后在数据库中更新它。 实现这样的最佳方法是什么? 我需要每天这样做。 当前Flow是这样的: mysqli_begin_transaction 逐行读取转储文件 逐行更新每个记录。 mysqli_commit 以上操作大约需要30-40分钟才能完成,在执行此操作的同时,还有其他更新正在进行中 超过了锁定等待超时;尝试重新启动事务 更新1 使用加载新表中的数据LOAD DATA LOCAL INFILE。在MyISAM中,花38.93 sec了7分钟5.21秒,而在InnoDB中,花了7分钟。然后我做了: UPDATE table1 t1, table2 t2 SET t1.field1 = t2.field1, t1.field2 = t2.field2, t1.field3 = t2.field3 WHERE t1.field10 = t2.field10 Query OK, …

5
没有数据更改的UPDATE性能
如果我有一条UPDATE声明实际上并未更改任何数据(因为数据已经处于更新状态)。在WHERE子句中添加检查以阻止更新是否对性能有好处? 例如,在以下情况下,UPDATE 1和UPDATE 2之间的执行速度是否会有所不同: CREATE TABLE MyTable (ID int PRIMARY KEY, Value int); INSERT INTO MyTable (ID, Value) VALUES (1, 1), (2, 2), (3, 3); -- UPDATE 1 UPDATE MyTable SET Value = 2 WHERE ID = 2 AND Value <> 2; SELECT @@ROWCOUNT; -- UPDATE 2 UPDATE MyTable SET …


3
如何通过更新(软件和硬件)为重I / O优化数据库
这种情况 我有一个PostgreSQL 9.2数据库,它一直在大量更新。因此,该系统受I / O限制,我目前正在考虑进行另一次升级,我只需要一些有关从何开始改进的指导。 这是过去三个月情况的图片: 如您所见,更新操作占据了大多数磁盘利用率。这是在更详细的3小时窗口中情况的另一幅图片: 如您所见,峰值写入速率约为20MB / s 软件 服务器正在运行ubuntu 12.04和postgresql 9.2。更新类型通常是在ID标识的各个行上进行小更新。例如UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id。我已经尽可能地删除和优化了索引,并且服务器配置(Linux内核和postgres conf)也都进行了优化。 硬件 硬件是一台专用服务器,在RAID 10阵列中具有32GB ECC ram,4个600GB 15.000 rpm SAS磁盘,由带BBU的LSI RAID控制器和Intel Xeon E3-1245 Quadcore处理器控制。 问题 对于这种口径的系统(读/写),图表显示的性能是否合理? 因此,我应该集中精力进行硬件升级还是对软件进行更深入的研究(内核调整,conf,查询等)? 如果进行硬件升级,磁盘数量是性能的关键吗? ------------------------------更新------------------- ---------------- 我现在已经用四个Intel 520 SSD而不是旧的15k SAS磁盘升级了我的数据库服务器。我正在使用相同的RAID控制器。事情已经大大改善了,从下面的内容可以看出,I / O的峰值性能提高了6到10倍左右-太好了! 但是,根据答案和新SSD的I …

2
更新所有列(即使是未更改的列)的开销是多少?
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 在更新行时,许多ORM工具都会发出UPDATE语句来设置与该特定实体相关联的每一列。 优点是您可以轻松批处理update语句,因为UPDATE无论您更改什么实体属性,该语句都是相同的。此外,您甚至还可以使用服务器端和客户端语句缓存。 因此,如果我加载一个实体并仅设置一个属性: Post post = entityManager.find(Post.class, 1L); post.setScore(12); 所有列都将被更改: UPDATE post SET score = 12, title = 'High-Performance Java Persistence' WHERE id = 1 现在,假设我们在title属性上也有一个索引,DB难道不应该意识到该值没有改变吗? 在本文中,Markus Winand说: 所有列上的更新都显示了我们在上一节中已经观察到的相同模式:响应时间随每个其他索引的增加而增加。 我不知道为什么会产生这种开销,因为数据库将相关的数据页从磁盘加载到内存中,从而可以确定是否需要更改列值。 即使对于索引,它也不会重新平衡任何内容,因为对于未更改的列,索引值不会更改,但是它们已包含在UPDATE中。 是否也需要导航与冗余未更改列关联的B +树索引,只是为了让数据库意识到叶值仍然相同? 当然,某些ORM工具允许您仅更新已更改的属性: UPDATE post SET score = 12, WHERE id = 1 但是,当为不同的行更改不同的属性时,这种类型的UPDATE可能并不总是从批量更新或语句缓存中受益。

3
索引对更新列不在索引中的更新语句的影响
我经常看到人们说索引变慢update,delete并且insert。这用作一揽子声明,就好像它是绝对的一样。 在调整数据库以提高性能的同时,我不断遇到这种情况,这种情况似乎在逻辑上对我来说与该规则相矛盾,而且我在任何地方都找不到其他方式可以说或解释的人。 在SQL Server中,并且我相信/假定将使用大多数其他DBMS,您的索引是根据您指定的特定列创建的。插入和删除将始终影响整个行,因此没有办法不会影响索引,但是更新似乎更加独特,它们可以专门影响某些列。 如果我有未包含在任何索引中的列并更新了它们,它们是否会因为我在该表中的其他列上有索引而放慢了速度? 例如,在我的User表中,我有一个或两个索引,主键是Identity / Auto Increment列,外键列上可能还有另一个。 如果我更新没有索引直接在其上的列(例如说他们的电话号码或地址),由于在任何一种情况下我在该表的其他列上都有索引,此更新是否会变慢?我要更新的列不在索引中,因此从逻辑上讲,不应更新索引,不是吗?如果有的话,如果我使用WHERE子句中的索引,我认为它们会加快速度。

3
带有子查询的大表更新缓慢
对于SourceTable具有> 15MM的记录和Bad_Phrase具有> 3K的记录,以下查询需要将近10个小时才能在SQL Server 2005 SP4上运行。 UPDATE [SourceTable] SET Bad_Count= ( SELECT COUNT(*) FROM Bad_Phrase WHERE [SourceTable].Name like '%'+Bad_Phrase.PHRASE+'%' ) 用英语来说,此查询计算的是Bad_Phrase中列出的,是字段Name中的子字符串的不同短语的数量,SourceTable然后将结果放入字段中Bad_Count。 我想要一些有关如何使此查询运行得更快的建议。

3
SQL Server:如何仅针对当前会话禁用更新触发?
我正在使用SQL Server 2008 R2。 我有一个表好处,它有一个名为tiu_benefit的AFTER INSERT,UPDATE触发器。 我想为此表编写一个UPDATE语句以更新1行,但我不希望其触发器触发。我知道我可以在UPDATE之前禁用触发器,然后在UPDATE之后启用触发器: DISABLE TRIGGER tiu_benefit ON benefit; GO UPDATE benefit SET editor = 'srh' where benefit_id = 9876 GO ENABLE TRIGGER tiu_benefit ON benefit; GO 但是此禁用和启用触发器将影响当前登录的所有用户。因此,当我的脚本禁用触发器时,另一个用户可能会运行UPDATE / INSERT,这不好。这就是为什么我只想为当前会话禁用和启用触发器。可能吗?如果是,请告诉如何。 谢谢

2
PostgreSQL递归后代深度
我需要根据祖先计算后代的深度。当记录具有时object_id = parent_id = ancestor_id,它将被视为根节点(祖先)。我一直在尝试使WITH RECURSIVE查询与PostgreSQL 9.4一起运行。 我不控制数据或列。数据和表架构来自外部来源。桌子在不断增长。目前每天约有3万条记录。树中的任何节点都可能丢失,并且它们有时会从外部源中拉出。通常按created_at DESC顺序提取它们,但是使用异步后台作业提取数据。 最初,我们有一个解决此问题的代码,但现在有5M +行,需要近30分钟才能完成。 表定义和测试数据示例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) …


2
对重复键不执行任何操作
我将LuaSQL与PtokaX API插入下表中。 CREATE TABLE `requests` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `ctg` VARCHAR(15) NOT NULL, `msg` VARCHAR(250) NOT NULL, `nick` VARCHAR(32) NOT NULL, `filled` ENUM('Y','N') NOT NULL DEFAULT 'N', `dated` DATETIME NOT NULL, `filldate` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `nick_msg` (`nick`, `msg`), UNIQUE INDEX `ctg_msg` …

1
无法在非唯一索引上插入重复的键行?
在连续八周无错误之后,过去几天我们三度遇到了这个奇怪的错误,我很沮丧。 这是错误消息: Executing the query "EXEC dbo.MergeTransactions" failed with the following error: "Cannot insert duplicate key row in object 'sales.Transactions' with unique index 'NCI_Transactions_ClientID_TransactionDate'. The duplicate key value is (1001, 2018-12-14 19:16:29.00, 304050920).". 我们拥有的索引不是唯一的。如果您注意到,错误消息中的重复键值甚至不会与索引对齐。奇怪的是,如果我重新运行proc,它将成功。 这是我发现的最新链接,但有我的问题,但没有解决方案。 https://www.sqlservercentral.com/forums/topic/error-cannot-insert-duplicate-key-row-in-a-non-unique-index 关于我的场景的几件事: proc正在更新TransactionID(主键的一部分)-我认为这是导致错误的原因,但不知道为什么?我们将删除该逻辑。 在表上启用了更改跟踪 进行事务读取未提交 每个表有45个字段,我主要列出索引中使用的字段。我在更新语句中(不必要)更新TransactionID(集群键)。奇怪的是,直到上周,我们几个月都没有遇到任何问题。而且这只是通过SSIS偶尔发生的。 表 USE [DB] GO /****** Object: Table [sales].[Transactions] Script …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.