Sql server 如何优化SQL查询?

Sql server 如何优化SQL查询?,sql-server,Sql Server,这是我的程序,我认为这是一个长期没有优化。如何更好地优化短查询 以下是查询: ALTER FUNCTION [dbo].[FuncBusReport] (@startdate DATETIME, @enddate DATETIME, @top INT, @state INT) RETURNS @BusTable TABLE ( [Id] [int] identity(1, 1) NOT NULL,

这是我的程序,我认为这是一个长期没有优化。如何更好地优化短查询

以下是查询:

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;
ALTER函数[dbo].[FuncBusReport]
(@startdate DATETIME,
@enddate日期时间,
@顶级整数,
@州(国际)
返回@BusTable表
(
[Id][int]标识(1,1)不为空,
[州][nvarchar](50),
[价格][nvarchar](50),
[ReserveType][nvarchar](50),
[ObjectedPartue][int],
[发布日期][nvarchar](50),
[BankId][int],
[已确认][bit],,
[TrackingCode][nvarchar](50),
[Transactionsuccess][nvarchar](50),
[姓名][nvarchar](128),
[TiketUrl][nvarchar](128),
[ObjectdReturn][int]NULL,
[TelNumber][nvarchar](50)空
)
作为
开始
如果(@state=1)
插入@BusTable
选择顶部(@TOP)
'ناموفق',
[价格],
'اتوبوس',
[ObjectedPartue],
[dbo].PersianDate(IssueDate)+''+[dbo].[TimeOfDateTime](IssueDate),
[BankId],
[确认],
[跟踪代码],
[交易成功],
[dbo].[Profile].FirstName+'+[dbo]。[配置文件].LastName作为名称,
[dbo].GetUrlDownloads(4[ObjectedPartue]),
[ObjectedReturn],
[dbo].[payments].[TelNumber]
从…起
[dbo].[付款]
内连接
[dbo].[Profile].[UserId]=[dbo].[payments].[payments].UserId上的[dbo].[Profile]
哪里
[dbo].[Payments].[IssueDate]>=@startdate
和[dbo].[Payments].[IssueDate]=@startdate
和[dbo].[Payments].[IssueDate]=@startdate
和[dbo].[Payments].[IssueDate]=@startdate
和[dbo].[Payments].[IssueDate]=@startdate

和[dbo].[Payments].[IssueDate]这就是我在这里缩短查询的原因

ALTER函数[dbo]。[FuncBusReport](@startdate-datetime、@enddate-datetime、@top-int、@state-int)
返回@BusTable表
(
[Id][int]标识(1,1)不为空
,[州]nvarchar
,[价格]nvarchar
,[ReserveType]nvarchar
,[ObjectedPartue][int]
,[IssueDate]nvarchar
,[BankId][int]
,[已确认][比特]
,[TrackingCode]nvarchar
,[Transactionsuccess]nvarchar
,[Name]nvarchar
,[TiketUrl]nvarchar
,[ObjectdReturn][int]空
,[TelNumber]nvarchar null
)
作为开始
声明@StateID INT;
声明@StateTable表(col INT)
选择@StateID=@state

如果@StateID=1
开始 插入@StateTable(col)值(1); 插入@StateTable(col)值(2); 结束; 如果@StateID=2
开始 插入@StateTable(col)值(3); 插入@StateTable(col)值(5); 结束; 如果@StateID=3
开始 插入@StateTable(col)值(4); 结束; 如果@StateID=4 开始 插入@StateTable(col)值(6); 结束; 插入@BusTable 选择顶部(@top) 案例 当[陈述]在(1,2)中时,则为' 当[陈述]在(3,5)中时,则为“陈述” 当[状态]=4时,则为“状态” 当[状态]=6时,则为“状态” 结束 ,[价格] ,'اتوبوس' ,[ObjectedPartue] ,[dbo].PersianDate(IssueDate)+''+[dbo].TimeOfDateTime ,[BankId] ,[已确认] ,[TrackingCode] ,[交易成功] ,[dbo].[Profile].FirstName+'+[dbo].[Profile].LastName作为名称 ,[dbo].GetUrlDownloads(4[ObjectedPartue]) ,[ObjectedReturn] ,[dbo].[payments].[TelNumber] 来自[dbo]。[付款] [dbo].[Profile].[UserId]=[dbo].[payments].[payments].UserId上的内部联接[dbo].[Profile] 哪里 [dbo].[Payments].[IssueDate]>=@startdate
和[dbo].[Payments].[IssueDate]研究参数嗅探,但在优化之前,您可能希望详细说明问题所在,解释计划、索引等。我希望使用具有相同功能的短查询。那么,是什么阻止您获取短查询呢?除了您当然希望其他人为您做这件事之外。请注意,多语句表值函数和标量函数可能会破坏您的性能,您在这里同时使用这两种函数。这里我使用了5个if条件,所以我想省略这些条件 ALTER function [dbo].[FuncBusReport](@startdate datetime,@enddate datetime,@top int ,@state int) returns @BusTable table ( [Id][int] identity(1,1) not null ,[state]nvarchar ,[Price]nvarchar ,[ReserveType]nvarchar ,[ObjectIdDepartue][int] ,[IssueDate]nvarchar ,[BankId][int] ,[Confirmed][bit] ,[TrackingCode]nvarchar ,[Transactionsuccess]nvarchar ,[Name]nvarchar ,[TiketUrl]nvarchar ,[ObjectIdReturn] [int] null ,[TelNumber]nvarchar null ) as begin DECLARE @StateID INT; DECLARE @StateTable TABLE (col INT) SELECT @StateID=@state;

IF @StateID= 1
BEGIN INSERT INTO @StateTable(col)VALUES(1); INSERT INTO @StateTable(col)VALUES(2); END; IF @StateID= 2
BEGIN INSERT INTO @StateTable(col)VALUES(3); INSERT INTO @StateTable(col)VALUES(5); END; IF @StateID= 3
BEGIN INSERT INTO @StateTable(col)VALUES(4); END; IF @StateID= 4 BEGIN INSERT INTO @StateTable(col)VALUES(6); END; 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 ,[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 (select*from @StateTable)
return end;