create tab xxxx
(
  ID char(36) not null
  ........
)create tab xxxx
(
  ID Long not null
  ........
)
是这二个表比较查询速度

解决方案 »

  1.   

    用char(36)的话会比较36次(逐个字符比较)
    所以比较慢
      

  2.   

    只要设置了Index这两个查询速度不会有太大差别的
      

  3.   

    对于比较,理论上来说,LONG型要快。假设你的机器是32位(如果你的机器是RS6000等64位类似),
    LONG型比较最快需要一次,最慢需要2次运算,期望是1.5次CHAR(36)字符比较最快要1次,最慢需要32次。期望是16次。所以对于查询一个数据,理论上大概是10倍。
    如果有索引,在一个几百万的数据中查找,由于使用的总查找次数
    (索引用的是B+树)不会超过10次,所以绝对次数不多,多耗的时间
    不明显,故你感觉不到。
    但是,当你有另外的表B做表连接到这个表时,他会对B表中的每一条记录
    在这个表中做查询,他的绝对比较次数就比较大了。他的时间消耗就有
    非常明显的差异
    做查找,由于是
      

  4.   

    你发的短信我看了:上面说的是理想化的,实际情况有很多没有考虑如果你的CHAR(36)实际存的并没有到36个,你大多数如果长度在8的话,他的期望应该是4次。这只是说了CPU用于比较的时间复杂度。其实由于你的内存不是非常充足,他就不断的读写数据页
    我们知道,对于读数据页这种磁盘操作非常耗时间。比较所花费的时间相比较起来就微不足到了。
    实际的时间可以近似为页面的读取次数了。因而如果是第一次,没有缓存,他们的速度有很难预测。
    以下是我的推测:
    你是20000万条,且数据一样。看来你的字符的主键长度实际上大多数是5到6位。这样也反过来推测
    SQL SERVER的字符串在索引策略是采用变长(这个与具体的数据库厂商有关)的,也是5到6个字节。而你的INT是4个字节。所以页节点大概是21叶子页+1个根页。分为2层。字符的是26叶子节点+
    1个根节点(按4K/页算)。我建议你使用更多的数据,更长的关键字做比较。