我们正在处理大量数据(下面给出的行数):
Table 1 : 708408568 rows -- 708 million
Table 2 : 1416817136 rows -- 1.4 billion
Table 1 Schema:
----------------
ID - Int PK
column2 - Int
Table 2 Schema
----------------
Table1ID - Int FK
SomeColumn - Int
SomeColumn - Int
Table1具有PK1,其服务器为表2的FK。
Table1 :
PK Clustered Index on Id
Non Clustered (Non Unique) on column2
Table 2 :
Table1ID (FK) Clustered Index
以下是需要执行的查询:
SELECT t1.[id]
,t1.[column2]
FROM Table1 t1
inner join Table2 t2
on s.id = cs.id
WHERE t1.[column2] in (select [id] from ConvertCsvToTable('1,2,3,4,5.......10000')) -- 10,000 Comma seperated Ids
总而言之,ID上的内连接应该由PK和FK上相同ID上的聚簇索引处理。 至于第二栏中的“巨大”Where条件,我们有一个非聚集索引。
但是,对于100个ID的一小部分,查询需要4分钟,我们需要传递10,000个ID。
有没有更好的设计方法,我们可以做到这一点,或者表格分区可能有帮助吗?
只想获得一些如何解决巨量音量的方法选择内部连接和其中IN。
注意:ConvertCsvToTable是一个已被确定为最佳执行的分割功能。
谢谢!
答案 0 :(得分:3)
这是我会尝试的: 使用函数返回的结构创建临时表。确保将列ID设置为主键,以便优化程序将其考虑在内......
CREATE TABLE #temp
(id int not null
...
,PRIMARY KEY (id) )
然后调用函数
insert into #temp exec ConvertCsvToTable('1,2,3,4,5.......10000')
然后使用temp表直接在查询中加入
SELECT t1.[id], t1.[column2]
FROM Table1 t1, t2, #temp
where t1.id = t2.id
and t1.[column2] = #temp.id
答案 1 :(得分:0)
将条件带入连接中 它为优化器提供了第一次按t1过滤的机会。[column2] first 尝试不同的哈希提示
SELECT t1.[id], t1.[column2]
FROM Table1 t1 with (nolock)
inner join Table2 t2 with (nolock)
on s.id = cs.id
and t1.[column2] in (select [id] from ConvertCsvToTable('1,2,3,4,5.......10000'))
您可能需要告诉它在Column2上使用该索引 但是给它一个做正确事情的机会 在你没有给它机会做正确的事情的地方。
如果你选择#temp然后尝试
(并且在鲁道夫表示+1时宣布对临时的PK)
这将迫使它从小桌子开始
它可能仍然会在T2上加入傻瓜,但我对此表示怀疑。
SELECT t1.[id], t1.[column2]
FROM #temp
JOIN Table1 t1 with (nolock)
on t1.[column2] = #temp.ID
join Table2 t2 with (nolock)
on t2.ID = t1.ID