如何加快sql子查询

时间:2019-08-22 11:12:02

标签: sql query-optimization sql-optimization

我正在从事一项工作,而且花费的时间太长。

我创建了一个要基于多个表的值进行更新的作业

UPDATE applicant_scores 
  SET applicant_scores.Age=2.5
where applicant_scores.Applicant_id in 
  (select applicantinfo.subebno from applicantinfo
   WHERE SUBSTR(applicantinfo.DOB,7,4) ='1985')

这将更新一列约17000行,但是花费的时间太长。

3 个答案:

答案 0 :(得分:3)

我建议使用<android.support.design.widget.TextInputLayout android:id="@+id/userIDTextInputLayout" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.TextInputEditText android:id="@+id/userIDTextInputEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Email or Username" /> </android.support.design.widget.TextInputLayout> 和一个索引:

not exists

为了提高性能,您希望在UPDATE applicant_scores SET applicant_scores.Age = 2.5 WHERE EXISTS (SELECT 1 FROM applicantinfo ai WHERE appliacnt_scores.Applicant_id = ai.subebno AND SUBSTR(ai.DOB, 7, 4) ='1985' ); 上建立索引。

注意:applicantinfo(subebno, DOB)可能表示“出生日期”。它应作为DOB存储在数据库中,并且您应该使用正确的日期函数,例如:

date

不要将日期存储为字符串。不要在日期上使用字符串函数。

答案 1 :(得分:0)

   SET Age_Score=(SELECT Age_Score FROM age_scoretbl WHERE  SUBSTR(applicantinfo.DOB,7,4)= age_scoretbl.Birth_Year);```






答案 2 :(得分:0)

您的问题是这个

WHERE SUBSTR(applicantinfo.DOB,7,4) ='1985'

数据库无法快速找到所有符合该条件的行。没有索引。它必须检查数据库中的每一行以找到与该表达式匹配的行。

您拥有的一种解决方案是,您可以在表中添加另一列,也可以将其命名为dob_year,那么那只是该日期之外的年份。然后,您CREATE INDEX applicantinfo_dob_year ON applicantinfo(dob_year)。然后将您的WHERE子句更改为WHERE dob_year ='1985')

https://use-the-index-luke.com/是学习有关数据库索引以及如何正确使用它们以加快查询速度的绝佳站点。