SQL Server功能效率如果存在

时间:2015-07-24 14:00:53

标签: sql performance sql-server-2008 function ssms

我有以下函数返回一点:

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时,我并不是很了解,但是在调用时,函数似乎需要很长时间才能返回。我想知道是否有更有效的方式来编写上述内容。

提前致谢。

4 个答案:

答案 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

这样可以避免不必要的数据和大数据。