我们有一个表,用于在属性名称和值对中存储用户信息。在此表中,我们通过使用decode将行转置为列来创建视图。 MAX(DECODE(attribute_name,'FirstName',attribute_Value)) FirstName
CREATE OR REPLACE FORCE VIEW vw_get_userinfo
("USER_ID", "FIRSTNAME", "LASTNAME", "USEREMAIL",
"STREET", "CITY", "STATE", "ZIPCODE", "COUNTRY")
AS
SELECT
t.user_id,
t.firstname,
t.lastname,
t.useremail,
t.street,
t.city,
t.state,
t.country
FROM (WITH
tempattributes AS (SELECT
user_id,
attribute_name,
attribute_value
FROM user_details)
SELECT
user_id,
MAX(DECODE(attribute_name, 'FirstName', attribute_value)) FirstName,
MAX(DECODE(attribute_name, 'LastName', attribute_value)) LastName,
MAX(DECODE(attribute_name, 'UserEmail', attribute_value)) UserEmail,
MAX(DECODE(attribute_name, 'Street', attribute_value)) Street,
MAX(DECODE(attribute_name, 'City', attribute_value)) City,
MAX(DECODE(attribute_name, 'State', attribute_value)) State,
MAX(DECODE(attribute_name, 'ZipCode', attribute_value)) Zipcode,
MAX(DECODE(attribute_name, 'Country', attribute_value)) Country
FROM tempattributes
GROUP BY user_id
) t
在解释计划期间,使用名字字段查询时会执行完整扫描。基于函数的索引在这种情况下不适用,因为索引不能按功能分组。有什么办法可以在FirstName
属性上创建索引吗?
任何帮助都将不胜感激。
答案 0 :(得分:0)
"有什么办法可以在FirstName属性上创建索引吗?"
没有。索引构建在表列上。视图下面的表具有(键,值)对的通用结构。这种方法对于应用程序开发人员来说似乎是灵活且省时的,但价格是由用户在性能不佳时支付的。
当然,您仍然最终定义了一组固定的属性,只有结构在视图而不是表中表示。那么你真正获得了什么灵活性?
如果您不想定义一组固定的属性,无论出于何种原因,您应该在12c中选择支持的方法,如XML或JSON。至少他们的属性是可索引的。 Find out more.
答案 1 :(得分:0)
这可能无法提高性能,但您可以将查询编写为:
SELECT user_id,
MAX(DECODE(attribute_name,'FirstName',attribute_Value)) as FirstName,
MAX(DECODE(attribute_name,'LastName',attribute_Value)) as LastName,
MAX(DECODE(attribute_name,'UserEmail',attribute_Value)) as UserEmail,
MAX(DECODE(attribute_name,'Street',attribute_Value)) as Street,
MAX(DECODE(attribute_name,'City',attribute_Value)) as City,
MAX(DECODE(attribute_name,'State',attribute_Value)) as State,
MAX(DECODE(attribute_name,'ZipCode',attribute_Value)) as ZipCode,
MAX(DECODE(attribute_name,'Country',attribute_Value)) as Country
FROM user_details
GROUP BY user_id;
(注意:我更喜欢CASE
到DECODE()
,但我将原始逻辑留在其中。)
Oracle有一个很好的优化器,但嵌套的with
可能会影响它,所以这可能会更好。您还可以尝试user_details(user_id, attribute_name, attribute_value)
上的索引来查看是否可以提高性能。