我有这个表定义:
CREATE TABLE `media` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`brands_id` int(11) DEFAULT NULL,
`media_type` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`description` longtext COLLATE utf8_unicode_ci NOT NULL,
`thumbnail_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`media_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`media_code` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`inactive` tinyint(1) NOT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
`titleHtml` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`descriptionHtml` longtext COLLATE utf8_unicode_ci NOT NULL,
`useHtml` tinyint(1) NOT NULL,
PRIMARY KEY …Run Code Online (Sandbox Code Playgroud) 我通过计算另一个表中的 FK 来更新一个表
UPDATE table1
SET number = number +
(
SELECT COUNT(*) FROM table2
WHERE table1.id=table2.id
)
Run Code Online (Sandbox Code Playgroud)
table1是一张大桌子,我想制作UPDATE唯一的如果COUNT找到了一些东西。换句话说,我不想制作UPDATEfor number=0。
我有一个大约有 8.5m 行的表格。该表是 tokudb,它具有下面描述的索引。在尝试运行如下更新语句时,我遇到了令人沮丧的性能:
update retail.lw_item_discovery
set price = 'X',
prev_price = 'Y',
last_updated = '2016-04-13',
last_price_change = '2016-04-13'
where market = 'XX'
and sku = '123456'
Run Code Online (Sandbox Code Playgroud)
执行此更新需要 40 秒以上的时间。还有其他类似的更新经常发生,但是这台机器的 I/O 子系统并没有受到丝毫压力(RAID SSD),并且还有大量可用的 RAM。
EXPLAIN 产量:
update retail.lw_item_discovery
set price = 'X',
prev_price = 'Y',
last_updated = '2016-04-13',
last_price_change = '2016-04-13'
where market = 'XX'
and sku = '123456'
Run Code Online (Sandbox Code Playgroud)
基于此 - 它选择PRIMARY索引而不是其他索引之一,例如cl_unique_idx在前两个位置的 where 语句中具有两列的索引。所以我很难过为什么计划者选择了PRIMARY而不是导致性能如此糟糕。以下是索引列表:
+----+-------------+-------------------+------------+-------+------------------------------------------------------------+---------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | …Run Code Online (Sandbox Code Playgroud) 我试图从我的数据库中删除一个元素。我要删除的元素位于一个名为 playerContainer 的 JSON 对象中,该对象包含一个名为玩家的数组。这一切都位于一个名为 site_content 的表中。我正在尝试根据它的 ID 删除该对象。
这是示例 JSON
"playersContainer": {
"players": [
{
"id": "1",
"name": "Nick",
"teamName": "Shire Soldiers",
"ratings": [
1,
5,
6,
9
],
"assists": 17,
"manOfTheMatches": 20,
"cleanSheets": 1,
"data": [
3,
2,
3,
5,
6
],
"totalGoals": 19
},
}
Run Code Online (Sandbox Code Playgroud)
下面是我试图用来删除数组中的对象的查询
UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb
Run Code Online (Sandbox Code Playgroud)
但是,这似乎删除了表中内容行中的所有数据,而不仅仅是我的玩家数组中 ID 为 1 的数组。
让我解释 :
让我们假设我们有一个数据库“用户”:
ID Name Surname
===================
1 John Doe
2 Foo Bar
3 Foo Baz
Run Code Online (Sandbox Code Playgroud)
现在我想更改所有这三行。我将抛出以下插入:
INSERT INTO user (ID, Name, Surname) VALUES (1, 'John', 'Conor') ON DUPLICATE KEY UPDATE ID = 1, Name = 'John', Surname = 'Conor';
INSERT INTO user (ID, Name, Surname) VALUES (2, 'Foo', 'Bar') ON DUPLICATE KEY UPDATE ID = 2, Name = 'Foo', Surname = 'Bar';
INSERT INTO user (ID, Name, Surname) VALUES (3, 'Foo', 'Baz') ON DUPLICATE KEY UPDATE ID = 3, …Run Code Online (Sandbox Code Playgroud) 试图运行更新,但我想逐步完成它,因为它有相当多的数据并且不想一次全部爆炸。
在 oracle 中,选择我想要的行要容易一些,因为您可以将它包含在WHERE子句中,但在 T-SQL 中您将它包含在select. 我想写一些类似的东西:
Update Instances
set thing = 'new thing'
Where rownum<500
Run Code Online (Sandbox Code Playgroud)
基本上想一次做500个,这个语法在TSQL中可行吗?
我安装了 SQL Server 2016 RTM 并希望将其更新到 SP1。当我运行 SP1 累积更新时,它失败了,因为没有要更新的内容。大概这是因为它需要先安装 SP1。当我运行 SP1 安装程序时,它想创建一个新实例。
如何将现有实例从 RTM 更新到 SP1,而无需卸载和重新安装实例?
我很清楚堆中的转发记录是什么。由于我想将转发记录保留为 0,因此我们决定仅更新无法扩展的列。
最近在我的系统上我遇到了转发记录。
表设计是这样的:
CREATE TABLE dbo.test (
HashValue BINARY(16) NOT NULL,
LoadTime DATETIME NOT NULL,
LoadEndTime DATETIME NULL,
[other columns that never get updates]
) WITH(DATA_COMPRESSION=PAGE);
Run Code Online (Sandbox Code Playgroud)
插入语句总是带来HashValueAND LoadTime。我检查了查询日志。
我插入一个值 '9999-12-31'。
现在系统执行更新LoadTime如下:
;WITH CTE AS (
SELECT *, COALESCE(LEAD(LoadTime) OVER(PARTITION BY HashValue ORDER BY LoadTime) ,'9999-12-31') as EndTimeStamp
)
UPDATE CTE SET LoadEndTime = EndTimeStamp;
Run Code Online (Sandbox Code Playgroud)
由于该LoadEndTime列始终被填充,因此在执行更新时,该行内不应有该列的扩展。它应该是一个就地更新。在那个过程之后我仍然总是得到转发的记录......这对我来说没有意义。
插入语句是这样的:
INSERT INTO dbo.test (HashValue, LoadTime,LoadEndTime)
SELECT HASHBYTES(...), GETDATE(), '1900-01-01'
Run Code Online (Sandbox Code Playgroud)
所以已经有一个虚拟值。即使使用压缩,日期时间 '1900-01-01 00:00:00' 的固定和可变表示应该是 8 个字节。
最近我在代码中遇到了一个错误,相当于这个片段:
create table testing(num int, dt date, istrue boolean);
insert into testing values (1, '2018-01-01', True);
UPDATE testing SET num = 2, istrue = null AND dt = '2018-01-01';
Run Code Online (Sandbox Code Playgroud)
UPDATE 语句实际上应该是:
UPDATE testing SET num = 2, istrue = null WHERE dt = '2018-01-01';
Run Code Online (Sandbox Code Playgroud)
然而 postgresql 很高兴地接受了 UPDATE 为有效并评估了代码:
null AND dt = '2018-01-01'
Run Code Online (Sandbox Code Playgroud)
在第二个等号作为布尔值之后,因此基于错误的逻辑更新了数据。
我已经在其他 SQL 风格中尝试过这个,但这是不允许的,他们想要一个 WHERE。
我不是 postgres 的人,但它看起来确实是一个非常奇怪的语法怪癖,还是一个错误?
使用PostgreSQL v10.1.2 中的存储过程,哪种方法最快或哪种更好:检查行是否存在然后更新或尝试直接更新,但可能找不到与条件匹配的行?我需要检查很多条件相同的表,表是不是“非规范化”,我进行了几次测试,有时选项 1在其他情况下更快,选项 2 ...
选项1:
IF EXISTS ( SELECT 1
FROM public.table1
WHERE column1 = 'oldvalue' )
THEN
UPDATE public.table1
SET column1 = 'newvalue' , date_update= ....
WHERE column1 = 'oldvalue';
END IF ;
Run Code Online (Sandbox Code Playgroud)
选项 2:
UPDATE public.table1
SET column1 = 'newvalue' , date_update= ...
WHERE column1 = 'oldvalue';
Run Code Online (Sandbox Code Playgroud)
选项 3:
perform FROM public.table1 WHERE column1 = 'oldvalue' ;
if found then
UPDATE public.table1 SET column1='newvalue', date_update = ... WHERE column1 …Run Code Online (Sandbox Code Playgroud) postgresql performance stored-procedures update postgresql-10
update ×10
mysql ×3
postgresql ×3
insert ×2
sql-server ×2
count ×1
delete ×1
duplication ×1
heap ×1
json ×1
locking ×1
mariadb ×1
null ×1
performance ×1
t-sql ×1
tokudb ×1