代码之家  ›  专栏  ›  技术社区  ›  Israfel

将varchar2字段更改为nvarchar2后,Oracle性能很差

  •  2
  • Israfel  · 技术社区  · 15 年前

    任何帮助或建议都非常欢迎。在过去的几个月里,我在Oracle(10.2版)上开发了一个dotnet项目,并在我的字符串数据字段中使用varchar2。这很好,在浏览项目页面时,刷新时间甚至不会超过半秒(这是一个数据密集型项目)。数据引用自两个不同的模式,一个是数据的集中存储,另一个是我自己的模式。现在,集中模式将更改为Unicode兼容(但还没有),因此所有varchar2字段都将变为nvarchar2,为此,我将模式中的所有字段都更改为nvarchar2,此后性能一直很糟糕。最多可刷新30/40秒的页面。

    这可能是因为在某些存储过程中,集中模式中的varchar2字段将与我的模式中的nvarchar2字段进行联接。我知道nvarchar2的大小是varchar2的两倍,但这不能解释突然发生的巨大变化。正如我所说的,如果我没有很好地解释这个场景,那么对于需要改进的地方,任何提示都是很好的,一定要询问更多的信息。

    当做

    4 回复  |  直到 14 年前
        1
  •  1
  •   Narendra    15 年前

    第七使徒

    根据你提供的内容,很难说出任何话。当您将数据类型更改为nvarchar2时,是否已检查估计基数和/或解释计划是否发生了更改?您可能需要阅读以下博客文章,看看是否可以找到潜在客户 http://joze-senegacnik.blogspot.com/2009/12/cbo-oddities-in-determing-selectivity.html

        2
  •  2
  •   Gary Myers    15 年前

    首先,做一个

    select * from v$nls_parameters where parameter like '%SET%';
    

    字符集可能很复杂。可以有单字节字符集、固定大小多字节字符集和可变大小多字节字符集。查看Unicode描述 here

    其次,如果要将单字节字符集中的字符串连接到双字节字符集中的字符串,则可以进行选择。您可以进行二进制/字节比较(如果比较单字节字符集和双字节字符集,通常不会匹配任何内容)。或者,您可以做一个语言比较,这通常意味着一些CPU成本,因为一个值被转换成另一个值,而且经常是索引使用失败。

    索引是按顺序排列的,a、b、c等,但_等字符可能会根据语言顺序在不同的地方落下。假设索引结构将_放在A和B之间,然后进行语言比较。该比较的语言可能在z之后加上_,在这种情况下,不能使用索引。(请记住,您的情况可能是介于两者之间,而不是=)。

    简言之,在模式和中心存储中,您将需要大量的准备工作,以实现不同字符集之间的有效连接。

        3
  •  1
  •   Leigh Riffel    15 年前

    它可能不再能够使用以前可以使用的索引。正如纳伦德拉建议的,检查解释计划,看看有什么变化。一旦中心化存储被更改,索引就可能再次可用。我建议测试这条路径。

        4
  •  0
  •   Darshan    14 年前

    正确设置NLS语言初始化参数对于正确的数据转换至关重要。NLS语言初始化参数指定的字符集应反映客户端操作系统的设置。正确设置nls_lang可使客户机操作系统代码页正确转换为数据库字符集。当这些设置相同时,Oracle假定发送或接收的数据编码在与数据库字符集相同的字符集中,因此不执行验证或转换。如果需要转换,这可能会导致数据损坏。

    推荐文章