我只是想知道是否存在插入/删除组合比更新其他插入函数更快的常见场景。
这是我的具体例子。
我必须使用一次包含 1000 条记录的页面更新数据库。(我无法合并页面)。
这些记录中约有 5% 或 50 行是需要“更新”而不是作为全新插入的重复项。
我认为,不是“基于 ID 更新,否则插入新行”的典型功能,“插入所有内容”并在最后一次性删除重复项可能会更快。
两个原因:
并行性。如果我希望多个进程同时处理这个任务,那么......如果我有一个很大的提交大小和同时搜索和更新 ID 的事务,我可能会遇到行锁。通过“插入所有内容”并稍后删除“旧”记录,我可以有无限的进程同时写入数据。
我觉得在最后优化一个大的“删除查找”很容易。它看起来像下面这样:
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)我的意思是性能提升是存在的——我只是想知道这是否违背了最佳实践。有人能明白为什么插入 + 删除重复项似乎比“更新,如果没有找到,插入”更快?
我可以看到一个危险是在数据加载运行时有一段时间表不准确(在删除之前)。但是在任何更新过程中,这种情况难道不是真的吗?
这也将是数据仓库的临时表,而不是实时使用的数据。我只是想知道为什么我没有经常看到这种方法。
我们有一个将 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)
在每个创建表命令之后。
我有一张有 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个小时。
如何加快流程?
我的目标是检查表空间上的用户配额:
不幸的是,该表dba_ts_quotas提供了表空间上已使用空间的详细信息。
我想查看所有在 tbs 上有配额的用户,即使他们不使用表空间上的任何空间。
有没有解决方案来检查用户是否在 tbs 上有配额?
我有这样的查询:
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) 我需要将一个 SQL Server 2000 数据库还原到 SQL Server 2016。有没有什么可能的方法可以做到这一点,而无需安装 SQL Server 2008 的完整副本,还原到 2008,更改兼容级别,然后将 2008 备份还原到 2016 ? 我知道这行得通,但我真的不想为了这个单一目的而安装 2008 R2,除非我别无选择。
我对失败和成功都有登录审核。如何查看实际日志?它们位于何处?
https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio
有没有办法忽略服务帐户?
我想知道 postgresql 中表的最后修改日期。在 SQL Server 中可以得到使用
SELECT modify_date FROM sys.objects
Run Code Online (Sandbox Code Playgroud)
如何在 Postgres 中得到同样的东西?我正在使用 Postgres 9.4
微软昨天发布了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 修复程序。
想象一下三个表的设置,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) sql-server ×5
postgresql ×3
oracle ×2
audit ×1
ddl ×1
etl ×1
insert ×1
many-to-many ×1
parallelism ×1
patching ×1
performance ×1
t-sql ×1