标签: update

索引对更新列不在索引中的更新语句的影响

我经常看到人们说索引变慢了updatedelete并且insert。这被用作笼统的陈述,就好像它是绝对的一样。

在调整我的数据库以提高性能的同时,我不断遇到这种情况,这对我来说在逻辑上似乎与该规则相矛盾,而且我找不到任何人以其他方式说或解释。

在 SQL Server 中,我相信/假定大多数其他 DBMS,您的索引是根据您指定的特定列创建的。插入和删除总是会影响整行,因此它们不可能不影响索引,但更新似乎更独特一些,它们只能专门影响某些列。

如果我有未包含在任何索引中的列并且我更新它们,它们是否会因为我在该表中的其他列上有索引而变慢?

例如,在我的User表中,我有一个或两个索引,主键是 Identity/Auto Increment 列,另一个可能是某个外键列。
如果我直接更新一个没有索引的列,比如他们的电话号码或地址,这个更新是否会变慢,因为我在这两种情况下的其他列上都有索引?我正在更新的列不在索引中,所以从逻辑上讲,索引不应该更新,不是吗?如果有的话,我认为如果我在 WHERE 子句中使用索引,它们会加速。

performance index sql-server update query-performance

18
推荐指数
2
解决办法
4万
查看次数

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  
Run Code Online (Sandbox Code Playgroud)

但是这个禁用和启用触发器将影响当前登录的所有用户。因此,当我的脚本禁用触发器时,另一个用户有可能运行 UPDATE/INSERT,这并不好。这就是为什么我只想为当前会话禁用和启用触发器。是否可以?如果是,请告诉如何。

谢谢

trigger sql-server update

18
推荐指数
2
解决办法
2万
查看次数

在重复键上什么都不做

我正在使用带有 PtokaX API 的 LuaSQL 插入到下表中。

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` (`ctg`, `msg`)
)
COMMENT='Requests from users in any of the categories.'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,当用户(由 表示nick)尝试再次插入相同的请求时,UNIQUE会检查索引并且脚本返回 false。这会导致我的脚本失败,我必须重新启动脚本。

有什么我可以在INSERT ... ON DUPLICATE KEY …

mysql insert duplication update

17
推荐指数
1
解决办法
5万
查看次数

更新 json 数据类型中的 json 元素

我不知道如何更新 PostgreSQL 9.3 数据类型中的元素。

我的例子:

CREATE TABLE "user"
(
  id uuid NOT NULL,
  password character varying(255),
  profiles json,
  gender integer NOT NULL DEFAULT 0,
  created timestamp with time zone,
  connected timestamp with time zone,
  modified timestamp with time zone,
  active integer NOT NULL DEFAULT 1,
  settings json,
  seo character varying(255) NOT NULL,
  CONSTRAINT id_1 PRIMARY KEY (id)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE "user"
  OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

“配置文件”中的 json 部分

CREATE TABLE "user"
(
  id uuid NOT NULL,
  password …
Run Code Online (Sandbox Code Playgroud)

postgresql update postgresql-9.3 json

17
推荐指数
3
解决办法
6万
查看次数

使用一条更新语句切换列中的值

您发现系统中的一个错误将数据库中的男性 (M) 错误地命名为女性 (W),反之亦然。列只允许一个字符。在不使用任何临时表的情况下,编写一个更新查询来解决这个问题。

这个问题是在我最近的一次采访中被问到的,我将参加更多可能有类似问题的采访,所以我想知道如何处理这个问题。

update

17
推荐指数
3
解决办法
4万
查看次数

使用 CASE 在 UPDATE 查询中选择列?

我可以CASE用来选择在SELECT查询 (Postgres) 中显示哪些列,如下所示:

SELECT CASE WHEN val = 0 THEN column_x
            WHEN val = 1 THEN column_y
            ELSE 0
       END AS update, ...
Run Code Online (Sandbox Code Playgroud)

UPDATE在 Postgres 中执行查询时是否有可能发生类似的事情(即选择应该更新哪些列)?我假设不是,因为我找不到任何关于此的信息,但也许有人有一个聪明的选择(除了使用过程或使用 a 更新每一列CASE来确定是否应为该列的值分配一个新值或简单地重新分配现有的价值)。如果没有简单的选择,我当然也会接受它作为答案。

额外信息:在我的情况下,我有 14 个可能的列可以更新,每个匹配行只更新一个(要更新的表与查询中的另一个表连接)。要更新的行数很可能会有所不同,可能是数十或数百。我相信加入条件的索引已经到位。

postgresql update

16
推荐指数
2
解决办法
8万
查看次数

使用子查询对大表进行缓慢更新

由于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+'%'
             )
Run Code Online (Sandbox Code Playgroud)

在英语中,这个查询计数Bad_Phrase列出不同的短语是一个子领域的数量NameSourceTable,然后把该结果在现场Bad_Count

我想要一些关于如何让这个查询运行得更快的建议。

sql-server-2005 sql-server subquery update

16
推荐指数
2
解决办法
1519
查看次数

使用表别名更新请求

执行这个请求:

update table t1 set t1.column = 0 where t1.column2 = 1234
Run Code Online (Sandbox Code Playgroud)

收到此错误:

关系“表”的“t1”列不存在

这个请求在 MySQL 中运行良好。
为什么我会在 PostgreSQL 中收到此错误?

postgresql update

16
推荐指数
2
解决办法
1万
查看次数

锁定 Postgres 以进行 UPDATE / INSERT 组合

我有两张桌子。一个是日志表;另一个本质上包含只能使用一次的优惠券代码。

用户需要能够兑换优惠券,这将在日志表中插入一行并将优惠券标记为已使用(通过将used列更新为true)。

当然,这里存在明显的竞争条件/安全问题。

我过去在 mySQL 的世界里做过类似的事情。在那个世界中,我会全局锁定两个表,在知道这一次只能发生一次的情况下执行逻辑安全,然后在我完成后解锁表。

Postgres 有没有更好的方法来做到这一点?特别是,我担心锁是全局的,但不是必须的——我真的只需要确保没有其他人试图输入那个特定的代码,所以也许一些行级锁会起作用?

postgresql concurrency locking update

15
推荐指数
1
解决办法
2万
查看次数

PostgreSQL 递归后裔深度

我需要从它的祖先计算后代的深度。当一个记录有 时object_id = parent_id = ancestor_id,它被认为是一个根节点(祖先)。我一直在尝试WITH RECURSIVE使用 PostgreSQL 9.4运行查询。

我不控制数据或列。数据和表架构来自外部源。该表正在不断增长。现在每天大约有 3 万条记录。树中的任何节点都可能丢失,并且它们将在某个时候从外部源中拉出。它们通常按created_at DESC顺序拉取,但数据是通过异步后台作业拉取的。

我们最初对这个问题有一个代码解决方案,但现在有 500 万行以上,几乎需要 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)
VALUES (2, 1, 2, 1, 1, -1), --no parent yet
       (3, 2, …
Run Code Online (Sandbox Code Playgroud)

postgresql cte update recursive

15
推荐指数
1
解决办法
4303
查看次数