在唯一地找到一行的两列上的索引

时间:2018-08-08 14:51:32

标签: sql-server indexing

嗨,如果我有类似这样的表格:

table_A:

time_id   |  transaction_id   |  other columns...

table_B:

time_id   |  transaction_id   |  other columns...

time_idtransaction_id的组合唯一定义一行(或几乎唯一)

我想快速查询的是:

SELECT ..
FROM [table_A] as a
join [table_B] as b 
   on a.time_id = b.time_id and a.transaction_id = b.transaction_id 
WHERE a.time_id = '201601' and b.time_id = '201601'

建索引的建议做法是什么?

我在想

create index time_trans on [product] (time_id, transaction_id)

但是它太细了吗? (由于time_idtransaction_id的组合唯一地定义了一行)


表的创建方式(通过将csv加载到sql服务器中,每月提供更新的csv)

CREATE TABLE [dbo].[table_A] (
    [time_id] ...,
    [transaction_id] ...,
    [other columns] ...   
)

BULK INSERT [dbo].[table_A_2010]  
FROM 'table_A_2010.CSV'  
WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n' )

BULK INSERT [dbo].[table_A_2011]  
FROM 'table_A_2011.CSV'  
WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n' )

BULK INSERT [dbo].[table_A_2012]  
FROM 'table_A_2012.CSV'  
WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n' )

...

2 个答案:

答案 0 :(得分:0)

对于任何新表,确定哪些列可以唯一地标识一行,然后将其设置为PRIMARY KEY,该键将自动由索引(默认为聚簇索引)支持。

答案 1 :(得分:0)

细行上的索引很好,实际上,这通常是您想要的。

想象一下,您有一张桌子,其中有一个世界上每个人的行。您认为从这些指数中选择哪个指数更好?

  • sex(男性/女性)编制索引。
  • name, surname编制索引。
  • bornCountry, documentNumber编制索引。

这里没有“更好”的索引。比较索引的原因因情况而异,在某些情况下,甚至在某些情况下似乎比较糟糕的索引也可以在某些情况下更好地工作。

对于您而言,通过time_id, transaction_id创建索引似乎是一个非常合理的选择,因为您正在通过time_id进行过滤,并使用transaction_id与其他表进行联接。另一种情况是,如果您time_id进行过滤,可能想切换列的顺序。

如果您知道time_id, transaction_id的组合是唯一的并且必须执行,则可以创建一个UNIQUE索引,或者如果您还没有一个聚集索引,则可以创建一个{{ 1}}将重新组织实际存储的数据以匹配此顺序,这将使CLUSTERED INDEX的查询更快(但可能会阻止SELECTINSERT语句,具体取决于插入或更新的值!)

如果可以重复这种组合,则只需创建一个UPDATE。如果您在另一个表上创建相同的索引,将会有所帮助。

NONCLUSTERED INDEX

还要记住,您可以在非聚集索引上CREATE NONCLUSTERED INDEX time_trans on [product] (time_id, transaction_id) 列。您没有显示实际上是INCLUDE的列,而是考虑将它们包含在SELECT的索引中,因此检索数据时引擎不必从磁盘读取其他页面,因为包含了索引将它们的值与索引列一起存储。