NCHAR(1)vs BIT

aba*_*hev 5 t-sql sql-server performance sql-types sql-server-2008

我正在重构数据库(SQL Server 2008)方案,并收集参数以更改NCHAR(1)列(保留Y|N值)BIT.每个人都明白这是必要的,不知道它为什么会发生,但这种变化会影响生产数据库,因此需要重要的参数.表保留地址目录(最多1米的记录).

我找到的第一个参数 - 每个nchar字段占用2个字节,每个8 位字段 - 1个字节(接下来的8个 - 另外1个字节).

下一步是什么?也许一些索引性能问题?

And*_*rew 10

除非你有充分的理由做出改变,否则我会毫不犹豫地为这种改变提供任何论据.也就是说,你必须平衡变化的成本与你个人所做/喜欢的成本,实际实施成本和效益之间的平衡.

您是否检查过使用nchar(1)是否会影响性能,还是会陷入过早优化的陷阱?你这里只谈论100万条记录.

对于您认为会产生的次要存储/ IO成本,请考虑更改,重新测试和升级系统的总工时*每小时费率与仅购买更快磁盘的成本.我怀疑磁盘会更便宜 - 并且有益于系统的各个方面.

  • @ mattmc3:不对.自SQL 2000以来,我们已经能够对位列进行索引.http://msmvps.com/blogs/greglow/archive/2004/12/20/26432.aspx (3认同)

Joe*_*orn 6

找到NCHAR(1)而不是位的一个常见原因是Oracle不支持位类型.如果您有Oracle或Oracle培训的开发人员,或者曾经在Oracle上运行的数据库,那么您将会看到很多.在Sql Server中,确实没有必要这样做.

但是,我发现大多数我有一点字段的地方(或Oracle中的NCHAR(1))我真正想要的是一个日期时间,它表示没有那么多的标志值,但确切地说它是真的.这并不总是那种情况,但是当我回想起我编写的旧代码时,我猜我曾经使用过一段时间的5次中有4次我应该使用日期时间.

  • @Jeroen - 正确性第一,性能第二.但是大部分时间我只是检查它不是NULL,而且这只是一点点检查. (2认同)

Joe*_*lli 5

位字段通过自动强制执行当前隐式业务规则来帮助您的逻辑(即,此列只能包含'Y'或'N').如果您以编程方式强制执行该规则,则可以通过消除此开销来节省.由于基数较低,索引一个位列本身几乎没有价值,但它可以作为复合索引的一部分.

也可以看看: