加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – SQL中常量的最佳模式?

发布时间:2021-01-24 23:10:56 所属栏目:编程 来源:网络整理
导读:我已经看到几种模式用于“降服”SQL Server中穷乏常量,但它们好像都不能同时满意机能和可读性/可维护性题目. 在下面的示例中,假设我们在表上有一个完备的“状态”分类,选项好像是: 只是硬编码,也许只是’评述’状态 -- StatusId 87 = LoadedSELECT ... FROM

我已经看到几种模式用于“降服”SQL Server中穷乏常量,但它们好像都不能同时满意机能和可读性/可维护性题目.

在下面的示例中,假设我们在表上有一个完备的“状态”分类,选项好像是:

>只是硬编码,也许只是’评述’状态

-- StatusId 87 = Loaded
SELECT ... FROM [Table] WHERE StatusId = 87;

>行使状态查找表,然后插手此表,以便WHERE子句引用友爱名称.

子查询:

SELECT ... 
FROM [Table] 
WHERE 
  StatusId = (SELECT StatusId FROM TableStatus WHERE StatusName = 'Loaded');

或插手

SELECT ... 
FROM [Table] t INNER JOIN TableStatus ts On t.StatusId = ts.StatusId 
WHERE ts.StatusName = 'Loaded';

>界说了一堆标量UDF,返回常量,即

CREATE Function LoadedStatus()
RETURNS INT
AS
 BEGIN
  RETURN 87
 END;

接着

SELECT ... FROM [Table] WHERE StatusId = LoadedStatus();

(IMO会导致数据库中呈现大量污染 – 在Oracle软件包中也许没题目)

>行使表值函数的相同模式将常量值生涯为行或列,这些模式是CROSS APPLIED返回[Table]

其他SO用户怎样办理这个常见题目?

编辑:赏金 – 按照Remus的答复和评述,有没有人在DBProj DDL / Schema剧本中维护$(变量)的最佳实践要领?

办理要领

硬编码. SQL机能赛过可维护性.

行使优化措施在打算天生时搜查的常量与行使任何情势的间接(UDF,JOIN,子查询)之间的执行打算的效果凡是是戏剧性的. SQL’编译’是一个非同通俗的进程(在某种意义上,不像IL代码天生那样’平凡’),由于功效不只由编译的说话布局(即查询的现实文本)抉择,并且还由通过数据模式(现有索引)和那些索引中的现实数据(统计数据).当行使硬编码值时,优化器可以提供更好的打算,由于它可以按照索引统计信息现实搜查值并得到功效的预计值.

另一个思量身分是SQL应用措施不只仅是代码,而是大量的代码和数据. “重构”SQL措施是……差异的.在C#措施中,可以变动常量或列举,从头编译并舒畅地运行应用措施,在SQL中不能这样做,由于该值也许存在于数据库中的数百万笔记录中,而且变动常量值意味着还要变动数据的GB,常常在线举办新的操纵.

仅仅由于在处事器看到的查询和进程中对值举办了硬编码并不必然意味着必需在原始项目源代码中对值举办硬编码.有各类代码天生器材可以处理赏罚这个题目.思量一下像操作sqlcmd scripting variables一样微不敷道的工作:

defines.sql:

:setvar STATUS_LOADED 87

somesource.sql:

:r defines.sql
SELECT ... FROM [Table] WHERE StatusId = $(STATUS_LOADED);

someothersource.sql:

:r defines.sql
UPDATE [Table] SET StatusId = $(STATUS_LOADED) WHERE ...;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读