2

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

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

表 1 有 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 上的聚集索引处理。至于column2上的“巨大”Where条件,我们有一个非聚集索引。

但是,对于 100 个 ID 的小子集,查询需要 4 分钟,我们需要传递 10,000 个 ID。

有没有更好的设计明智的方法可以做到这一点,或者表分区可能有帮助?

只是想获得一些方法来解决如何使用 Inner Join 和 Where IN 解决大量 Select。

注意:ConvertCsvToTable 是一个拆分函数,它已经被确定为最佳执行。

谢谢 !

4

2 回答 2

3

这就是我会尝试的:创建一个具有函数返回结构的临时表。确保将列 ID 设置为主键,以便优化器将其考虑在内...

CREATE TABLE #temp
(id    int          not null
    ...
,PRIMARY KEY (id) )

然后调用函数

insert into #temp exec ConvertCsvToTable('1,2,3,4,5.......10000')

然后使用查询中直接加入的临时表

SELECT t1.[id], t1.[column2]
FROM  Table1 t1, t2, #temp
where t1.id = t2.id
  and t1.[column2] = #temp.id
于 2012-10-26T19:03:14.947 回答
0

将条件带入连接
它使优化器有机会首先按 t1.[column2] 过滤
尝试不同的哈希提示

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,然后尝试
(并按照Rodolfo 所说的+1 在temp 上声明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
于 2012-10-26T20:10:54.990 回答