我需要从.NET 4.5应用程序调用存储过程。作为ORM,我使用Dapper。
存储过程接受TVP参数,并且Cars
仅在car_id
不存在带有的汽车时将汽车从列表插入到表中。
桌子:
CREATE TABLE USERS
(
CAR_ID int IDENTITY PRIMARY KEY,
CAR_NAME varchar(255),
)
TVP:
CREATE TYPE dbo.CarType
AS TABLE
(
CAR_ID int null,
CAR_NAME varchar(800) not null,
);
存储过程:
CREATE PROCEDURE dbo.InsertCars
@Cars AS CarType READONLY
AS
BEGIN
DECLARE @CountOfNew int
INSERT INTO CARS (CAR_ID, CAR_NAME)
SELECT C.CAR_ID, C.CAR_NAME
FROM @CARS C
WHERE NOT EXISTS(SELECT 1 FROM CARS WHERE CAR_ID = C.CAR_ID)
SET @CountOfNew = @@ROWCOUNT
RETURN @CountOfNew
END
问题是存储过程的性能。如果表中存在3万多辆汽车,则存储过程调用将花费20秒。
我调试我的应用程序,通过SQL Server Management Studio进行测试,并且我认为瓶颈是存储过程。
任何建议如何调整此存储过程。
我使用SQL Server 2012。
谢谢
运行SQL Server Profiler,并包括Showplan Statistics XML Profile事件。针对大型案例(> = 30,000辆汽车)运行查询,然后查看其效果。
根据您的SQL Server版本,您可以尝试MERGE(如果在SQL 2008或更高版本上),或者在LEFT JOIN WHERE Car_ID IS NULL如下所示:
INSERT INTO CARS (CAR_ID, CARNAME)
SELECT C.CAR_ID, C.CARNAME
FROM @CARS C
LEFT JOIN Cars ON Cars.CAR_ID = C.CAR_ID
WHERE Cars.Car_ID IS NULL -- the car does not already exist
另外,您可以尝试声明CarType具有CAR_ID的PRIMARY KEY。
(我假设TVP CarType密钥是CAR_ID,而不是您编写的CARID。而且,您将此表声明为USERS而不是CARS。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句