SQL Server:首选的索引特征/分区列的质量

时间:2016-03-31 17:59:24

标签: sql sql-server indexing sql-server-2012 partitioning

我已经创建了一个脚本来搜索候选表以进行分区,并且使用索引信息,我想找到要分区的理想列。我忽略了(目前)最常查询的列。我在下面有一个基本查询,它优先考虑属于聚簇索引的列,然后确定它们是否是主键。

因此,使用这种公认的粗略方法,这是索引列的最佳标准/质量,我还可以包括它来确定它们是否是好的分区列?如果您也可以为这些属性提供推理。

如果您完全不同意这种方法,那么请注释,但请记住,这是在深入研究最佳实践之前对分区结果进行初步分析。

;WITH cte AS
(
    SELECT 
        t.name AS TableName, ind.name AS IndexName, 
        ind.type_desc AS TypeDesc, col.name AS ColumnName,
        st.name AS DataType, ind.is_unique AS IsUnique, 
        ind.is_primary_key AS IsPrimaryKey, 
        ind.is_unique_constraint AS IsUniqueCons, 
        ROW_NUMBER() OVER (PARTITION BY t.name 
                           ORDER BY
                               CASE WHEN ind.type_desc = 'CLUSTERED' THEN 1 ELSE 2 END,
                               CASE WHEN ind.is_primary_key = 1 THEN 1 ELSE 2 END) AS row_num
    FROM 
        sys.indexes ind
    INNER JOIN 
        sys.index_columns ic ON  ind.object_id = ic.object_id 
                             AND ind.index_id = ic.index_id
    INNER JOIN 
        sys.columns col ON ic.object_id = col.object_id  
                        AND ic.column_id = col.column_id
    INNER JOIN 
        sys.tables t ON ind.object_id = t.object_id
    INNER JOIN 
        sys.types st ON col.system_type_id = st.system_type_id
    WHERE 
        t.is_ms_shipped = 0
        AND st.name IN ('datetime', 'smalldatetime')
)
SELECT * 
FROM cte 
WHERE row_num = 1

1 个答案:

答案 0 :(得分:0)

您无法仅从架构中检测到好的分区列。它主要取决于工作量。

分区使查询更快。它可以做到这一点,但它通常不如正常的索引。大多数情况下,分区会使查询变慢。查询必须符合分区方案。

分区是指能够在固定时间内删除和添加分区,并将不同的数据放到不同的存储上(不同的吞吐量和不同的备份时间表)。

我认为你的方法永远不会奏效。你需要扔掉它。