小编a_h*_*ame的帖子

是否存在插入 + 删除比更新更快的实际场景?(SQL 服务器)

我只是想知道是否存在插入/删除组合比更新其他插入函数更快的常见场景。

这是我的具体例子。

我必须使用一次包含 1000 条记录的页面更新数据库。(我无法合并页面)。

这些记录中约有 5% 或 50 行是需要“更新”而不是作为全新插入的重复项。

我认为,不是“基于 ID 更新,否则插入新行”的典型功能,“插入所有内容”并在最后一次性删除重复项可能会更快。

两个原因:

  1. 并行性。如果我希望多个进程同时处理这个任务,那么......如果我有一个很大的提交大小和同时搜索和更新 ID 的事务,我可能会遇到行锁。通过“插入所有内容”并稍后删除“旧”记录,我可以有无限的进程同时写入数据。

  2. 我觉得在最后优化一个大的“删除查找”很容易。它看起来像下面这样:

    with CTE as (
       select primary_id,update_date,
              rn = row_number()over(partition by primary_id order by update_date desc)
       from MyTable
    )
    delete from CTE where rn > 1
    
    Run Code Online (Sandbox Code Playgroud)

我的意思是性能提升是存在的——我只是想知道这是否违背了最佳实践。有人能明白为什么插入 + 删除重复项似乎比“更新,如果没有找到,插入”更快?

我可以看到一个危险是在数据加载运行时有一段时间表不准确(在删除之前)。但是在任何更新过程中,这种情况难道不是真的吗?

这也将是数据仓库的临时表,而不是实时使用的数据。我只是想知道为什么我没有经常看到这种方法。

performance sql-server etl insert parallelism

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

PostgreSQL 中有没有办法为会话中的所有未来创建表语句设置默认所有者

我们有一个将 cobol 数据(索引文件)传输到数据库的程序。

到目前为止,我们将数据传输到了一个 oracle 数据库。

在程序开始时,我使用用户登录sys,然后将当前模式更改为ink. 我是这样做的,因为ink没有创建表的权限。

然后我创建了一个表,表所有者是自动的ink,而不是sys

我们最近将数据库从 Oracle 切换到 Postgres。

在这里,我以“postgres”身份登录,然后使用以下命令切换到“ink”模式:

set search_path to 'ink';
Run Code Online (Sandbox Code Playgroud)

然后我创建一个表,表所有者自动是postgres,不是ink。所以这种行为是相反的。

我该怎么做才能获得与 oracle 数据库相同的行为:

在我的场景中,表所有者应该自动是ink,而不是postgres

要是不用写就好了

ALTER TABLE ... OWNER TO ink;
Run Code Online (Sandbox Code Playgroud)

在每个创建表命令之后。

oracle ddl

5
推荐指数
2
解决办法
6404
查看次数

将行连接成单个字符串查询,运行 5 小时并计数

我有一张有 260 万条记录的表。它看起来像这样:

email                           prject_name
rafael.nadal@xyz.com              lab1
rafael.nadal@xyz.com              lab2
rafael.nadal@xyz.com              lab3
TEST@TEST.COM                     shift1
TEST@TEST.COM                     shift2
Run Code Online (Sandbox Code Playgroud)

但我希望我的桌子看起来像这样:

email                     project_name
rafael.nadal@xyz.com     lab1, lab2, lab3
TEST@TEST.COM            shift1, shift2, shift3
Run Code Online (Sandbox Code Playgroud)

我用过这个查询

select distinct email ,
STUFF((Select ','+project_name
from dbo.[UMG sent 2016] as  T1
where T1.email=T2.email
FOR XML PATH('')),1,1,'') from dbo.[UMG sent 2016] as T2;
Run Code Online (Sandbox Code Playgroud)

它已经运行了5个小时。
如何加快流程?

sql-server t-sql group-concatenation

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

如何检查用户是否在表空间上有配额

我的目标是检查表空间上的用户配额:

不幸的是,该表dba_ts_quotas提供了表空间上已使用空间的详细信息。

我想查看所有在 tbs 上有配额的用户,即使他们不使用表空间上的任何空间。

有没有解决方案来检查用户是否在 tbs 上有配额?

oracle

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

不与 OR 一起使用的索引

我有这样的查询:

SELECT t0.id
FROM platform_conversations t0
LEFT OUTER JOIN contacts t1 ON t1.id = t0.contact_id
WHERE t0.user_id = 5340
AND (
     t0.participant ILIKE '%baa%'  -- (1)
     OR t1.first_name ILIKE '%baa%' -- (2)
     )
LIMIT 50;
Run Code Online (Sandbox Code Playgroud)

CREATE INDEX ix_conversations_participant
  ON platform_conversations USING GIN (participant gin_trgm_ops);

CREATE INDEX ix_trgm_contacts_search
  ON contacts USING GIN (first_name gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

并且无法弄清楚为什么索引不与OR条件一起使用。如果我只使用 (1),或者只使用 (2),或者使用AND,它们都被使用。

这是计划:

仅适用于 (1)

Limit  (cost=12.43..203.68 rows=50 width=37) (actual time=0.037..0.037 rows=0 loops=1)
  ->  Bitmap Heap Scan on platform_conversations t0  (cost=12.43..222.80 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6

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

将 SQL Server 2000 数据库转换为 SQL Server 2016

我需要将一个 SQL Server 2000 数据库还原到 SQL Server 2016。有没有什么可能的方法可以做到这一点,而无需安装 SQL Server 2008 的完整副本,还原到 2008,更改兼容级别,然后将 2008 备份还原到 2016 ? 我知道这行得通,但我真的不想为了这个单一目的而安装 2008 R2,除非我别无选择。

sql-server

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

查看 SQL Server 2016 登录审核

我对失败和成功都有登录审核。如何查看实际日志?它们位于何处?

https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

有没有办法忽略服务帐户?

sql-server audit

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

获取postgresql中表的最后修改日期

我想知道 postgresql 中表的最后修改日期。在 SQL Server 中可以得到使用

SELECT modify_date FROM sys.objects 
Run Code Online (Sandbox Code Playgroud)

如何在 Postgres 中得到同样的东西?我正在使用 Postgres 9.4

postgresql postgresql-9.4

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

SQL Server 2017 CU10 是否包含 CVE-2018-8273 修补程序?

微软昨天发布了SQL Server 2017 CU10 KB4342123 (14.0.3037.1)。我尝试查看包含修补程序列表,但没有看到任何对最近发布的远程代码执行漏洞修补程序KB4293805 CVE-2018-8273 (14.0.3035.2)安全更新的引用。

我们如何确定 SQL Server 2017 CU10 是否包含安全修补程序 KB4293805 CVE-2018-8273?

CU10 的更高版本号是否足以确定这一点?

注意:我已经在 CU9 上安装了 CVE-2018-8273 修复程序。

sql-server patching sql-server-2017

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

跨多对多关系查询“全部”

想象一下三个表的设置,User、Group 和 UserGroup,其中 UserGroup 由指向每个 User 和 Group 表的简单外键组成。

User
----
id
name

Group
-----
id
name

UserGroup
---------
user_id
group_id
Run Code Online (Sandbox Code Playgroud)

现在,我想编写一个查询,选择所有指定组中的所有用户。例如,从用户是“group1”、“group2”和“group3”中的每一个的一部分的用户中选择*。

使用 Django ORM 查询,我会做类似的事情

users = (
    User.objects
    .filter(user_group__group_id=group1.id)
    .filter(user_group__group_id=group2.id)
    .filter(user_group__group_id=group2.id)
)
Run Code Online (Sandbox Code Playgroud)

这将为每次调用产生一个连接.filter,例如

SELECT * FROM users
INNER JOIN user_group g1 ON g1.user_id = id
INNER JOIN user_group g2 ON g2.user_id = id
INNER JOIN user_group g3 ON g3.user_id = id
WHERE g1.group_id = %s
  AND g2.group_id = %s
  AND g3.group_id = %s
Run Code Online (Sandbox Code Playgroud)

如果我要查询一个更大的集合来匹配,这会变得有点麻烦。

那么有什么更好的方法来做到这一点呢?如果我要问“任何”而不是“所有”,如果是一个简单的问题

SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql relational-division many-to-many

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