【问题标题】:Function defining views data type as VARCHAR2(4000) affecting performance?将视图数据类型定义为 VARCHAR2(4000) 的函数会影响性能吗?
【发布时间】:2016-08-18 06:05:40
【问题描述】:

我创建了一个返回 VARCHAR2 变量的函数,它返回的变量在函数本身中输入为 VARCHAR2(200)

我还创建了一个视图,将该函数用作其中的一列。这会自动将视图中该列的数据类型设置为VARCHAR2(4000)

这会导致任何性能/存储问题吗?

此外,我最好输入 SUBSTR 以将其限制为应有的 200 个字符吗?

Oracle 11g 顺便说一句。

【问题讨论】:

  • 我看不出varchar2(4000)有什么问题,只要你知道数据实际上比那个短。
  • 列级函数调用是“定时炸弹”。取决于它对每条记录的计算量以及结果集返回的行数。
  • @Aishu - OP 在 view 中使用该函数,而不是在表格中。没有问题。

标签: sql oracle plsql


【解决方案1】:

即使在任何地方都使用VARCHAR2(4000) 可能不会导致问题,如果您所做的一切都是在 SQL 中(并且在这种情况下很可能不会导致问题),一旦您开始将数据拉入应用程序,它可能会很痛苦。应用程序可能别无选择,只能根据列中字符串的最大假定长度来分配内存……您可能会很快用完内存。更不用说 GUI 会为函数返回的任何内容保留和格式化 4000 个字符...

要限制视图中列的大小,解决方案就是您已经说过的:如果您在视图的select 子句中将函数包装在substr() 中,则列数据类型将设置为@987654324 @。这对我来说似乎是正确的方法。

【讨论】:

  • 假设我不打算在 oracle 环境之外使用此视图,substr() 的成本是多少?如果是这样的话,最好保持原样吗?
  • 只有你会知道substr() 是多么昂贵(如果它在调用 PL/SQL 函数之后可能可以忽略不计 - 这可能至少有点复杂,否则你会做任何事情在 SQL 中)。另一方面,如果它总是在 Oracle 数据库中,您可能不需要它。 VARchar 表示变长;如果所有字符最多为 200 个字符,那么这就是将存储在 DB 中的内容(不会浪费存储或内存);只有依赖目录而不是实际数据的应用程序可能会混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多