我有以下函数返回一点:
Declare @Ret bit
SET @Ret = 0
IF EXISTS ( Select * from tblExclusion where StatusID = 1 and AccountID = @AccountID )
Begin
SET @Ret = 1
End
Return @Ret
现在表中的同一个AccountID可以有多个条目,或者根本没有条目,但只有一个条目会有一个" 1"状态是否存在。
我必须说实话,在谈到SQL时,我并不是很了解,但是在调用时,函数似乎需要很长时间才能返回。我想知道是否有更有效的方式来编写上述内容。
提前致谢。
答案 0 :(得分:1)
索引可能是必要的,审核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
答案 1 :(得分:0)
如果运行需要很长时间,那么我怀疑“AccountID”列上没有索引。在该列上添加索引可能会显着提高性能。但是,如果不知道如何定义tblExclusion,则无法确定此答案。此外,向StatusID添加索引也会有所帮助,假设有不同StatusID的大量条目。
此外,由于您只需要测试记录的存在,因此您无需选择tblExclusion中的每一列。您可以将“*”更改为“1”或其他内容,但这不会显着提高性能。
答案 2 :(得分:0)
试试这个表格
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
请记住,索引和维护可以使这项工作变得缓慢。
答案 3 :(得分:-2)
我建议使用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
这样可以避免不必要的数据和大数据。