0

我需要根据表中的其他两列创建一个连接列。一列是年份(10 个不同的值),一列是一个人的 ID 值(约 150,000 个不同的值)。这被不接受多列作为键值的 ETL 任务用​​作业务键,因此我需要将此值保存在我的数据库中。

也就是说,我可以选择如何创建该值,并且我想知道顺序(ID + Year 或 Year + ID)是否会以任何方式影响性能。如果年份先到,则前四个字符将始终是一组有限的实际年份之一。如果 ID 先出现,则每个用户都会改变。两者有什么区别吗?

此列将获得的唯一用途是在 ETL 加载期间,它将用于连接来自源表和临时表的数据以检查两者之间的差异。基值将在下表中,我计划在这些基值上创建一个聚集索引。

样本数据:

╔══════════════╦══════════════╦═════════╦═════════╗
║ COMPOSITE_1  ║ COMPOSITE_2  ║ AC_YEAR ║  ST_ID  ║
╠══════════════╬══════════════╬═════════╬═════════╣
║ 0000001|2005 ║ 2005|0000001 ║    2005 ║ 0000001 ║
║ 0000001|2006 ║ 2006|0000001 ║    2006 ║ 0000001 ║
║ 0000001|2009 ║ 2009|0000001 ║    2009 ║ 0000001 ║
║ 0000001|2010 ║ 2010|0000001 ║    2010 ║ 0000001 ║
║ 0000001|2012 ║ 2012|0000001 ║    2012 ║ 0000001 ║
║ 0000001|2013 ║ 2013|0000001 ║    2013 ║ 0000001 ║
║ 0000002|2005 ║ 2005|0000002 ║    2005 ║ 0000002 ║
║ 0000002|2006 ║ 2006|0000002 ║    2006 ║ 0000002 ║
║ 0000002|2007 ║ 2007|0000002 ║    2007 ║ 0000002 ║
║ 0000002|2008 ║ 2008|0000002 ║    2008 ║ 0000002 ║
║ 0000002|2009 ║ 2009|0000002 ║    2009 ║ 0000002 ║
║ 0000002|2010 ║ 2010|0000002 ║    2010 ║ 0000002 ║
║ 0000002|2012 ║ 2012|0000002 ║    2012 ║ 0000002 ║
║ 0000002|2013 ║ 2013|0000002 ║    2013 ║ 0000002 ║
║ 0000002|2014 ║ 2014|0000002 ║    2014 ║ 0000002 ║
╚══════════════╩══════════════╩═════════╩═════════╝ 

问题一:Composite_1 或 Composite_2 在 JOIN 期间会给我更好的性能吗?

问题二:我是否需要索引 Composite 列,如果需要,我应该单独/与其他人一起做吗?SSIS 任务将使用它进行内存中的 JOIN,我计划将它作为 ORDER BY 包含在我的 OLE DB 源组件中。

问题三:聚集索引是属于Composite列,还是Year和ID列?编辑:或者,因为我知道 Year 和 ID 不会影响 Composite 的顺序,我应该只包括所有三个吗?

4

1 回答 1

1
  1. 由于您将这些转换为字符串列,因此索引将根据字符串中的字符对它们进行排序。您将希望具有最佳分布和最独特值的字段(年份或 ID)排在第一位。
  2. 您应该索引复合列,因为它正在用于连接。是否要包含其他数据取决于您要撤回的数据。
  3. 如果您不需要任何其他列上的聚集索引,并且该表仅用于 BI/数据仓库加载,您也可以将它放在复合列上。这样一来,就不需要进行密钥查找来获取您可能需要的任何其他数据。
于 2014-07-10T16:20:48.663 回答