问题标签 [sybase-ase15]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
variables - 在 Sybase 中创建动态查询 SELECT TOP X
我想知道如何在 Sybase 15 中执行以下操作。
它给了我以下错误: 错误(102)'@DEPTH'附近的语法不正确。
我尝试使用 TOP (@DEPTH),方法与 sql server 相同,但它会将其识别为错误。
错误 (14216) 未找到函数“TOP”。如果这是 SQLJ 函数或 SQL 函数,请使用 sp_help 检查对象是否存在(sp_help 可能会产生大量输出)。
谢谢
oracle - LS-00201:从 oracle 迁移到 sybase 时出现标识符“SYB12ALLPLATFORM.STAGECAPTURE”错误
我正在尝试使用 oracle sql developer 从 oracle 迁移到 sybase ase 15.7,并且在出现迁移加载几分钟后,出现此错误:
你知道这是什么原因吗?以下是完整的错误:
centos7 - ASE-15 isql 命令在 CentOS 7 上找不到 sybase 主目录
我在 CentOS 7 VM 的目录下安装了 ASE-15 /opt/sybase
,然后我跑去SYBASE.sh
设置环境变量,但它不起作用,因为当我echo $SYBASE
在 OS 上输入时它什么也没输出。所以我通过cat SYBASE.env >> ~/.bash_profile
在下面的 SYBASE.env 中键入内容来手动设置环境变量。
但是,当我执行isql
cmd 连接 ASE-15 数据库时,出现以下错误。
然后我输入echo $SYBASE
检查环境变量$SYBASE
是否正确。
所以我想我已经指定了sybase主目录/opt/sybase
,为什么isql
命令find file objectid.dat
under/home/sybase/config
而不是/opt/sybase/config
?
java - 无法分配工作表对象 ID,因为所有有效的对象 ID 值都已在使用中
我正在尝试使用 java 程序从表中获取 id 列表,并且我正在检查这些 id 是否存在于另外两个表中。如果它们不存在,我正在尝试从我获取的第一个表中删除这些 id。
我在 for 循环的第 42934 次迭代中遇到异常,以检查该帐户是否存在于其他两个表中,这是我能够从日志中获取的异常
Cannot allocate a worktable object id because all valid object id values are already in use.
我应该怎么做才能解决这个问题
sybase - Sybase 数据库、模式、用户和表
有人可以解释以下之间的语义差异:
它们似乎都在我的系统中产生了相同的结果。
更具体地说,我有这个理论somedb..SomeTable
实际上意味着:
SomeTable
我当前连接的用户拥有的对象,就像在数据库中一样somedb
。
这个对吗?
如果是这样,那么鉴于用户名似乎用于将表名称划分为不同的名称空间,难道不能说 Sybase 将用户的概念与模式的概念混为一谈吗?(因为模式是其他 RDBMS 用于命名空间表的东西?)
sybase - 涉及 IMAGE 或 TEXT 列的死锁期间的奇怪现象
这是我在使用 Sybase ASE 15.7 对应用程序进行压力测试时偶然发现的一件非常令人不安的事情。
我们有下表:
甚至在开始测试之前,该表在 IMAGE 列中有一行包含一些数据。测试期间不会删除或插入任何行。所以表总是包含一行。列blob仅更新(在下面的事务T1中)为某个值(非 NULL)。
然后,我们有以下两个事务:
由于某种原因,上述事务可能在负载下死锁(大约 10 个线程在循环中执行T1 20 次,另外 10 个线程在循环中执行T2 20 次)。
这已经足够奇怪了,但还有更多。T1总是被选为死锁牺牲品。因此,应用程序逻辑在发生死锁(错误代码 1205)时只需重试T1。这应该有效,并且通常应该是故事的结尾。然而 …
…碰巧有时T2会检索其中blob列的值为 NULL 的行!即使表已经从一行开始并且更新只是将先前的(非NULL)值重置为其他一些(非NULL)值,也是如此。这在每次测试运行中都是 100% 可重现的。
这可以通过 READ COMMITTED 序列化级别观察到。
我验证了上述行为也发生在TEXT列类型而不是VARCHAR。
我还验证了在事务T1中获取表foo上的排他锁可以使问题消失。
所以我想了解从根本上破坏事务隔离的东西怎么可能?事实上,我认为这比事务隔离更糟糕,因为T1从不将blob列的值设置为NULL。
测试代码是使用jconn4.jar驱动程序(com.sybase.jdbc4.jdbc.SybDriver类)用 Java 编写的,所以我不排除这可能是 JDBC 驱动程序错误。
更新
只需使用isql并并行生成多个在循环中连续执行T1的 shell,这是可以重现的。所以我要删除Java和JDBC标记,因为这绝对是与服务器相关的。
performance - 如何提高审计表的性能?
问题
通过在每次更新时插入一个旧行和一个新行,审计触发器正在扼杀我的批量更新查询的性能。
在这个触发器中,由于某种原因,旧行的插入比插入新行需要更多的时间。
桌子
审计表有一个集群索引,3 个非集群索引,它有大约 3500 万条记录。
事实
旧行可以插入聚簇索引中的任何位置
新行将插入聚集索引的底部
调查
我测试的是 Cache 在这个操作中可以提高很多性能,但是我没有弄清楚到底需要缓存什么。
假设
我假设聚集索引是插入操作中最相关的索引。
我假设通过对聚集索引的正确页面进行查询,可以大大提高审计性能
行动
我创建了一个查询来加载与我要在操作表上插入的行相关的所有审计行。通过这样做,性能提高了 2 倍多一点,但还不够好。
为什么不够好?
我做了另一个性能更高的测试,但我没有弄清楚我到底需要缓存什么。
那次测试怎么样?
T01 - 来回测试
我从操作表中抓取 1000 行并来回更新它们,看看我是否从审计表中获得了惊人的缓存性能。
T02 - 在更新操作表时检查缓存在审计表上的对象
然后我清理了审计缓存、索引缓存和数据缓存,并再次执行 T01 - A)。
我发现集群索引页面和数据页面都加载了,并且数量大致相同,并且在其他索引中加载了剩余数量的页面。
T03 - 运行我的人工缓存加载查询时,检查缓存在审计表上的对象
然后我清理了审计缓存并运行了我的查询。与测试 T02 相比,它只加载了大约一半的页面。
我对我的人工缓存加载查询应用了什么逻辑?
我假设如果我查询审计表中的所有行,其中 GROUPID 和 USERID 存在于 1000 行中以进行更新(在操作表中),我将加载以缓存所有聚集索引和数据页,这些索引和数据页需要从审计触发器中获得出色的性能。
然而事实并非如此,因为与测试 T02 相比,我加载了一半的页面。
问题 我可以怎样做才能在第一次获得测试 T01 - C) 或 D) 的表现?我只能在预缓存数据/索引页面时想到,但我无法找出究竟缺少什么。
如果你们有其他改进审计表触发器的建议,它也很有价值。
数据库
SYBASE 15.7
注意:这是一个属于特定产品解决方案的表格,这意味着我无法随意更改它。我有一些限制。
sql - 在 sybase 中将 Numeric 数据类型转换为无尾随零的 varchar
如何将 SQL 数据类型 Numerci(15,2) 转换为字符串(varchar 数据类型)而不在 sybase 中添加尾随零。
示例-在 abc 列中存在以下值-
在运行查询 -
我不能在表示层做到这一点有人可以帮忙查询吗?
sybase - 表扫描聚集表与索引扫描有什么区别
情况
我有一个只有一个索引的表,一个聚集索引(两列)。我做了一个'SELECT * FROM TABLE',优化器决定一个表扫描。
我得到的行有点按聚集索引排序。我这么说是因为它看起来不是随机排序的,但它有很多小故障。
如果我强制使用聚集索引 SELECT * FROM TABLE (index 1 MRU),我会得到准确的聚集表顺序。
问题
如果聚集表中的数据按其索引排序,那么表扫描结果与聚集索引扫描的顺序有何不同?
聚集索引中的表扫描是对表的叶级别的扫描,不是排序的吗?
聚集索引扫描是否以有序的方式扫描到 b 树的所有可能路径?
请原谅我可能缺乏知识,我正在尽力理解基本概念。
我是如何测试的
我通过测试两个不同的聚集索引(一个包含两列,另一个包含一列)来实现这种不一致的排序结果。创建和删除约束并检查 select 语句。
在截断表并创建索引后,数据已正确排序,但在删除索引并创建另一个索引后,该数据未通过表扫描完美排序。我需要强制使用索引。
为什么这很重要
因为我想在不使用聚簇表中的 order by 子句的情况下保证订单。
sql-update - 更新数千万行表的列的最佳方法
问题
更新数千万行表的列的最佳方法是什么?
1)我看到创建一个新表并在完成后重命名旧表
2)我看到使用临时表批量更新
3)我看到了单笔交易(虽然不喜欢这个)
4)永远不要听游标解决这样的问题,我认为不值得尝试
5)我读过关于从文件加载数据(使用 BCP),但没有读到性能是否更好。不清楚它是否只是复制,或者它是否允许加入一个带有某些东西的大表,然后是公牛复制。
真的很想在这里有一些建议。
优先级是性能
目前我正在测试解决方案 2) 和探索解决方案 5)
附加信息(更新)
谢谢你在这里的批判性思维。
- 该操作在停机时间内完成。
- UPDATE 不会导致行转发
- 所有的表都有索引,平均有 5 个索引,虽然很少有表有 13 个索引。
- 目标列的概率出现在表索引之一中,例如 50%。
- 有些表可以重建和替换,有些则不能,因为它们是软件解决方案的一部分,我们可能会失去对这些表的支持。从那些表中,一些得到了触发器。
- 我需要为 600 多个表执行此操作,其中 ~150 的范围从 80 万到 3500 万行
- 更新始终在各个字段的同一列中
参考