连接列的性能 - 订单有关吗?

时间:2014-07-10 15:57:41

标签: sql-server performance ssis indexing scd

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

也就是说,我可以选择如何创建该值,我想知道订单(ID +年份或年份+ 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 ║
╚══════════════╩══════════════╩═════════╩═════════╝ 

问题一:在JOIN期间,Composite_1或Composite_2会给我带来更好的表现吗?

问题二:我是否需要索引复合列,如果是这样,我应该单独/与其他人一起做? SSIS任务将其用于内存中的JOIN,并且我计划将其作为ORDER BY包含在我的OLE DB Source组件中。

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

1 个答案:

答案 0 :(得分:1)

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