百分求解SQL SERVER 2000中使用了top后查询速度明显变慢的问题
小弟项目中遇到特别奇怪的一个问题,百思不得其解,搜索了许多资料,也没有找到合适的答案。希望这里的高手能回答小弟这个问题,不胜感谢。
有三张表,一张人员表sys_emp,主键是emp_code,外键是comp_code。该表大约有5万条数据。一张单位表sys_company,主键是comp_code。该表大约800条数据。一张人员薪酬表sys_emp_salary,主键是year_month,emp_code。且salary_item1是工资项1,可为空,salary_item2是工资项2,可为空。该表大约有10万条数据。
原来的查询sql如下:
select top 5 * from sys_emp_salary a left join sys_emp b on a.emp_code=b.emp_code left join sys_company c on b.comp_code=c.comp_code where a.year_month='201009' and isnull(a.salary_item1,0)<isnull(a.salary_item2,0)
查询出5条记录,花费1秒钟不到。若此时把 top 5 去掉,查询出7000条记录,花费1秒钟。
后来需要在表sys_emp_salary增加一个[地区location]字段,并需要把该字段设置成主键。而人员表sys_emp本来就有location字段,但值都是空且不是主键,也需要把该字段设置成主键。因此,先在表sys_emp_salary增加一个允许空的[location]字段,默认值为'00',然后再设置成主键。将表sys_emp[location]字段的值设置为'00',然后再设置成主键。
此时,由于程序还未修改,若用原来的sql查询:
select top 5 * from sys_emp_salary a left join sys_emp b on a.emp_code=b.emp_code left join sys_company c on b.comp_code=c.comp_code where a.year_month='201009' and isnull(a.salary_item1,0)<isnull(a.salary_item2,0)
查询出5条记录,要花费1分钟多。若此时把 top 5 去掉,查询出7000条记录,花费1秒钟左右。
但将sql若加上关联条件,改成:
select top 5 * from sys_emp_salary a left join sys_emp b on a.emp_code=b.emp_code and a.location=b.location left join sys_company c on b.comp_code=c.comp_code where a.year_month='201009' and isnull(a.salary_item1,0)<isnull(a.salary_item2,0)
查询出5条记录,花费1秒钟不到。若此时把 top 5 去掉,查询出7000条记录,花费1秒钟左右。
于是小弟纳闷了,按理说top 5的速度应该更快,为什么反而更慢了呢?求解,十分感激!