日期:2014-05-18  浏览次数:20456 次

这个还可以优化么
SELECT CAST(RWDBH AS VARCHAR(20)) AS Contract_Id, CAST(GCMC AS VARCHAR(120)) AS Project_Name, CAST(SGDW AS VARCHAR(60)) AS Construct_Unit, 
  CAST(SQFL AS numeric(18, 1)) AS Project_Plan, CAST(YSCFL AS varchar(20)) AS Project_Finish, CAST(YFHCS AS INT) AS Projtct_Times, 
  CAST(RIGHT(RWDBH, 5) + '--' + SGBW AS VARCHAR(100)) AS Build_PlaceName
FROM dbo.SC_TSCRWD_T AS A
WHERE (ZT NOT IN ('作废', '已生效[已完工]')) AND (ZBRQ >= CONVERT(char(10), DATEADD(dd, - 7, GETDATE()), 120)) AND (ZBRQ <= CONVERT(varchar(12), 
  GETDATE(), 23))

------解决方案--------------------
探讨
ZBRQ 有索引没。?

------解决方案--------------------
给你几个建议:
1、检查表的索引,你的where子句中使用到的列,如果可以,一定要按照索引的顺序来写,比如如果你的索引(组合索引)的第一列是日期,那么你where中的第一个筛选条件一定要是日期。
2、zt这个字段,如果是固定的,那么最好改写成IN其他状态,因为NOT IN会引起全表扫描。效率不高。
3、如果是高版本的SQLServer,最起码05以上。那么建议对大表做分区,微软建议3000万行以上就要做分区了。可以按日期分区,具体分发要看你数据的存放规律和使用模式。
4、调整完索引后,可能需要加上覆盖索引(自己查联机丛书)。来提高效率。我觉得索引不可能加载ZT上的。最起码组合索引时不会是第一位。http://blog.csdn.net/dba_huangzj/article/details/7681118这个是我翻译的,你可以去看看,索引顺序也很重要。