在 z/OS 上的 DB2 v9(或更高版本)上使用 BLOB 的优缺点是什么?
澄清:是否有一些限制(例如对重组、HA 的影响)?
我们想存储大量文件:在长达 6 个月的时间内存储 1000 万个文件。大多数文件应该在 20k 到 100k 之间,但可能有例外(文件大于 1MB)。大多数文件应该是 XML,但其中一些可能包含数字签名或其他二进制数据。
我有一个名为 length 的列定义为:
TYPE_NAME: DECIMAL
DATA_TYPE: 3
COLUMN_SIZE: 9
BUFFER_LENGTH: 11
DECIMAL_DIGITS: 5
NUM_PREC_RADIX: 10
Run Code Online (Sandbox Code Playgroud)
当我运行以下选择时:
select char(length) st_length, length from atable
Run Code Online (Sandbox Code Playgroud)
我在 st_length 列上得到前导零:
st_length length
0043.00000 43.00000
0043.00000 43.00000
0045.00000 45.00000
0044.00000 44.00000
0044.00000 44.00000
0046.00000 46.00000
Run Code Online (Sandbox Code Playgroud)
为什么我得到前导零以及如何摆脱它们?
编辑:我本来想早点说的,但忘了。我正在使用 db2 v9.5.8 LUW。
解决方案:我最初的目标是获得长度最左边的字符。我结束了这个:
select left(char(cast(length as int)),1) st_length, length from atable
Run Code Online (Sandbox Code Playgroud)
这产生了,
st_length length
4 43.00000
4 43.00000
4 45.00000
4 44.00000
4 44.00000
4 46.00000
Run Code Online (Sandbox Code Playgroud)
欢迎改进。
在表中,我有一个定义为 BIGINT(8) 的 ID 列和一个定义为 VARCHAR(100) 的 VOUCHER 列。无论该字段中值的实际长度如何,SQL 始终返回完整长度值,这在 CLI 中可能很麻烦,特别是在选择更多字段时。
这是我得到的示例
ID VOUCHER
-------------------- ----------------------------------------------------------------------------------------------------
26462 7083d8374831148f9e2271741529ee37
26624 9170220e6971c2414613d0a69b420156
26625 b75d12847a24981d36f7bfcd58e8a230
Run Code Online (Sandbox Code Playgroud)
我尝试了TRIM//LTRIM函数RTRIM,但没有成功。
我可以用什么来获得这些内容,至少用于显示目的:
ID VOUCHER
------ --------------------------------
26462 7083d8374831148f9e2271741529ee37
26464 9170220e6971c2414613d0a69b420156
26465 b75d12847a24981d36f7bfcd58e8a230
Run Code Online (Sandbox Code Playgroud) 假设您正在为一个新的面向对象的 Web 应用程序建模 ER 模型。
有一个有 20 列的表,将有很多INSERTs 填充 10 列,并且有很多UPDATEs 填充剩余的列。
这张表上INSERT和UPDATE语句的数量可能达到每秒数个。
由于一直发生大量锁定(由INSERTs 和UPDATEs引起),因此担心性能可能会成为问题,因为响应时间对于 Web 应用程序来说必须是合理的。
有人建议将该表拆分为另外 2 个表:一个包含首先插入的列,另一个包含将被更新的剩余列。
请记住,这将需要更复杂的对象关系映射,因为 OO 模型和所有文档都将其视为 1 个单个实体,而不是 2 个。
我的问题:
或者
如果缺少任何信息,请让我知道,并提前致谢。
我正在开发一个数据库,其中的数据来自许多不同的应用程序。在我的第一次设计中,我将每个临时表放置在以其源应用程序命名的模式中。
由于多个源应用程序具有相似的数据和相似的表名称,因此我使用架构名称来区分源应用程序。我正在考虑的替代方案是使用单个架构并在表名称中包含源应用程序。
我想研究有关何时使用不同模式的设计规则以及这样做的利弊,但我找不到任何东西。
该架构纯粹是为了许可和安全吗?
从组织的角度来看,在超出应用程序开发所需的单独模式中创建对象是否有意义,或者这只是不必要地增加查询的复杂性?
这个决定是否还有我忽略考虑的其他影响?
我有一张这样的表:
| ID | OtherID | Data
+--------+-----------+---------------------------
| 5059 | 73831 | 5103,5107
| 5059 | 73941 | 5103,5104,5107
| 5059 | 73974 | 5103,5106,5107,5108
Run Code Online (Sandbox Code Playgroud)
结果应该返回单独的行,如下所示:
| ID | OtherID | Data
+--------+-----------+--------------------------
| 5059 | 73831 | 5103
| 5059 | 73831 | 5107
| 5059 | 73941 | 5103
| 5059 | 73941 | 5104
| 5059 | 73941 | 5107
| 5059 | 73974 | 5103
| 5059 | 73974 | 5106
| 5059 | 73974 …Run Code Online (Sandbox Code Playgroud) 作为一名刚接触 DB2 的开发人员,当我发现无法在开发数据库环境中创建自己的表时,我感到很惊讶。所以,我向 db2 DBA 提出了一个问题。我不想通过质疑政策而造成太多麻烦,并希望更好地了解我们阻止开发人员创建表的政策对于 DB2 是否合理。
问题: 我知道您必须遵守政策,但是您知道为什么我们公司可能会创建一个仅限 DB2 的政策来阻止 DB2 开发人员在他们自己的模式中创建表,同时允许 SQL Server 和 Oracle 开发人员这样做吗?
答:
大型机是一个比 Oracle 和 SQL 更受控制的环境。我们公司内的所有应用程序都共享 DB2 子系统。在 Oracle 或 SQL 中,每个应用程序都有自己的实例,它们的测试不会影响另一个实例。
-- DB2 大型机不像 Oracle 那样在同一个文件中创建多个表。因此,在大型机上,如果您能够在测试中创建表,如果您创建了一个巨大的表,那么您可能会用完所有的 dasd,如果您要针对该巨大的表进行测试,它可能会耗尽子系统的排序空间,edm游泳池等 适合测试环境的大小。--DB2 大型机应用程序共享子系统和所有系统资源。每个测试 db2 子系统都根据该 DB2 子系统的功能确定大小……DB2T – 测试、DB2F – 系统测试、DB2B – 生产支持。它们都有不同的尺码余量。
对 SO 的问题: Re:“如果你创建了一个巨大的表,你可能会用完所有的 dasd” DB2 是否没有能力通过模式来限制空间使用以防止开发人员用完所有的 DASD(我认为这是是磁盘访问存储设备/又名磁盘空间)?查找首字母缩略词 EDM 并找到“环境描述符管理器”,我认为这就是包含所有表定义的内容,就像主数据库一样。这是特定于 DB2 的有效问题吗?
从 DBA 的回答中,我大体上了解到我们的架构是这样的:每个环境,例如 TEST、UAT 等,都不会在单独的实例中运行,并且一个实例可以影响另一个实例,但听起来好像是这样,那么我们已经有了这个问题,因为开发人员能够将数百万行插入为他们创建的表中。真正的威胁不是我创建的表的大小,而不是创建表的能力吗?我认为 DB2 DBA 应该能够将开发人员限制在安全级别。
我有一个带有日常事务表的 DB2 数据库,每天在一天结束时将其清除为历史记录表。
我通过 java-JDBC INSERT 命令将行插入到这个表中,它们通常需要不到一秒钟的时间来完成,但有时(我仍然不确定是什么模式)它可能需要一分钟才能完成 INSERT 命令,因为我没有在 JDBC 驱动程序上配置超时,它等待命令完成然后继续。
这些 INSERT 命令每天执行数千次,但这只会发生在其中每天大约 5 或 10 次。该表有一些索引和一个附加在 AFTER INSERT 事件上的触发器。
有什么工具或技术可以用来衡量在我的 INSERT 命令上执行什么需要这么长时间?我想知道它是索引,触发器还是出于任何原因,查询本身。
在另一个线程中:
OP 想要过去 365 天的滑动平均值。ROWS BETWEEN ...如果可以保证每天恰好发生一次,则使用会很好,但这里的情况并非如此。RANGE BETWEEN ...看起来很合适,但我不清楚它在 DB2 中的含义。不确定 db2 没有INTERVAL类型是否重要,但用标记的持续时间模仿它。
指定当前行之前的行数范围或行数。如果指定了 ROWS,则 unsigned-constant 必须为零或表示行数的正整数。如果指定了 RANGE,则 unsigned-constant 的数据类型必须与 window-order-clause 的 sort-key-expression 的类型相当。sort-key-expression 只能有一个,并且 sort-key-expression 的数据类型必须允许减法。如果 group-bound1 是 CURRENT ROW 或 unsigned-constant FOLLOWING,则不能在 group-bound2 中指定该子句。
指定当前行之后的行数范围或行数。如果指定了 ROWS,则 unsigned-constant 必须为零或表示行数的正整数。如果指定了 RANGE,则 unsigned-constant 的数据类型必须与 window-order-clause 的 sort-key-expression 的类型相当。sort-key-expression 只能有一个,并且 sort-key-expression 的数据类型必须允许添加。
DB2 允许以下结构:
values current_date - 1
Run Code Online (Sandbox Code Playgroud)
默认单位日期是天,所以这意味着:
values current_date - 1 day
Run Code Online (Sandbox Code Playgroud)
鉴于此,我希望此示例能够正常工作:
create table test
( …Run Code Online (Sandbox Code Playgroud) 我已经查看了整个网站,但找不到解决我的问题的方法。我试图尽可能地抽象它。
我的查询是这样的:
select sup, a, b, c, d
from
(
select sup, a, 0, 0, 0 from x where y = 1 group by sup
union
select sup, 0, b, 0, 0 from x where y = 2 group by sup
union
select sup, a, 0, c, 0 from x where y = 3 group by sup
union
select sup, a, 0, 0, d from x where y = 4 group by sup
)
Run Code Online (Sandbox Code Playgroud)
这工作正常,我得到了我期望的结果。
但
我想要的是将这些结果分组在 sup 列中。当我GROUP …