SQL 服务器功能效率(如果存在)

SQL Server Function Efficiency If Exists

我有以下功能return有点:

Declare @Ret bit
SET @Ret = 0
IF EXISTS ( Select * from tblExclusion where StatusID = 1 and AccountID = @AccountID )
Begin
SET @Ret = 1
End

Return @Ret

现在 table 或 none 中的同一个 AccountID 可以有多个条目,但只有一个条目的状态为“1”(如果存在的话)。

老实说,我对 SQL 不是很了解,但调用该函数似乎需要很长时间才能 return。我想知道是否有更有效的方式来写上面的内容。

提前致谢。

如果到运行需要很长时间,那么我会怀疑"AccountID"列上没有索引。在该列上添加索引可能会显着提高性能。但是,如果不知道 tblExclusion 是如何定义的,就无法确定这个答案。此外,假设有大量针对不同 StatusID 的条目,向 StatusID 添加索引也会有所帮助。

此外,由于您只需要测试记录是否存在,因此不需要 select tblExclusion 中的每一列。您可以将“*”更改为“1”或其他内容,但这不会显着提高性能。

试试这个表格

Declare @Ret bitSET @Ret = 0
IF EXISTS ( Select top 1 * from tblExclusion(nolock) where StatusID = 1 and AccountID = @AccountID )
Begin
SET @Ret = 1
End

Return @Ret

记住索引和维护会使这项工作变慢。

我建议使用 select top 1 1 from 而不是 select * from,如:

Declare @Ret bit
SET @Ret = 0
IF EXISTS (Select top 1 1 from tblExclusion where StatusID = 1 and AccountID = @AccountID)
SET @Ret = 1

Return @Ret

这样您就可以避免获得不需要的数据,而且可能是大数据。

索引可能是必要的,查看 sample execution plan 将揭示哪些索引可以改进。

如果您将查询修改为:

Declare @Ret bit
SET @Ret = 0
IF EXISTS ( Select 1 from tblExclusion where StatusID = 1 and AccountID = @AccountID )
Begin
SET @Ret = 1
End

Return @Ret

NONCLUSTERED INDEX 的格式为:

USE [DatabaseName]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[tblExclusion] ([StatusID],[AccountID])
<optional, INCLUDE ([columns within the select,]) >
GO

索引的类型和创建方法:Create Index