【问题标题】:Stop SQL query based on count根据计数停止 SQL 查询
【发布时间】:2018-04-03 09:22:13
【问题描述】:

是否可以开发一个在达到特定条件后可以退出/停止执行的 SQL Server 2016 查询?

我们开发了一个存储过程,该过程仅在SELECT 语句返回的不同记录计数小于 10K 时才返回数据。因此,该过程首先获取不同值的计数,然后运行SELECT 语句以获取要返回的实际数据。如果计数返回超过 10K,它将简单地返回计数,而不是再次运行查询来获取实际数据。

该表在生产中有接近8000万条记录,对于某些输入参数,当结果少于10K条记录时,它会在10-15秒内返回结果。

对于某些输入参数,该过程将运行近 4-5 分钟,并返回大约 15-20 百万的计数作为输出。

我正在寻找一种在计数查询到达第 10001 条记录时强制停止计数查询的方法。

存储过程看起来像这样(在实际过程中,select 语句将在WHERE 子句中有多个条件):

DECLARE @Count BIGINT

SELECT @Count = COUNT(DISTINCT ZIP) 
FROM dbo.Member (NOLOCK)
WHERE FirstName = @FirstName

IF @Count < 10001
BEGIN
    SELECT * 
    FROM dbo.Member
    WHERE FirstName = @FirstName
END
ELSE
BEGIN
    SELECT @Count --When Count is greater than 10K, returns just count
END

谢谢

【问题讨论】:

  • 你的意思是像:SELECT TOP 10000 column_name(s) FROM table_name WHERE 条件; ?还是我没有看到另一个问题?
  • MemberNumber 真的重复了吗?
  • @Koksalb 仅当 SELECT 查询返回的记录少于 10K 时,该过程才应返回数据。如果记录超过 10K,则该过程不应返回数据,而应仅返回计数而不是数据。所以 TOP 关键字对我没有帮助。
  • @GordonLinoff 我给出的查询只是举例。我编辑了查询以计算 ZIP 而不是会员编号。希望它现在更有意义。谢谢

标签: sql sql-server database tsql sql-server-2016


【解决方案1】:

我建议你使用临时表:

select top 10001 m.* 
into #member
from dbo.Member m
where . . . ;

然后:

if (@@rowcount > 10000)
begin
    select count(distinct MemberNumber)
    from . . .
end;
else
begin
    select *
    from #member;
end;

至少,这只会在必要时产生count(distinct) 的开销。

在这些情况下,这不会加快查询速度 - 尽管删除 distinct 可能会对性能产生很大影响。

【讨论】:

  • 感谢您的建议。我将尝试您建议的临时表方法。我们在表中有重复的记录,因此在查询中无法避免 distinct。再次感谢您的建议。
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
相关资源
最近更新 更多