我在以下查询中遇到速度问题
Select *
from Table1
join table2 on table1.key = table2.key
where table2.code IN ('Code1','Code2',...,'Code18')
and table1.accountnumber in ('account1','account2',...,'account30000')
编辑:是的,我的加入中有一个ON我道歉,因为草率并在我原来的问题中将其删除
总计300万行,18个代码和4-5个帐户大约需要8秒钟。但是,我的真实数据集大约有8000万行,并且可能有数十万个帐户。我似乎无法弄清楚如何加快速度,并希望得到一些帮助。帐号是从一个文件生成的,该文件可以有4个数字到数万个。但代码是硬编码的,永远不会改变。
答案 0 :(得分:1)
好的,让我们来看看你想做什么:
table1
和key
accountnumber
table2
和key
code
key
进行过滤是有界限的,因为表格依赖于此列key
加入之前)所以,你可以这样做:
key
列。但是如果表格很大并且按key
过滤是罕见的操作,那么这将是个坏主意。我的意思是在key
列上创建索引可能不好,这取决于您的数据库。in
语句可能很长,因此将它存储在临时表中然后加入它而不是in
是非常愚蠢的。我的意思是存储应该在code
语句中的所有in
,然后通过加入此临时表进行过滤。code
和accountnumber
也是一个好主意。总的来说,你需要测试和研究你的表和in
语句有多大,哪些更好 - 在key
上创建索引并按顺序执行:
key
列上创建索引。 [不是必需的。只有在你的情况下好!] key
code
/ accountnumber
上创建索引。 [不是必需的。只有在你的情况下好!] code
/ accountnumber
in
语句值创建临时表(在特定列上使用主键)。 [不是必需的。只有在你的情况下好!] code
/ accountnumber
进行过滤
醇>
或:
code
/ accountnumber
的{{1}} / table
列上创建索引。 [不是必需的。只有在你的情况下好!] table2
/ code
accountnumber
语句值创建临时表(在特定列上使用主键)。 [不是必需的。只有在你的情况下好!] in
/ code
过滤=>两个临时表 - accountnumber
和filtered_table1
,其中filtered_table2
列为主键key
我希望你有可能进行优化的想法。我想你还需要测试这些可能的方法。
希望它有所帮助!