SQL Insert Speed Efficiency using stored procedure
I am using a stored procedure to inserting about 5k records into a single
table with 15 columns of which about 10 of them end up mostly NULL.
It takes about 16 seconds to do this. It seems like that is a rather long
time, I am just wondering if this is normal speed or if I should be doing
something to increase efficiency.
Just to try some things I tried removing the IF/SELECT from the Stored
Proc, i tried removing the loop in C# to replace DB.NULL values and still
16 seconds...
This is my stored procedure:
CREATE PROCEDURE [dbo].[spInsertMovie]
@title varchar(500),
@dateAdded date,
@title2 varchar(500) = NULL,
@mpaa varchar(10) = NULL,
@yearReleased varchar(4) = NULL,
@length varchar(5) = NULL,
@synopsis varchar(8000) = NULL,
@language varchar(100) = NULL,
@boxOffice money = NULL,
@budget money = NULL,
@studio varchar(100) = NULL,
@distributor varchar(100) = NULL,
@prequel int = NULL,
@sequel int = NULL,
@movieID int = NULL OUTPUT
AS
BEGIN
SELECT @movieID = movieID
FROM Movie
WHERE title = @title
IF @movieID IS NULL
BEGIN
INSERT INTO Movie
(
title,
dateAdded,
title2,
mpaa,
yearReleased,
length,
synopsis,
language,
boxOffice,
budget,
studio,
distributor,
prequel,
sequel
)
Values (
@title,
@dateAdded,
@title2,
@mpaa,
@yearReleased,
@length,
@synopsis,
@language,
@boxOffice,
@budget,
@studio,
@distributor,
@prequel,
@sequel
)
SELECT @movieID = SCOPE_IDENTITY()
END
END
and my call from C#:
internal int InsertMovie(string title, string title2 = "", string mpaa =
"", string year = "", string length = "",
string synopsis = "", string dateAdded = "", string language = "", string
boxOffice = "", string budget = "",
string studio = "", string distributor = "")
{
// 1. create a command object identifying the stored procedure
cmd.CommandText = "spInsertMovie";
cmd.Parameters.Clear();
// 2. set the command object so it knows to execute a stored procedure
cmd.CommandType = CommandType.StoredProcedure;
// 3. add parameter to command, which will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@title", title));
cmd.Parameters.Add(new SqlParameter("@title2", title2));
cmd.Parameters.Add(new SqlParameter("@mpaa", mpaa));
cmd.Parameters.Add(new SqlParameter("@yearReleased", year));
cmd.Parameters.Add(new SqlParameter("@length", length));
cmd.Parameters.Add(new SqlParameter("@synopsis", synopsis));
cmd.Parameters.Add(new SqlParameter("@dateAdded", dateAdded));
cmd.Parameters.Add(new SqlParameter("@language", language));
cmd.Parameters.Add(new SqlParameter("@boxOffice", boxOffice));
cmd.Parameters.Add(new SqlParameter("@budget", budget));
cmd.Parameters.Add(new SqlParameter("@studio", studio));
cmd.Parameters.Add(new SqlParameter("@distributor", distributor));
foreach (SqlParameter parm in cmd.Parameters)
{
if (parm.Value == null || parm.Value == "")
{
parm.Value = DBNull.Value;
}
}
// Add the output parameters and set the properties
SqlParameter pID = new SqlParameter();
pID.ParameterName = "@movieID";
pID.SqlDbType = SqlDbType.Int;
pID.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pID);
//Run query
cmd.ExecuteNonQuery();
//Return the id
return (int)pID.Value;
}
No comments:
Post a Comment