none
2008下 name like '%abc% 和 rtrim(name) like '%abc%' 的查询效率为什么相差好大 RRS feed

  • 问题

  • 有一个查询原来用的条件诸如  select * from abc where name like '%abc%  在2000下查询很正常,但在升级成2008后,如果该表的所需要查询出的记录数较多时,效率很低基本可以归类为查询不出数据的范畴,但在换成 rtrim(name) like '%abc%' 的写法后就恢复了正常,2008和2000的SQL写法差别很大,有没哪位仁兄能总结下2000升成2008后还有哪些SQL语法会遇到的类似问题,同样写法会导致不同的查询效率,原因是什么
    2011年8月14日 14:11

答案

  • 請問你升級到2008後是否有更新统计信息,在MSDN上提到升級SQL SERVER後,建議執行下列步驟:

     

    升级到 SQL Server 后,请完成下列任务:
    
    注册服务器 - 升级会删除早期的 SQL Server 实例的注册表设置。升级之后,必须重新注册服务器。
    
    更新统计信息 - 为了帮助优化查询性能,建议您在升级之后更新所有数据库的统计信息。使用 sp_updatestats 存储过程可以更新 SQL Server 数据库中用户定义的表中的统计信息。
    
    配置新安装的 SQL Server - 为了减少系统的可攻击外围应用,SQL Server 将有选择地安装和启用一些关键服务和功能。有关外围应用配置器工具的详细信息,请参阅此版本的自述文件。

     


    以上節錄自如何升级到 SQL Server 2008 R2(安装程序)

    另外也可以參考德瑞克的升級 SQL Server,效能變差一文,裡面提到升級SQL SERVER後建議執行下列步驟:

     

    (1)更新統計資料 - 若要協助最佳化查詢效能,我們建議您在升級之後,更新所有資料庫的統計資料。請使用 sp_updatestats 預存程序來更新 SQL Server 資料庫中使用者定義資料表的統計資料。
    (2)更新使用方式計數器 - 在舊版 SQL Server 中,資料表和索引資料列計數與頁面計數的值可能會變成不正確。若要更正任何無效的資料列或頁面計數,我們建議您在升級後,針對所有資料庫執行 DBCC UPDATEUSAGE。


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月14日 23:16

全部回复

  • Did you compare execution plan of them?
    2011年8月14日 15:53
  • 請問你升級到2008後是否有更新统计信息,在MSDN上提到升級SQL SERVER後,建議執行下列步驟:

     

    升级到 SQL Server 后,请完成下列任务:
    
    注册服务器 - 升级会删除早期的 SQL Server 实例的注册表设置。升级之后,必须重新注册服务器。
    
    更新统计信息 - 为了帮助优化查询性能,建议您在升级之后更新所有数据库的统计信息。使用 sp_updatestats 存储过程可以更新 SQL Server 数据库中用户定义的表中的统计信息。
    
    配置新安装的 SQL Server - 为了减少系统的可攻击外围应用,SQL Server 将有选择地安装和启用一些关键服务和功能。有关外围应用配置器工具的详细信息,请参阅此版本的自述文件。

     


    以上節錄自如何升级到 SQL Server 2008 R2(安装程序)

    另外也可以參考德瑞克的升級 SQL Server,效能變差一文,裡面提到升級SQL SERVER後建議執行下列步驟:

     

    (1)更新統計資料 - 若要協助最佳化查詢效能,我們建議您在升級之後,更新所有資料庫的統計資料。請使用 sp_updatestats 預存程序來更新 SQL Server 資料庫中使用者定義資料表的統計資料。
    (2)更新使用方式計數器 - 在舊版 SQL Server 中,資料表和索引資料列計數與頁面計數的值可能會變成不正確。若要更正任何無效的資料列或頁面計數,我們建議您在升級後,針對所有資料庫執行 DBCC UPDATEUSAGE。


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月14日 23:16
  • I do not think it because something differents between sql 2000 and sql 2008.

    as I know , there are only very few differents between them and usually we do not need mention them.

    Please copy the exec plan of this query both in sql 2000 and sql 2008 ,  if you want.

    We will help to analisys them .

    2011年8月15日 1:10
  • 一般來說SQL 2008的效能會比SQL 2000來的好!
    您可以看一下執行計畫,看看差別在那裡。是否有沒有用到index,另外,資料的筆數也是個問題。
    直覺來看,一般where條件都不建議加上function,否則會用不到index。
    執行一下UPDATE STATISTICS [YOUR_TABLE],再執行SQL看看!
    不過,預設SQL 2K8會 AUTO STATISTICS 呢!
    看一下執行計畫吧!

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年8月15日 1:33
  • Both sql2k and sql2k8 can auto update stats. Have to rebuild indices (at least update stats as Terry said) after upgrading to sql2k8 because query optimizer works different from sql2k's.
    2011年8月15日 1:51