如何加速 sql 子查询
How to speed up sql sub query
我正在 运行 工作,运行 花了太长时间。
我创建了一个作业来根据多个表的值进行更新
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 行的列,但它花费的时间太长。
我建议使用 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 of birth"。它应该作为 date
存储在您的数据库中,并且您应该使用适当的日期函数,例如:
extract(year from dob) = 1985
year(dob) = 1985
dob >= '1985-01-01' and dob < '1986-01-01'
不要将日期存储为字符串。不要在日期上使用字符串函数。
SET Age_Score=(SELECT Age_Score FROM age_scoretbl WHERE SUBSTR(applicantinfo.DOB,7,4)= age_scoretbl.Birth_Year);```
你的问题是这样的:
WHERE SUBSTR(applicantinfo.DOB,7,4) ='1985'
数据库无法快速找到符合该条件的所有行。没有索引。它必须检查数据库中的每一行以找到与该表达式匹配的行。
您的一个解决方案是您可以在 table 中添加另一列,也许将其命名为 dob_year
,然后就是该日期之后的年份。那么,你CREATE INDEX applicantinfo_dob_year ON applicantinfo(dob_year)
。然后将 WHERE
子句更改为 WHERE dob_year ='1985')
https://use-the-index-luke.com/ 是一个了解数据库索引以及如何正确使用它们来加快查询速度的好网站。
我正在 运行 工作,运行 花了太长时间。
我创建了一个作业来根据多个表的值进行更新
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 行的列,但它花费的时间太长。
我建议使用 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 of birth"。它应该作为 date
存储在您的数据库中,并且您应该使用适当的日期函数,例如:
extract(year from dob) = 1985
year(dob) = 1985
dob >= '1985-01-01' and dob < '1986-01-01'
不要将日期存储为字符串。不要在日期上使用字符串函数。
SET Age_Score=(SELECT Age_Score FROM age_scoretbl WHERE SUBSTR(applicantinfo.DOB,7,4)= age_scoretbl.Birth_Year);```
你的问题是这样的:
WHERE SUBSTR(applicantinfo.DOB,7,4) ='1985'
数据库无法快速找到符合该条件的所有行。没有索引。它必须检查数据库中的每一行以找到与该表达式匹配的行。
您的一个解决方案是您可以在 table 中添加另一列,也许将其命名为 dob_year
,然后就是该日期之后的年份。那么,你CREATE INDEX applicantinfo_dob_year ON applicantinfo(dob_year)
。然后将 WHERE
子句更改为 WHERE dob_year ='1985')
https://use-the-index-luke.com/ 是一个了解数据库索引以及如何正确使用它们来加快查询速度的好网站。