什么更快?
合并声明
MERGE INTO table_name
USING dual
ON (row_id = 'some_id')
WHEN MATCHED THEN
UPDATE SET col_name = 'some_val'
WHEN NOT MATCHED THEN
INSERT (row_id, col_name)
VALUES ('some_id', 'some_val')
Run Code Online (Sandbox Code Playgroud)
要么
查询select语句然后使用update或insert语句.
SELECT * FROM table_name where row_id = 'some_id'
Run Code Online (Sandbox Code Playgroud)
如果rowCount == 0
INSERT INTO table_name (row_id,col_name) VALUES ('some_id','some_val')
Run Code Online (Sandbox Code Playgroud)
其他
UPDATE table_name SET col_name='some_val' WHERE row_id='some_id'
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我正在访问SQL服务器后端.使用最频繁的部分之一是用户选择问题的答案,然后触发存储过程,查看是否已经给出答案,是否执行了UPDATE,如果没有执行INSERT.
这工作得很好,但现在我们已升级到SQL server 2008 express我想知道重写此SP以使用新的MERGE命令是否会更好/更快/更有效.
有没有人知道这是否比执行SELECT后跟INSERT或UPDATE更快?
当我尝试在某些条件下合并时,出现以下错误。有人能够解释为什么吗?看起来这是SQL Server本身的问题,但我想在这里发布它来确认。
尝试将不可为 NULL 的列的值设置为 NULL。
我正在使用 SQL Server 2017,但也在 Azure SQL 中观察到它
BEGIN TRANSACTION
SET XACT_ABORT ON;
CREATE TABLE RandomNumberHistory (Id INT NOT NULL, Number INT NOT NULL, [ValidFrom] DATETIME2 NOT NULL, [ValidTo] DATETIME2 NOT NULL);
CREATE TABLE RandomNumber (Id INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY, Number INT NOT NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
)
WITH …Run Code Online (Sandbox Code Playgroud) sql-server sql-merge azure-sql-database sql-server-2017 temporal-tables
我需要每天更新一个非常大的(300M记录)和广泛的TABLE1.更新的源数据位于另一个表中UTABLE,该表是行的10%-25%TABLE1但是很窄.两个表都record_id作为主键.
目前,我正在TABLE1使用以下方法重新创建:
<!-- language: sql -->
1) SELECT (required columns) INTO TMP_TABLE1
FROM TABLE1 T join UTABLE U on T.record_id=U.record_id
2) DROP TABLE TABLE1
3) sp_rename 'TMP_TABLE1', 'TABLE1'
Run Code Online (Sandbox Code Playgroud)
但是,我的服务器上需要将近40分钟(SQL Server为60GB的RAM).我希望获得50%的性能提升 - 我可以尝试其他选项吗?
MERGE并且UPDATE- 类似下面的代码只适用于非常小的UTABLE表 - 在完整大小时,所有内容都会挂起:
<!-- language: SQL -->
MERGE TABLE1 as target
USING UTABLE as source
ON target.record_id = source.record_id
WHEN MATCHED THEN
UPDATE SET Target.columns=source.columns
Run Code Online (Sandbox Code Playgroud)我听说我可以使用ROWCOUNT执行批量MERGE - 但我不认为它对于300M行表来说足够快.
任何SQL查询提示都有帮助吗?
我们开始在内存数据库中使用H2进行自动化测试.我们将Oracle用于生产和开发环境.因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle开发数据库中一样.
Oracle SQL语句包括MERGE语句,并在查询中使用表名和USING的别名.
如何以不改变开发环境中现有查询的方式动态修改此查询以与H2兼容?
Oracle SQL的示例,与H2兼容,
MERGE INTO TABLE T1
USING ( SELECT ....
...........
FROM DUAL) T2
Run Code Online (Sandbox Code Playgroud)
(T1和T2是表的别名)
在 SSMS 2008 R2 中,当我右键单击表时,我会看到“脚本表为”,然后是插入和更新选项。但是合并呢?合并实际上就是将这两者结合在一起。
我可以获得任何可以添加该选项的工具吗?(因此,我可以编写一个合并语句,准备好添加源信息(有点像插入和更新脚本已准备好添加要插入或更新的数据)。
我想创建一个合并,它将比较两个表并将不匹配的值插入另一个第三个表或表变量,如下所示:
MERGE Assets AS target
USING (@id, @name)FROM Sales AS source (id, name) ON (target.id = SOURCE.id)
WHEN MATCHED THEN
UPDATE SET target.Status = @status, target.DateModified = SYSUTCDATETIME()
WHEN NOT MATCHED THEN
INSERT INTO @tableVar (id, name, status, dateModified)
VALUES (@id, @name, @status, SYSUTCDATETIME())
Run Code Online (Sandbox Code Playgroud)
你们能帮助我使用其他一些结构来改造它吗?
随着一个变量bar的类型foo%ROWTYPE我都可以做INSERT,并UPDATE在PL/SQL:
INSERT INTO foo VALUES bar;
Run Code Online (Sandbox Code Playgroud)
UPDATE foo SET ROW = bar WHERE id = bar.id;
Run Code Online (Sandbox Code Playgroud)
但我该怎么做MERGE?以下方法生成以下错误消息:
MERGE INTO foo USING bar ON foo.id = bar.id
WHEN MATCHED THEN UPDATE SET ROW = bar
WHEN NOT MATCHED THEN INSERT VALUES bar;
Run Code Online (Sandbox Code Playgroud)
PL/SQL:ORA-00942:表或视图不存在
我有一个SQL Server存储过程,每次手动运行时都能正确执行EXEC,但是当它作为SSIS包的一部分运行时,它失败并出现如下错误:
Executing the query "EXECUTE (ProcName) " failed with the following error:
"The OLE DB provider "SQLNCLI10" for linked server "(OtherServer)" reported a
change in schema version between compile time ("177833127975044") and
run time ("177841717910098") for table (Server.Database.Schema.Table)".
Run Code Online (Sandbox Code Playgroud)
该过程是一个MERGE语句,它将视图中的数据合并到与SP相同的服务器上的另一个数据库中的表中.
视图指的是链接服务器OtherServer.链接服务器上引用的数据库将被删除并在每晚重新创建.
到目前为止,我尝试过这些东西:
1)在运行MERGE之前删除并重新创建视图.
2)定义包含MERGE的SP WITH RECOMPILE.
3)包装MERGE语句,EXEC()因此不会提前编译.
4)Bypass Prepare在SSIS的相关步骤中设置为true.
编辑:
具有存储过程的服务器正在运行SQL Server 2008.链接的服务器是2008 R2.
我在2个不同的模式中有一个表DOMAINS,其中包含列ID,NAME,CODE,DESCRIPTION.
对于新架构中存在的任何NAME,它应该使用现有ID而不进行任何合并; 对于那些新的NAME记录,它应该使用旧架构的ID插入.
MERGE INTO DOMAINS A
USING (SELECT ID,NAME,CODE,DESCRIPTION FROM <Old Schema 6.1>.DOMAINS@DB_MIG_61_TO_74) B
ON(A.NAME = B.NAME)
WHEN MATCHED **<do nothing>**
WHEN NOT MATCHED THEN INSERT(A.ID,A.NAME,A.CODE,A.DESCRIPTION)
VALUES(B.ID,B.NAME,B.CODE,B.DESCRIPTION);
Run Code Online (Sandbox Code Playgroud)
我如何解释上述查询中"无所事事"的部分?