用asp.net做了个招聘的网站,本来以为数据库没多大就用了access我错了,我是真的错了!稍微发杂点的语句页面执行时间就达到了2秒发一条sql语句大家看下怎么优化下select top 9 IIf(len(E_companyname)>=21,left([E_companyname],20)&'..',E_companyname) as E_company,E_companyname,E_id from E_user,Job_info where Format([J_enddate],'yyyy-mm-dd')>Format(now,'yyyy-mm-dd') and J_pass='True' and cint(J_eid)=E_id and E_pass='True' and E_id not in(select top 9 E_id from E_user,Job_info where Format([J_enddate],'yyyy-mm-dd')>Format(now,'yyyy-mm-dd') and J_pass='True' and cint(J_eid)=E_id and E_pass='True' and J_classtype='普通招聘' and (J_adddate IN (SELECT MAX(J_adddate) AS Expr1 FROM job_info where J_classtype='普通招聘' GROUP BY j_eid)) order by J_adddate desc) and J_classtype='普通招聘' and (J_adddate IN (SELECT MAX(J_adddate) AS Expr1 FROM job_info where J_classtype='普通招聘' GROUP BY j_eid)) 

解决方案 »

  1.   

    曾经有一个 sql server 2005 的数据放在我面前我没有珍惜......
      

  2.   

    把access导入sql
    更换数据库,如果这是必须的话
      

  3.   

    把not in 改为not exists 试试
      

  4.   

    把access数据库导到sql server里面去就行了,改动的工作量又不大.
      

  5.   

    改成 inner on 多表查询发现页面执行时间可以减少到一秒还是慢了点哦select top 9 IIf(len(E_companyname)>=21,left([E_companyname],22)&'..',E_companyname) as E_company,E_companyname,E_id FROM E_user INNER JOIN Job_info ON Cint(Job_info.J_eid)=E_user.E_id where Format([J_enddate],'yyyy-mm-dd')>Format(now,'yyyy-mm-dd') and J_pass='True' and E_pass='True' and J_classtype='普通招聘' and (J_adddate IN (SELECT MAX(J_adddate) AS Expr1 FROM job_info where J_classtype='普通招聘' GROUP BY J_eid)) and E_id not in(select top 9 E_id FROM E_user INNER JOIN Job_info ON Cint(Job_info.J_eid)=E_user.E_id where Format([J_enddate],'yyyy-mm-dd')>Format(now,'yyyy-mm-dd') and J_pass='True' and E_pass='True' and J_classtype='普通招聘' and (J_adddate IN (SELECT MAX(J_adddate) AS Expr1 FROM job_info where J_classtype='普通招聘' GROUP BY J_eid)))
      

  6.   

    避免用in 子句,虽然方便写代码,但是效率低。用exists更好些。
      

  7.   

    终于解决了将这个sql语句拆解成两段获得not in 中的数组变量再将数组变量带入第二段可以将时间缩短至100毫秒!看来access对比较长的sql语句的执行效率确实比价低下结帖