我的基础表如下所示:
----------------------------
| 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个字段。并且应该可以基于任何字段进行搜索。所以我希望如果能让系统使用索引(类型,值),这样的设计可能会有所帮助
答案 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。