SQL查询迫切需要优化

时间:2015-11-13 13:58:52

标签: sql pervasive

我有这个查询,它工作正常,但加载需要几分钟。我需要帮助优化它,以便它运行得更快,我不知道从哪里开始:

SELECT 
    job_header.job,
    job_header.suffix,
    job_header.customer,
    job_header.description,
    job_header.comments_1,
    job_header.date_due,
    job_header.part,
    job_header.customer_po,
    job_header.date_closed,
    job_header.flag_hold,
    job_header.code_sort,
    wo_user_flds.user_7,
    wo_user_flds.user_3,
    wo_user_flds.user_6,
    wo_user_flds.user_5,
    wo_user_flds.user_2,
    quote_lines.user_2 as serialNo,
    quote_lines.user_3 as unit,
    quote_lines.user_4 as package

FROM job_header

LEFT JOIN wo_user_flds ON 
    (job_header.job = wo_user_flds.job) AND
    (job_header.suffix = wo_user_flds.suffix)

LEFT JOIN quote_lines ON
    (job_header.part = quote_lines.part)

WHERE job_header.date_closed = '000000'

AND LENGTH(job_header.job) > 5;

可能有用的更多信息:

  • 只有select中的列才是我需要的列。
  • 我的查询返回大约400条记录。
  • Job_Header表有97列和6,300条记录。
  • Wo_User_Flds表有12列和1,100条记录。
  • Quote_Lines表有198列和46,000条记录。

我可以猜测我认为我需要做什么,但我真的只是猜测这一点。我看了类似的问题以及很多关于索引的讨论,所以我查了一下,这些表确实有一些索引......如果有帮助的话?提前谢谢。

[编辑]

感谢快速回复的人,真的很感激。我将调查所有人都说过的内容,但这里是这些表的ddl:http://paste.ubuntu.com/13247664/

[编辑2]

我的查询需要1分钟才能加载。我的期望可能不太现实,它可以多快。我可能不得不求助于将查询分解为多个,然后只是在客户端上汇总数据。

2 个答案:

答案 0 :(得分:4)

如果没有任何其他信息,您需要在job_header(job,date_closed)或(date_closed,job)上使用索引。但是在表格上发布索引,例如sp_helpindex或者更好的是创建索引脚本(右键单击SSMS中的索引并编写索引脚本)

答案 1 :(得分:3)

首先要确保在JOIN表和" WHERE子句列"的列上有索引。在这种情况下,您应该在这些列上有索引:

--Table job_header indexes, beside unique index
job_header.job
job_header.suffix
job_header.part = quote_lines.part
job_header.date_closed

--Table wo_users_flds indexes, beside unique index
wo_user_flds.job
wo_user_flds.suffix

然后,避免使用UDF(函数,如LENGHT,CAST,连接等)。但在这种情况下,你可以在那里留下LENGTH。因此,您的查询将是相同的,只有您的索引才能大大改善查询执行计划。

此外,使用执行计划查看INDEX_SCAN和INDEX_SEEK的位置。如果你在某处有INDEX_SCAN,那么应该表明你需要索引该列。

这将是开始。