本帖最后由 caozhy 于 2014-05-07 14:34:33 编辑

解决方案 »

  1.   

    这个得看你怎么用的   如果说是用在where 后面  例如
    where convert(.....)=....的,那效率低很正常。因为这杨如果日期字段有索引,那就用不上了
      

  2.   

    convert ---强制类型转换函数,没了,就这些
    被这个函数坑害了。查询效率超级底----这个问题,应该跟这个函数的关系不是很大,主要问题应该是你的SQL语句的写法问题,请检查一下你的where条件是否含有下面的情况:
    1、避免在 where 子句中对字段进行 null 值判断。
    2、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
    3、应尽量避免在 where 子句中使用 or 来连接条件。
    4、对于连续的数值,能用 between 就不要用 in 。
    5、避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
    6、避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
    7、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引
      

  3.   

    上面列的7条,每一条我都测试过,确实都会对select语句的性能造成影响,有的会导致table scan,有的会导致index scan 
      

  4.   

    看例子吧http://blog.csdn.net/dba_huangzj/article/details/7657979
      

  5.   

    我就是这么写的。。现在改成between and了效率瞬间上去了好多好多。。我满足2楼的那些条件。。哎。看来以后不能瞎用这个函数了。
    话说为什么我的帖子在c#水区挪到sql技术区了200分是散的啊!!!
      

  6.   

    我就是这么写的。。现在改成between and了效率瞬间上去了好多好多。。我满足2楼的那些条件。。哎。看来以后不能瞎用这个函数了。
    话说为什么我的帖子在c#水区挪到sql技术区了200分是散的啊!!!因为你问的是SQL Server的东西,所以曹版主帮你一过来了。常规建议的确是要复合SARG写法,不过具体问题具体分析
      

  7.   

    我就是这么写的。。现在改成between and了效率瞬间上去了好多好多。。我满足2楼的那些条件。。哎。看来以后不能瞎用这个函数了。
    话说为什么我的帖子在c#水区挪到sql技术区了200分是散的啊!!!因为你问的是SQL Server的东西,所以曹版主帮你一过来了。常规建议的确是要复合SARG写法,不过具体问题具体分析
    就是把 有个表里面的数据 按照10W条来算吧 时间字段的类型是 datetime 看完你的内个博文之后我觉得内个表类型改成smalldatetime 只需要精确到分钟都够够的了。然后把我查询是 查询某一个时间段的内的数据 之前写法是
    convert(varchar(10),列,120)>='2014-01-01' and convert(varchar(10),列,120)<='2014-03-01' 
    所以才想问这个函数为什么这么慢。
    现在的写法是
    列 between '2014-01-01' and '2014-03-01'
    看了下内个执行发现就是在全局聚合索引耽误的时间和效率性能。
    水区吐槽。。被老曹认为是技术贴。。愁死人了
      

  8.   

    convert(varchar(10),列,120) 这种写法导致你列上原有的索引(如果有)变得无效,直接走表扫描或者聚集索引扫描或者索引扫描,所以数据量越多性能越低
      

  9.   

    2 5 6 7 全满足我死的好惨
    吼吼,既然如此,先看看想办法看看能不能把你满足2、5、6、7的地方改掉吧,然后再看看执行计划,看看有没有需要调整索引的地方已经调整了。速度超棒的。终于秒显示了呵呵。不到一秒就显示了对了。顺便问个怎么才能看sql语句精确的执行时间。右下角的执行时间只到秒,我想看到毫秒的
      

  10.   

    2 5 6 7 全满足我死的好惨
    吼吼,既然如此,先看看想办法看看能不能把你满足2、5、6、7的地方改掉吧,然后再看看执行计划,看看有没有需要调整索引的地方已经调整了。速度超棒的。终于秒显示了呵呵。不到一秒就显示了对了。顺便问个怎么才能看sql语句精确的执行时间。右下角的执行时间只到秒,我想看到毫秒的
    set statistics time on ;
    你的语句
    set statistics time off;
      

  11.   

    2 5 6 7 全满足我死的好惨
    吼吼,既然如此,先看看想办法看看能不能把你满足2、5、6、7的地方改掉吧,然后再看看执行计划,看看有没有需要调整索引的地方已经调整了。速度超棒的。终于秒显示了呵呵。不到一秒就显示了对了。顺便问个怎么才能看sql语句精确的执行时间。右下角的执行时间只到秒,我想看到毫秒的
    额,问题解决了就OK了。呵呵,以后写语句注意那些会导致不走索引的where条件呗
    你要看的执行时间,21楼,版主有给你回答了。
      

  12.   

    楼主,我这里有一份SQL Server开发文档,里面有一些经常需要注意的注意事项,你要不?
    要就给你一份
      

  13.   

    你如果那个列是时间字段,没有必要非要转成2014-05-08这样的日期格式,即使是时间格式也是可以的。直接用:列 between '2014-01-01' and '2014-03-01'这样的写法。
      

  14.   

    你如果那个列是时间字段,没有必要非要转成2014-05-08这样的日期格式,即使是时间格式也是可以的。直接用:列 between '2014-01-01' and '2014-03-01'这样的写法。
    恩现在就是改成这种写法 问个小问题 我数据库存储的时间都是 2014-03-01 05:06:01 这样的 你这个能查到最后一天最后一秒么
      

  15.   

    2 5 6 7 全满足我死的好惨
    吼吼,既然如此,先看看想办法看看能不能把你满足2、5、6、7的地方改掉吧,然后再看看执行计划,看看有没有需要调整索引的地方已经调整了。速度超棒的。终于秒显示了呵呵。不到一秒就显示了对了。顺便问个怎么才能看sql语句精确的执行时间。右下角的执行时间只到秒,我想看到毫秒的
    set statistics time on ;
    你的语句
    set statistics time off;
    新技能get,刚才试了一下 存储过程也可以用这个哈哈哈。新技能!
      

  16.   

    用SQL Server profiler也可以获取
      

  17.   

    我也超级想学习这些SQL的函数哦
      

  18.   

    帮我把帖子名字前面写上【散分】。。3Q 不会这工具。我都是原生态的sql2008
      

  19.   

    帮我把帖子名字前面写上【散分】。。3Q 不会这工具。我都是原生态的sql2008profiler就是sqlserver最晚从2000就自带的功能。