これは私が長い間最適化していないと思う私の手順です。どのように私はそれを短いクエリに最適化できますか?SQLクエリを最適化する方法は?
これはクエリです:
ALTER FUNCTION [dbo].[FuncBusReport]
(@startdate DATETIME,
@enddate DATETIME,
@top INT,
@state INT)
RETURNS @BusTable TABLE
(
[Id] [int] identity(1, 1) NOT NULL,
[state] [nvarchar](50),
[Price] [nvarchar](50),
[ReserveType] [nvarchar](50),
[ObjectIdDepartue] [int],
[IssueDate] [nvarchar](50),
[BankId] [int],
[Confirmed] [bit],
[TrackingCode] [nvarchar](50),
[Transactionsuccess] [nvarchar](50),
[Name] [nvarchar](128),
[TiketUrl] [nvarchar](128),
[ObjectIdReturn] [int] NULL,
[TelNumber] [nvarchar](50) NULL
)
AS
BEGIN
IF (@state = 1)
INSERT INTO @BusTable
SELECT TOP (@top)
'ناموفق',
[Price],
'اتوبوس',
[ObjectIdDepartue],
[dbo].PersianDate(IssueDate) + ' ' + [dbo].[TimeOfDateTime](IssueDate),
[BankId],
[Confirmed],
[TrackingCode],
[Transactionsuccess],
[dbo].[Profile].FirstName + ' ' + [dbo]. [Profile].LastName AS NAME,
[dbo].GetUrlDownloads(4, [ObjectIdDepartue]),
[ObjectIdReturn],
[dbo].[payments].[TelNumber]
FROM
[dbo].[payments]
INNER JOIN
[dbo].[Profile] ON [dbo].[Profile].[UserId] = [dbo].[payments].UserId
WHERE
[dbo].[Payments].[IssueDate] >= @startdate
AND [dbo].[Payments].[IssueDate] <= @enddate
AND [dbo].[payments].ReserveType = 4
AND [dbo].[payments].[transactionsuccess] IN (0, 1)
AND [dbo].[payments].[state] IN (1, 2)
ELSE IF (@state = 3)
INSERT INTO @BusTable
SELECT TOP (@top)
'پرداخت موفق رزرو ناموفق',
[Price],
'اتوبوس',
[ObjectIdDepartue],
[dbo].PersianDate(IssueDate) + ' ' + [dbo].[TimeOfDateTime](IssueDate),
[BankId],
[Confirmed],
[TrackingCode],
[Transactionsuccess],
[dbo].[Profile].FirstName + ' ' + [dbo].[Profile].LastName AS NAME,
[dbo].GetUrlDownloads(4, [ObjectIdDepartue]),
[ObjectIdReturn],
[dbo].[payments].[TelNumber]
FROM [dbo].[payments]
INNER JOIN [dbo].[Profile] ON [dbo].[Profile].[UserId] = [dbo].[payments].UserId
WHERE [dbo].[Payments].[IssueDate] >= @startdate
AND [dbo].[Payments].[IssueDate] <= @enddate
AND [dbo].[payments].ReserveType = 4
AND [dbo].[payments].[state] IN (3, 5)
ELSE IF (@state = 6)
INSERT INTO @BusTable
SELECT TOP (@top)
STATE,
[Price],
'اتوبوس',
[ObjectIdDepartue],
[dbo].PersianDate(IssueDate) + ' ' + [dbo].[TimeOfDateTime](IssueDate),
[BankId],
[Confirmed],
[TrackingCode],
[Transactionsuccess],
[dbo].[Profile].FirstName + ' ' + [dbo].[Profile].LastName AS NAME,
[dbo].GetUrlDownloads(4, [ObjectIdDepartue]),
[ObjectIdReturn],
[dbo].[payments].[TelNumber]
FROM [dbo].[payments]
INNER JOIN [dbo].[Profile] ON [dbo].[Profile].[UserId] = [dbo].[payments].UserId
WHERE [dbo].[Payments].[IssueDate] >= @startdate
AND [dbo].[Payments].[IssueDate] <= @enddate
AND [dbo].[payments].ReserveType = 4
AND [dbo].[payments].[state] = 6
ELSE IF (@state = 4)
INSERT INTO @BusTable
SELECT TOP (@top)
'برگشت خرید',
[Price],
'اتوبوس',
[ObjectIdDepartue],
[dbo].PersianDate(IssueDate) + ' ' + [dbo].[TimeOfDateTime](IssueDate),
[BankId],
[Confirmed],
[TrackingCode],
[Transactionsuccess],
[dbo].[Profile].FirstName + ' ' + [dbo].[Profile].LastName AS NAME,
[dbo].GetUrlDownloads(4, [ObjectIdDepartue]),
[ObjectIdReturn],
[dbo].[payments].[TelNumber]
FROM [dbo].[payments]
INNER JOIN [dbo].[Profile] ON [dbo].[Profile].[UserId] = [dbo].[payments].UserId
WHERE [dbo].[Payments].[IssueDate] >= @startdate
AND [dbo].[Payments].[IssueDate] <= @enddate
AND [dbo].[payments].ReserveType = 4
AND [dbo].[payments].[state] = 4
ELSE IF (@state = 0)
INSERT INTO @BusTable
SELECT TOP (@top)
CASE
WHEN [state] IN (1, 2)
THEN 'ناموفق'
WHEN [state] IN (3, 5)
THEN 'پرداخت موفق و رزرو ناموفق'
WHEN [state] = 4
THEN 'برگشت خرید'
WHEN [state] = 6
THEN 'پرداخت موفق رزرو موفق'
END,
[Price],
'اتوبوس',
[ObjectIdDepartue],
[dbo].PersianDate(IssueDate) + ' ' + [dbo].[TimeOfDateTime](IssueDate),
[BankId],
[Confirmed],
[TrackingCode],
[Transactionsuccess],
[dbo].[Profile].FirstName + ' ' + [dbo].[Profile].LastName AS NAME,
[dbo].GetUrlDownloads(4, [ObjectIdDepartue]),
[ObjectIdReturn],
[dbo].[payments].[TelNumber]
FROM [dbo].[payments]
INNER JOIN [dbo].[Profile] ON [dbo].[Profile].[UserId] = [dbo].[payments].UserId
WHERE [dbo].[Payments].[IssueDate] >= @startdate
AND [dbo].[Payments].[IssueDate] <= @enddate
AND [dbo].[payments].ReserveType = 4
RETURN
END;
を短縮するために、ここでやったことだスニッフィングパラメータに見えますが、最適化の前に説明し、問題が何であるかについて詳しく説明することがあります計画、インデックスなど – Mihai
私は同じ機能を持つ短いクエリを持っています –
だから、あなたは短いクエリを得ることを妨げているのですか?もちろん、あなたが他の人にあなたのためにそれをやりたがっているという事実を除けば。 –