Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
急需优化的SQL查询_Sql_Pervasive - Fatal编程技术网

急需优化的SQL查询

急需优化的SQL查询,sql,pervasive,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.custome

我有一个查询,它运行得很好,只是加载需要几分钟。我需要帮助优化它,使其运行更快,我不知道从哪里开始:

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_头表有97列和6300条记录
  • Wo_User_Flds表有12列和1100条记录
  • Quote_Lines表有198列和46000条记录
我可以推测我认为我需要做什么,但我只是在猜测这一点。我看了很多类似的问题和关于“索引”的讨论,所以我检查了一下,这些表确实有一些索引……如果有帮助的话?提前谢谢

[编辑]

谢谢大家的快速反应,真的很感谢。我将调查每个人所说的一切,但以下是这些表格的ddl:

[编辑2]


我的查询需要1分钟才能加载。我的期望可能不现实,它可以快多少。我可能不得不将查询分解为多个查询,然后在客户端上组装数据。

首先确保在连接表的列和“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、concatenation等)。但是在这种情况下,你可以把长度留在那里。所以您的查询将是相同的,只有您的索引将大大改进查询执行计划

另外,使用执行计划查看您在哪里进行了索引扫描和索引搜索。若你们在某个地方进行了索引扫描,那个么它应该表明你们需要在那个列上建立索引


这将是一个开始。

首先确保在连接表的列和“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、concatenation等)。但是在这种情况下,你可以把长度留在那里。所以您的查询将是相同的,只有您的索引将大大改进查询执行计划

另外,使用执行计划查看您在哪里进行了索引扫描和索引搜索。若你们在某个地方进行了索引扫描,那个么它应该表明你们需要在那个列上建立索引



这将用于开始。

如果没有任何其他信息,您需要在(作业,日期\u关闭)或(日期\u关闭,作业)的作业头上建立索引。但是在表上发布索引,例如sp_helpindex,或者更好的是创建索引脚本(右键单击SSMS中的索引并编写索引脚本)

没有任何其他信息,您需要在(作业,日期_关闭)或(日期_关闭,作业)的作业头上创建索引。但是在表上发布索引,例如sp_helpindex或更好的创建索引脚本(右键单击SSMS中的索引并编写索引脚本)

如果没有更多信息,我们也会猜测。你能发布解释和DDL吗?你在
date\u closed
列上有索引吗?
000000
(意味着该条件在整个表中匹配了多少行)?wo_user_FLD(作业,后缀)和job_header(作业,后缀)和job_header(部分)上有索引吗?Quote_行(部分)和job_header(日期_Closed)上有索引吗?这真的是一个字符串吗?您是否考虑过基于作业头(作业)的函数索引作为长度?在作业标题中,有多少条记录长度不同?@NevilleK看起来这个数据库(普遍)不支持
explain
命令,但这是您的ddl:@Brandon I没有
date\u closed
的索引。我的查询返回大约400条记录,因此比这些表中的记录要少得多。我想也许我需要添加更多的条件,但我不知道这是否真的是优化。如果没有更多的信息,我们也会猜测。你能发布解释和DDL吗?你在
date\u closed
列上有索引吗?
000000
(意味着该条件在整个表中匹配了多少行)?wo_user_FLD(作业,后缀)和job_header(作业,后缀)和job_header(部分)上有索引吗?Quote_行(部分)和job_header(日期_Closed)上有索引吗?这真的是一个字符串吗?您是否考虑过基于作业头(作业)的函数索引作为长度?在作业标题中,有多少条记录长度不同?@NevilleK看起来这个数据库(普遍)不支持
explain
命令,但这是您的ddl:@Brandon I没有
date\u closed
的索引。我的查询返回大约400条记录,因此比这些表中的记录要少得多。我想也许我需要添加更多的条件,但我不知道这是否真的是优化。另外一个原因是此人没有足够的声誉发表评论。我已经更新了我的原始帖子,以显示DDL,在那里你可以看到我的可用索引
date\u closed
不是其中之一。由于函数调用,
job
上的索引可能不可用。如果DBMS支持函数索引,那就太好了。可以添加一个计算列来持久化长度和索引,但是如果另一列已经足够有选择性,那么成本可能会超过好处;我也没有看到长度——但是,SQL Server中的索引工作只有通过给您一个索引扫描才能受益;您可能会更好地执行类似Job>'000000'或类似的操作(如果您知道数据!)我不知道您的数据,但可能会完全删除长度的内容-从Job_头中选择MIN(Job)返回什么值,其中LENGTH(Job)>5?这应该为where提供作业长度的基本值,因为大于5-然后可以在where子句中使用该值,这意味着将使用作业索引。试试看——和长度和>“您的基本5个字符值”加上一比较,因为这个人并没有足够的声誉