从基础视图制作数据透视使用索引

时间:2018-01-12 00:06:08

标签: sql sql-server sql-server-2008 pivot

我的基础表如下所示:

   ----------------------------
   | Id | Type  |Value      |
   ----------------------------
   | 1  |Name   |Michael    |
   | 1  |Age    |20         |
   | 2  |Name   |John       |
   | 3  |Name   |Smith      |
   | 5  |Age    |25         |
   ----------------------------

我在列' Type',' Value'上创建了一个索引。 (编辑:根据评论添加值)

我探索了几个选项来给我一个转向视图。像这样:

   ------------------------
   | Id |Name   |Age      |
   ------------------------
   | 1  |Michael|20       |
   | 2  |John   |         |
   | 3  |Smith  |25       |
   ------------------------

Sql1(使用数据透视):

CREATE View vw AS 
SELECT  
    ID
    NAME,
    AGE
FROM
(
    SELECT 
       ID,
       TYPE,
       VALUE
    FROM table
) AS SourceTable
PIVOT
(
    MAX(VALUE)
     FOR TYPE IN ([Name],[Age])
) piv

Sql2(条件聚合)

CREATE View vw AS 
SELECT
   Id,
   [Name]= MAX(CASE WHEN [TYPE]='Name' THEN VALUE END),
   [Age] = MAX(CASE WHEN [TYPE]='Age' THEN VALUE END)
FROM
   table
GROUP BY
   Id

当我运行如下查询时:

SELECT * FROM vw WHERE vw.Name = 'Michael'

我看到执行计划正在主键(id)上使用索引扫描。 有没有办法使这项工作,以便它使用我在' Type'上创建的索引。柱?

编辑: 我之所以没有平桌本身,是因为对于每个id,我最终可能会有大约100个字段。并且应该可以基于任何字段进行搜索。所以我希望如果能让系统使用索引(类型,值),这样的设计可能会有所帮助

1 个答案:

答案 0 :(得分:0)

如果您想使用SEEK,可以改进代码:

SELECT * FROM vw WHERE vw.Name = 'Michael'

在WHERE条件

中用ID替换Name(或添加ID过滤器)
SELECT * FROM vw WHERE vw.Name = 'Michael' and ID = 1

或只是

SELECT * FROM vw WHERE ID = 1

如果您在执行期间没有该ID值,您可以在该查询之前获取它或使用子查询/加入。您可能需要为Type和Value创建索引,以便快速找到该ID。