English 中文(简体)
喀勒克市女兵的最佳模式?
原标题:Best pattern for Constants in SQL?

我看到了一些用来克服服务器中缺乏固定机的规律,但其中没有一个似乎满足了性能和可读性/可维持性的关切。

在以下例子中,假设我们在桌上有一个整体地位分类,选择似乎如下:

  • Just to hard code it, and possibly just comment the status

-- StatusId 87 = Loaded
SELECT ... FROM [Table] WHERE StatusId = 87;
  • Using a lookup table for states, 之后joining to this table so that the WHERE clause references the friendly name.

www.un.org/Depts/DGACM/index_spanish.htm 质量:

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

<>0>

SELECT ... 
FROM [Table] t INNER JOIN TableStatus ts On t.StatusId = ts.StatusId 
WHERE ts.StatusName =  Loaded ;
  • A bunch of scalar UDF s defined which return constants, viz

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

之后

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

(海事组织在数据库中造成大量污染,这可能是Oracle包裹中的K)

  • And similar patterns with Table Valued Functions holding the constants with values as rows or columns, which are CROSS APPLIED back to [Table]

其他SO用户如何解决这一共同问题?

http://www.ohchr.org。 Bounty - 是否有任何最佳实践方法,根据Remus的答复和评论,在非洲开发银行/Schema书写中维持(变量)美元?

最佳回答

硬编码。 业绩影响可维持。

在执行计划中,使用最优化者在计划制定时可以检查的固定时间与采用任何形式间接检查(UDF、JOIN、次频率)之间的结果往往很严重。 制图是一种非常的过程(从并非普通的IL代码生成的含义来看),其结果不仅由正在汇编的语文结构(即查询的实际文本)确定,而且还由这些指数(统计)中的数据图表(现有指数)确定。 当使用硬编码价值时,优化器可以提供更好的计划,因为它能够实际对照指数统计核实价值,并得出结果估计数。

另一种考虑是,“质量标准”申请不仅有代码,而且有较大的差额是代码和数据。 选择一个结构是不同的。 在C#方案中,如果能够改变一个固定或连续的、重复的和黑手的应用程序,那么就不能这样做,因为在数据库中,价值可能出现在数百万个记录中,而不断变化的价值也意味着改变数据的多样性,常常是online,而新运行时。

仅仅因为服务器所看到的查询和程序中难以编码这一数值,并不一定意味着必须在原始项目源代码中硬编码这一数值。 各种法典生成工具可以对此予以考虑。 考虑用三维法来利用sqlcmd scripting sediment/a>:

<代码>定义:sql:

:setvar STATUS_LOADED 87

www.un.org/Depts/DGACM/index_french.htm

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

www.un.org/Depts/DGACM/index_french.htm

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

虽然我同意海事组织Remus Rusanu的看法,但守则的可维持性(因此可以读、最小的分区等)反映了其他关切,除非业绩差异足以证明有理由这样做。 因此,以下关于可读性的问题:

Select ..
From Table
Where StatusId = 87

总的来说,如果我有系统依赖值,在编码中将参考(或许以姓名列出)的话,我就使用这些数值所保存的表格中的主要关键人物。 与此相悖的是通用数据,在这些数据中,我通常使用替代钥匙。 使用需要入门帮助(但并非完美)的主要钥匙,向其他开发商表明,这一价值并不是任意的。

因此,我的“现状”表希望:

Create Table Status
(
    Code varchar(6) Not Null Primary Key
    , ...
)
Select ...
From Table
Where StatusCode =  Loaded 

这使问题更加可读,不需要加入地位表,不需要使用神职编号(或指导)。 海事组织利用用户确定的职能,是一种坏的做法。 除了业绩影响外,任何开发商都不会指望以这种方式使用UDF,从而违反最小的分区标准。 你们几乎会被迫为每个固定的 > 数值配置一个UDF? a 魔法价值? 如果名字,你也可以把姓名放在一张桌上,并直接在座。 如果是灵丹妙药,你就会回到原来的问题。

我一直在我们的行文中使用微量功能选择,而且按照我的看法,这是这一解决办法的最佳途径。

如果与某个项目有关的价值增加,那么就象你装上 com子或具有固定价值的其他任何控制一样,那么就利用这种眼光来做到这一点。

You can also add more fields to your status table that act as unique markers or groupers for status values. For example, if you add an isLoaded field to your status table, record 87 could be the only one with the field s value set, and you can test for the value of the isLoaded field instead of the hard-coded 87 or status description.





相关问题
Export tables from SQL Server to be imported to Oracle 10g

I m trying to export some tables from SQL Server 2005 and then create those tables and populate them in Oracle. I have about 10 tables, varying from 4 columns up to 25. I m not using any constraints/...

SQL server: Can NT accounts be mapped to SQL server accounts

In our database we have an SQL server account that has the correct roles to access some of the databases. We are now switching to windows authentication and I was wondering if we can create a NT user ...

SQL Server 2000, ADO 2.8, VB6

How to determine if a Transaction is active i.e. before issuing Begin Transaction I want to ensure that no previous transaction are open.. the platform is VB6, MS-SQL Server 2000 and ADO 2.8

热门标签