合并语句优化

时间:2017-06-23 15:16:07

标签: sql-server ssis

我在SQL Server中有两个表,其中一个是MERGE操作到另一个表的源。

源表有30Mil记录

Target表有180Mil记录。两个表都有227列。

我确实有SSIS,但在这种情况下我被告知,MERGE语句是更好的选择。以下是它的缩短版本:

import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule } from '@angular/http';

import { HeaderMenuComponent } from './index';

@NgModule({
    declarations: [
        HeaderMenuComponent
    ],
    imports: [
        RouterModule,
        BrowserModule,
        HttpModule
    ],
    exports: [
        HeaderMenuComponent
    ]
})
export class HeaderMenuModule {
}

我对上面脚本所做的唯一更改是截断列列表以使代码块保持简短。

我的问题是我对执行感到不满。个人资料屏幕会显示;WITH MySource as ( SELECT * FROM [STAGE].[dbo].[STAGE_TABLE] ) MERGE [EDW].[dbo].[TARGET_TABLE] AS MyTarget USING MySource ON MySource.[ID_FIELD] = MyTarget.[ID_FIELD] AND MySource.[LoadDate] >= MyTarget.[LoadDate] WHEN MATCHED THEN UPDATE SET <<Target Column>> = MySource.<<Source Colums>> --227 columns WHEN NOT MATCHED THEN INSERT ( [ID_FIELD], [LoadDate], <<225 Other Columns>> ) VALUES ( MySource.[ID_FIELD], MySource.[LoadDate], MySource.<<225 other columns>> ); 暂停,其中包含错误:CXPACKET

如何解决此问题?谢谢。

1 个答案:

答案 0 :(得分:0)

看起来像CXPACKET和暂停状态意味着已经完成的一些线程正在记录尚未完成的其他线程的状态。 请点击这里。查询需要在表中更新最多10亿个值。因此,查询运行缓慢。

https://dba.stackexchange.com/questions/96346/cxpacket-suspended-and-null-wait-type

https://www.sqlshack.com/troubleshooting-the-cxpacket-wait-type-in-sql-server/

希望这些文章可以帮助您调试。