SQL Server索引 - 列顺序

时间:2016-11-04 01:01:47

标签: sql-server indexing multiple-columns cardinality

图表here:我对第1列和第3列感到困惑。

我正在开发一个数据仓库表,并且有两列用作获取主键的密钥。

第一列是源系统。有三个可能的值让我们说IBM,SQL,ORACLE。然后,复合键的第二部分是它可以是数字或varchar的事务ID。没有第3列。除了秘密密钥,它将是Identity(1,1)在记录加载时生成的密钥。所以在下图中我想象一下我是否传递了一个查询

Select a.Patient,
       b.Source System,
       b.TransactionID
from Patient A
right join Transactions B
    on A.sourceSystem = B.sourceSystem and
       a.transactionID = B.transactionID
where SourceSystem = "SQL" 

该图表让我认为索引中的第1列应该设置为SourceSystem。因为它会立即将钻取分为第3级的下一级索引。但是当向同事展示这个图时,他们将其解释为第1列是transactionID,第2列是源系统。

列数

  1   2   3
-------------
|   | 1 |   |
| A |---|   |
|   | 2 |   |
|---|---|   |
|   |   |   |
|   | 1 | 9 |
| B |   |   |
|   |---|   |
|   | 2 |   |
|   |---|   |
|   | 3 |   |
|---|---|   |

1 个答案:

答案 0 :(得分:0)

首先,您应该限定查询中的所有列名。其次,left join通常比right join更有意义(语义是保留第一个表中的所有列)。最后,如果你有适当的外键关系,那么你可能根本不需要外连接。

让我们考虑一下这个问题:

Select p.Patient, t.Source System, t.TransactionID
from Patient p join
     Transactions t
     on t.sourceSystem = p.sourceSystem and
        t.transactionID = p.transactionID
where t.SourceSystem = 'SQL';

此查询的正确索引为Transactions(SourceSystem, TransactionId)

注意:

  • 外部联接会影响索引的选择。基本上,如果必须扫描其中一个表,那么索引可能就没用了。
  • t.SourceSystem = 'SQL'p.SourceSystem = 'SQL'可能会有不同的优化。
  • 患者真的有交易ID吗?这看起来很奇怪。