昨天同事碰到一个怪异的问题,DAO里的一个简单查询方法在数据量为2000万左右的表中执行要花十几秒的时间,而在数据量小一些的表中则执行时间正常。这个问题乍一看明显是无索引或查询语句有问题,但对相应的表结构等查看了下,发现查询条件已经存在索引,而且同一个表,其它的方法执行速度是没问题的,把程序执行的SQL语言拷贝到sqlserver2008查询分析器中执行,也很快,这个就是问题的现象,试过换环境,换方法的执行地方,都如此。
下面是找了很久找到的问题,在查询语句的条件中,将查询条件
下面是找了很久找到的问题,在查询语句的条件中,将查询条件
where column1='abc'
改为
where column1 is not null and column1='abc'
后,查询速度马上提高,基本不用等待。经过大家的分析,问题为sqlserver 表中字段如果为空,那么这个字段的索引对这条数据是没有效果的,而今天发现问题的那张表刚好有个查询条件建索引了,单这个字段有一半左右的数据都为空,所以索引无效了;而SqlServer本身的查询分析器会自动对空值进行过滤,所以查询会很快,这也就是同样的SQL语句在程序中和直接在SqlServer中运行时间差别大的原因了,至此问题清楚了。