我们有一个表,它将用户信息存储在属性名称和值对中。在这张表上,我们创建了一个视图,通过使用解码将行转换为列。 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
属性上创建索引?
任何帮助,将不胜感激。
如果您需要性能建议,则应显示整个查询。 –
谢谢@GordonLinoff。我已经包含了查询。 –
我在查询中看不到任何过滤器谓词。您正在投影表中的所有行。很显然,一个“全表扫描”是必需的。当根据“列”过滤数据时,在该列上创建一个“索引”是有意义的。如果您基于'expression'筛选数据,则需要在该列上创建“基于函数的索引”。您不需要用于投影行的索引。发布**解释计划**。请参阅[如何创建和显示EXPLAIN PLAN](http://lalitkumarb.com/2014/05/31/oracle-explain-plan/) –