我有这个查询,它工作正常,但加载需要几分钟。我需要帮助优化它,以便它运行得更快,我不知道从哪里开始:
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;
可能有用的更多信息:
我可以猜测我认为我需要做什么,但我真的只是猜测这一点。我看了类似的问题以及很多关于索引的讨论,所以我查了一下,这些表确实有一些索引......如果有帮助的话?提前谢谢。
[编辑]
感谢快速回复的人,真的很感激。我将调查所有人都说过的内容,但这里是这些表的ddl:http://paste.ubuntu.com/13247664/
[编辑2]
我的查询需要1分钟才能加载。我的期望可能不太现实,它可以多快。我可能不得不求助于将查询分解为多个,然后只是在客户端上汇总数据。
答案 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,那么应该表明你需要索引该列。
这将是开始。