Vad jag vet så skapar man lagrade procedurer för att när de "körts 1 gång" i SQL så behålls resultatet i "minnet", stämmer detta? Om så är fallet, hur påverkas detta resonemang om man kör en lagrad procedur t. ex. getUserInfo och i denna har kör man olika sql-satser beroende på vilken parameter man skickat med, se exempel: Hej, njaaee >Först som du säger så lagras resultatet i något som heter execution planIf sats i lagrad procedur, prestanda???
<code>
ALTER PROCEDURE dbo.spHandleUser
(
@ACTION NVARCHAR(50),
@UserID INT,
@UserName NVARCHAR(50),
@Password NVARCHAR(255),
@PasswordQuestion NVARCHAR(255) = NULL,
@CompanyID INT,
@UserLevel INT,
@FirstName NVARCHAR(50),
@LastName NVARCHAR(50),
@Address NVARCHAR(50) = NULL,
@Zip NVARCHAR(50) = NULL,
@City NVARCHAR(50) = NULL,
@WorkPhone NVARCHAR(50) = NULL,
@Phone NVARCHAR(50) = NULL,
@WorkMobile NVARCHAR(50) = NULL,
@Mobile NVARCHAR(50) = NULL,
@WorkFax NVARCHAR(50) = NULL,
@Fax NVARCHAR(50) = NULL,
@WorkEmail NVARCHAR(255),
@Email NVARCHAR(255) = NULL,
@AccountCreatedByID INT,
@AccountUpdatedDate SMALLDATETIME = NULL,
@AccountUpdatedByID INT = NULL,
@AccountInactivatedDate SMALLDATETIME = NULL,
@AccountInactivatedByID INT = NULL,
@UserIsActive INT,
@AutoLogin INT
)
AS
DECLARE @CheckIfExists INT
DECLARE @NewID INT
SET @CheckIfExists = NULL
/*******************************************************************************************************
ADDERA ANVÄNDARE
*******************************************************************************************************/
IF @ACTION = 'AddUser'
BEGIN
BEGIN
SELECT @CheckIfExists = tblUsers.pkUserID
FROM tblUsers
INNER JOIN tblUserDetails
ON tblUsers.pkUserID = tblUserDetails.fkUserID
WHERE
tblUsers.UserName = @UserName
OR
tblUserDetails.WorkEmail = @WorkEmail
SET @NewID = 0
END
IF @CheckIfExists IS NULL
BEGIN
INSERT INTO tblUsers
(
UserName,
Password,
PasswordQuestion
)
VALUES
(
@UserName,
@Password,
@PasswordQuestion
)
BEGIN
SELECT @NewID = MAX(pkUserID)
FROM tblUsers
BEGIN
INSERT INTO tblUserDetails
(
fkUserID,
fkCompanyID,
fkUserLevel,
FirstName,
LastName,
Address,
Zip,
City,
WorkPhone,
Phone,
WorkMobile,
Mobile,
WorkFax,
Fax,
WorkEmail,
Email,
AccountCreatedByID,
UserIsActive
)
VALUES
(
@NewID,
@CompanyID,
@UserLevel,
@FirstName,
@LastName,
@Address,
@Zip,
@City,
@WorkPhone,
@Phone,
@WorkMobile,
@Mobile,
@WorkFax,
@Fax,
@WorkEmail,
@Email,
@AccountCreatedByID,
@UserIsActive
)
BEGIN
INSERT INTO tblUserStats
(
fkUserID
)
VALUES
(
@NewID
)
END
END
END
END
RETURN @NewID
END
/*******************************************************************************************************
UPPDATERA ANVÄNDARE
*******************************************************************************************************/
IF @ACTION = 'UpdateUser'
BEGIN
BEGIN
SELECT @CheckIfExists = pkUserID
FROM tblUsers
WHERE pkUserID = @UserID
END
IF NOT @CheckIfExists IS NULL
BEGIN
UPDATE tblUsers
SET
UserName = @UserName,
Password = @Password,
PasswordQuestion = @PasswordQuestion
WHERE pkUserID = @UserID
END
BEGIN
UPDATE tblUserDetails
SET
AutoLogin = @AutoLogin,
FirstName = @FirstName,
LastName = @LastName,
Address = @Address,
Zip = @Zip,
City = @City,
WorkPhone = @WorkPhone,
Phone = @Phone,
WorkMobile = @WorkMobile,
Mobile = @Mobile,
WorkFax = @WorkFax,
Fax = @Fax,
WorkEmail = @WorkEmail,
Email = @Email,
AccountUpdatedDate = @AccountUpdatedDate,
AccountUpdatedByID = @AccountUpdatedByID,
AccountInactivatedDate = @AccountInactivatedDate,
AccountInactivatedByID = @AccountInactivatedByID,
UserIsActive = @UserIsActive
WHERE fkUserID = @UserID
END
IF @CheckIfExists IS NULL
BEGIN
SET @CheckIfExists = 0
END
RETURN @CheckIfExists
END
</code>
Tacksam för alla svar o synpunkter :)Sv: If sats i lagrad procedur, prestanda???
Det finns flera saker som gör att sp:ar är bättre än att vara utan. Först som du säger så lagras resultatet i något som heter execution plan och gör att nästkommande frågor går mycket snabbare. Information som hämtas ut lagras också i internminnet så nästa anrop kommer gå fortare.
Utöver just detta så är en sp prekompilerad, dvs att den kontrollerats att alla fält finns, att din syntax är rätt och liknande. Därför behöver inte detta göras om då du kallar en sp - vilket också snabbar upp flödet avsevärt.Sv:If sats i lagrad procedur, prestanda???
SQL server kompilerar även ad hoc frågor till temp stored procs.
så allt som gäller för sprocs gäller även för ad hoc.
(förutom att du har viss overhead av parsningen av frågan vid ad hoc)Sv:If sats i lagrad procedur, prestanda???
Innehållet i parametrarna kan göra att den sparade execution plan inte är den bästa lösningen på problemet.
Framförallt skall man vara uppmärksam på om koden kan gå olika vägar beroende på parametrar (t.ex. if som ursprungsfrågan handlade om). I värsta fall kan if innebära att execution plan måste göras om med varje anrop.