- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到的问题是这个 SQL 合并命令执行时间太长?仍然需要超过 30 秒。我们使用的是 MS-SQL 2012 Server。
那么,谁能告诉我 MERGE 语句做错了什么以及为什么?
谢谢...
/****** Object: StoredProcedure [dbo].[spDealerAccount_VehicleSalesRecordReload] Script Date: 07/02/2014 11:02:21 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ============================================================================
-- Author: ...
-- Create date: 07/01/2014
-- Description:
-- Either creates new or updates existing vehicle inventory record.
-- Record is updated only if ***either*** of following are met:
-- - source AccountID exists
-- - source VIN exists
-- - both source AccountID & VIN exists having no duplicate unique vehicle
-- References:
-- http://technet.microsoft.com/en-us/library/bb510625.aspx
-- http://en.wikipedia.org/wiki/Upsert
-- http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx (for explanation of HOLDLOCK)
-- ============================================================================
ALTER PROCEDURE [dbo].[spDealerAccount_VehicleSalesRecordReload]
@parmAccountId [bigint],
@parmBitwiseAcceptedTotal [bigint],
@parmYear [nvarchar](50),
@parmMake [nvarchar](50),
@parmModel [nvarchar](50),
@parmTrim [nvarchar](80),
@parmVin [nvarchar](17),
@parmSquishVin [nvarchar](12),
@parmVinValidationSkipped [bit],
@parmMileage [int],
@parmPurchaseDate [date],
@parmSaleDate [date],
@parmNumOfDays [int],
@parmSaleType [nvarchar](1),
@parmPurchaseAmount [money],
@parmRepairCostAmount [money],
@parmSaleAmount [money],
@parmTotalTradeAmount [money],
@parmGrossProfitAmount [money],
@parmZipcode [nvarchar](50),
@parmCity [nvarchar](50),
@parmState [nvarchar](50),
@parmRegion [nvarchar](50),
@parmStockNumber [nvarchar](50),
@parmLocation [nvarchar](150),
@parmDataSourceFrom [nvarchar](500),
@parmImportedVersion [int],
@parmCondition [nvarchar](50),
@parmAccessories [nvarchar](MAX),
@parmEngineDetail [nvarchar](50),
@parmExteriorColor [nvarchar](50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;
MERGE
INTO [dbo].[tblDealerSalesVehicles] WITH (HOLDLOCK) AS t
USING [dbo].[tblDealerSalesVehicles] AS s
ON (t.[AccountId] = s.[AccountId] AND t.[Vin] = s.[Vin])
--
-- if matched, update existing record if right conditions are met (see Description in header)
WHEN MATCHED THEN
UPDATE SET
--RawID...
--AccountID...
t.[BitwiseAcceptedTotal] = @parmBitwiseAcceptedTotal,
t.[Year] = @parmYear,
t.[Make] = @parmMake,
t.[Model] = @parmModel,
t.[Trim] = @parmTrim,
--VIN...
--SquishVin...
--[VinValidationSkipped...
t.[Mileage] = @parmMileage,
t.[StockDate] = @parmPurchaseDate,
t.[SoldDate] = @parmSaleDate,
t.[NumOfDays] = @parmNumOfDays,
t.[SaleType] = @parmSaleType,
t.[PurchPrice] = @parmPurchaseAmount,
t.[RepairCost] = @parmRepairCostAmount,
t.[SalePrice] = @parmSaleAmount,
t.[TotalTrade] = @parmTotalTradeAmount,
t.[GrossProfit] = @parmGrossProfitAmount,
t.[Zipcode] = @parmZipcode,
t.[City] = @parmCity,
t.[State] = @parmState,
t.[Region] = @parmRegion,
t.[StockNo] = @parmStockNumber,
t.[Location] = @parmLocation,
t.[DataSourceFrom] = @parmDataSourceFrom,
t.[ImportedVersion] = @parmImportedVersion,
t.[ModifiedDate] = GETDATE(),
--ImportedDate...
t.[TimeStamp] = GETDATE()
--
-- if not matched, add new record and set return values
WHEN NOT MATCHED THEN
--http://stackoverflow.com/questions/1609208/need-help-with-the-merge-statement...
--(Cannot use "s." or "t." for source or target table-name-abbreviation cuz "Columns name in the insert list can only refer to the target table, so the parser doesn't expect to see a table alias there, wouldn't know how to resolve it. It sees "column1", it knows it belongs to the target table. It sees "table1.column1", it doesn't know what "table1" means. "table1" is out of scope, so to speak")...
INSERT (
--RawID...
[AccountID], [BitwiseAcceptedTotal],
[Year], [Make], [Model], [Trim], [VIN], [SquishVin], [VinValidationSkipped],
[Mileage], [StockDate], [SoldDate], [NumOfDays], [SaleType],
[PurchPrice], [RepairCost], [SalePrice],
[TotalTrade], [GrossProfit],
[Zipcode], [City], [State], [Region],
[StockNo], [Location],
[DataSourceFrom], [ImportedVersion], [ModifiedDate], [ImportedDate], [TimeStamp]
)
VALUES (
@parmAccountId, @parmBitwiseAcceptedTotal,
@parmYear, @parmMake, @parmModel, @parmTrim, @parmVin, @parmSquishVin, @parmVinValidationSkipped,
@parmMileage, @parmPurchaseDate, @parmSaleDate, @parmNumOfDays, @parmSaleType,
@parmPurchaseAmount, @parmRepairCostAmount, @parmSaleAmount,
@parmTotalTradeAmount, @parmGrossProfitAmount,
@parmZipcode, @parmCity, @parmState, @parmRegion,
@parmStockNumber, @parmLocation,
@parmDataSourceFrom, @parmImportedVersion, NULL, GETDATE(), GETDATE()
)
; -- required semicolon separator for MERGE
RETURN @@ERROR;
END
最佳答案
我认为您的 MERGE 语句没有达到您的预期。您具有相同的源和目标,没有指向参数的链接,因此这一点:
MERGE
INTO [dbo].[tblDealerSalesVehicles] WITH (HOLDLOCK) AS t
USING [dbo].[tblDealerSalesVehicles] AS s
ON (t.[AccountId] = s.[AccountId] AND t.[Vin] = s.[Vin])
将匹配每个现有记录并使用您的参数更新它。您可能想使用类似的东西:
MERGE
INTO [dbo].[tblDealerSalesVehicles] WITH (HOLDLOCK) AS t
USING (VALUES (@parmAccountId, @ParamVin)) AS s (AccountID, Vin)
ON (t.[AccountId] = s.[AccountId] AND t.[Vin] = s.[Vin])
WHEN MATCHED THEN
UPDATE SET
....etc
关于sql - MERGE 语句执行时间太长(仅针对 1 条记录)。 (MS-SQL Server 2012),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535211/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!