内部联接和拆分大量数据

时间:2012-10-26 18:40:47

标签: sql-server-2008 tsql large-data-volumes

我们正在处理大量数据(下面给出的行数):

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是一个已被确定为最佳执行的分割功能。

谢谢!

2 个答案:

答案 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