3

I have a system I'm working on that has almost all of its logic in SQL Server stored procedures. As part of improving the development practices we want to move to a continuous delivery model using feature flags (aka toggles) to enable functionality in production.

How can I write the stored procs so that they check the flags efficiently and don't add load to the database by hammering a config table every time the procs are called?

4

2 回答 2

2

我不相信您需要针对您不知道会存在的性能问题过早地进行优化。如果您的表有 100 行并且经常被引用,那么几乎可以肯定它 100% 的时间都在内存中,并且访问将不是问题。

我们使代码向前兼容的一种方法是向过程添加一个具有默认值的参数,当应用程序准备好时,应用程序可以“升级”。这可以通过配置文件参数来完成,但大概必须重新编译应用程序才能利用新功能。

举个简单的例子:

CREATE PROCEDURE dbo.doStuff
  @version DECIMAL(10,2) = 1.0
AS
BEGIN
  SET NOCOUNT ON;

  IF @version >= 1.1 
  BEGIN
    PRINT 'This only executes if the app tells us it is 1.1 or newer.';
  END

  IF @version >= 2.5
  BEGIN
    PRINT 'This only executes if the app tells us it is 2.5 or newer.';
  END
END
GO

当所有应用程序都是最新的时,您可以在参数上增加基本版本。否则,它们都可以按照自己的速率进行更新,并且模式可以以不同的速率进行。如果您可以将每个功能与顺序点发布相关联,那么这应该不会太难管理。但我再次坚持认为,100 行表不会像你想象的那样拖累你的表现……

于 2012-08-07T02:40:06.380 回答
1

您可以使用CONTEXT_INFO在会话或连接的生命周期内存储 128 个字节的标志。

创建一个函数来检索标志值:

create function dbo.GetConfigFlags() returns VarBinary(128)
  begin
  -- Retrieve the configuration flag values.
  --   This can be context sensitive, e.g. return different values based on user, server, ... .
  declare @Result as VarBinary(128)
  if Context_Info() is NULL
    set @Result = 12345 -- Get value from table or hard code here.
  else
    set @Result = Context_info()
  return @Result
  end

如果尚未加载,则使用获取标志的代码启动每个存储过程:

if Context_Info() is NULL
  begin
  declare @ConfigFlags as VarBinary(128) = dbo.GetConfigFlags()
  set Context_Info @ConfigFlags -- This is not allowed within a function.
  end
select Context_Info() -- Demo.

丑陋的部分是管理位的含义。

于 2012-08-07T02:36:13.047 回答