Select count(bidId) from BidInfo where startDate>DATEADD(day,-90,getDate()) and bidType=0 and v0_htmlText like '%11%'如何优化 数据库里有30W条数据

解决方案 »

  1.   

    Select count(bidId) from BidInfo where startDate>DATEADD(day,-90,getDate()) and bidType=0 and charindex('11',v0_htmlText)这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字 
    符串及其它的运算上, 所以运用charindex函数也没什么大不了. 用这种方法也有好处, 那就是对%,|等在不能直接用like 
    查找到的字符中可以直接在这charindex中运用更多优化有请楼下 
      

  2.   


    少了个>0Select count(bidId) from BidInfo where startDate>=DATEADD(day,-89,getDate()) and bidType=0 and charindex('11',v0_htmlText)>0这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字 
    符串及其它的运算上, 所以运用charindex函数也没什么大不了. 用这种方法也有好处, 那就是对%,|等在不能直接用like 
    查找到的字符中可以直接在这charindex中运用startDate>=DATEADD(day,-90,getDate()) 改成startDate>=DATEADD(day,-89,getDate()) 
    尽量使用“>=”,不要使用“>”。select field3,field4 from tb where field1>='sdf'        快
    select field3,field4 from tb where field1>'sdf'        慢
    因为前者可以迅速定位索引。
      

  3.   

    但是我有 20W条数据 v0_htmlText like '%11%'  v0_htmlText 类型是ntext 
      

  4.   

    加了 执行这样的sql语句大约要 40秒左右 
      

  5.   

    (1) ntext -> nvarchar(4000) or nvarchar(max)(2)不要用like -->  charindex(3)DATEADD(day,-90,getDate()) 用变量保存 (4)建立索引在那4列上
      

  6.   

    LIKE '%%'
    用不到索引如果想提高速度的话可以加计算列CASE WHEN v0_htmlText like '%11%' THEN 1 ELSE 0 END然后在计算列上加索引。另外我是听说的,不要在WHERE后面加GETDATE,应该在前面定义一个参数等于GETDATE然后语句里用参数。最后,看一下执行计划。
      

  7.   

    (1)把它DATEADD(day,-90,getDate())换成getdate()-90或前面说的变量,函数过多是导致慢的原因;
    (2) 在startDate、bidType和v0_htmlText上建立一个复合索引;
    (3)like '%11%'是不能被优化的,要看看具体的情况,'11'前一般有几个字符,如果相对固定就分成几类进行查询