在SQL中存储表示而不是整个字符串?

时间:2011-05-17 12:37:39

标签: sql-server performance

我想用四分之一的静态字符串标记我的用户:坚不可摧,不可阻挡,超级 megafantastic
存储字符串的一个char表示而不是整个字符串会更快更有效吗?类似于键< - >值映射。当我进行搜索时,DB只需要匹配一个字母而不是整个字符串。

在数据库中,这些单词只能表示为 i,u,s m 。在用户个人资料中,如果我得到不可阻挡,如果我得到等,则打印无法识别 < / p>

我是否真的通过这样做来加速任何事情,还是仅仅是不必要的工作? 如果我还有10个这样的表示怎么办?

6 个答案:

答案 0 :(得分:6)

如果您在谈论数据库设计,则应该有normalized design

创建查找表id / name,将id值存储在用户表中(使用类似tinyint的东西)。

ID  Name
1   indestructible
2   unstoppable
3   superefficient
4   megafantastic

这样您就可以直接查询数据库中的字符串。

如果你缓存这个表,你就不会在数据库中找到这些值,而且你只会为每个用户存储少量数据(更不用说通过网络传输更少的数据) - 这些都转化为更好的数据库上的性能。

答案 1 :(得分:2)

当然,你可能会看到一点性能提升。也就是说,如果您破坏数据库设计,可能不值得。这是一个normalization问题。在不知道您计划如何使用数据的情况下,很难确切地说出您应该如何构建数据。

答案 2 :(得分:2)

我认为这是浪费时间。小心微优化。对于这样的减少,你将失去该列的数据库中的所有含义,失去了以相同字母开头的值的灵活性,必须修改你的DAL以在给出整个单词时仅传入第一个字母。

我通常会将列编入索引并将其保留为完整字符串。如果这是你系统中的瓶颈,那么你写下世界上最快,最有效的程序,你也不需要我的谦卑建议; - )。

答案 3 :(得分:1)

是的,这应该使您的代码更快,使用代码1,2,3,4甚至可以更快出于两个原因

1)比较一个int(可以在1个CPU周期中进行比较)比比较两个字符串花费的时间更少。即使是1个字符也可能需要更多周期,因为如果“A”等于“a”等,它需要工作。

2)它在表中占用的空间更少,在数据库中,行越小,数据库的速度就越快,因为SQL可以在页面上容纳更多的行。

您可能需要让大量用户注意到这些差异,但是保留代码而非值存储是一种很好的做法。

关心GJ

答案 4 :(得分:0)

您可以创建一个查找表,其中fk进入主表

Character
------------
CharacterID
Name
ProfileID int (FK)

Profile
--------
ProfileID
ProfileDesc

其中个人资料表是

ProfileID, ProfileDesc
----------------------
1        , indestructable
2        , ...

这将允许您在Character表

中的ProfileID上添加更小的更高效索引

答案 5 :(得分:0)

如果您希望最大限度地提高性能并且不关心规范化这些数据(这几乎总是最佳选择),您可以将这4个属性存储为位:

CREATE TABLE <name> (
    <other fields>
    isIndestructible bit, 
    isUnstoppable bit
    isSuperefficient bit
    isMegafantastic bit
)

如果您决定添加“isMagnificent”或将“isIndestructable”更改为“isResilient”,那么您将成为SOL是不好的做法,但如果您真的只有4个要跟踪的属性,则4位很难击败。