0

我们有一个表,它以属性名称和值对的形式存储用户信息。在这个表上,我们通过使用 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属性上创建索引?

任何帮助,将不胜感激。

4

2 回答 2

0

“有什么方法可以在 FirstName 属性上创建索引吗?”

不,索引是建立在表列上的。您的视图下的表具有(键,值)对的通用结构。对于应用程序开发人员来说,这种方法看起来既灵活又省时,但代价是用户在性能不佳时付出了代价。

当然,您最终仍然定义了一组固定的属性,只是结构在视图中而不是表中表示。那么,您真正获得了哪些灵活性?

如果您不想定义一组固定的属性,无论出于何种原因,您都应该选择支持的方法,例如 XML 或 12c 中的 JSON。至少它们的属性是可索引的。 了解更多。

于 2015-10-14T05:55:23.930 回答
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;

(注意:我更喜欢CASEDECODE()但我将保留您的原始逻辑。)

Oracle 有一个很好的优化器,但嵌套with可能会影响它,所以这可能会执行得更好。您还可以尝试使用索引user_details(user_id, attribute_name, attribute_value)以查看是否可以提高性能。

于 2015-10-14T15:04:44.087 回答