AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-1822

a_horse_with_no_name's questions

Martin Hope
a_horse_with_no_name
Asked: 2020-06-06 00:04:53 +0800 CST

SQL/JSON 路径规范是否允许访问过滤器表达式结果的属性

  • 0

我注意到 Oracle 和 Postgres 对 SQL/JSON 路径表达式的评估存在差异,我想知道哪个是正确的。

考虑以下 JSON 结构:

{
  "key1": {"id":1000, "price": 42},
  "key2": {"id":2000, "price": 3.14},
  "key3": {"id":3000, "price": 2.7}
}

要获取 ID = 1000 的产品价格,Postgres 允许我使用以下 JSON 路径表达式:

jsonb_path_query(doc, '$.* ? (@.id == 1000).price')

但是,当使用 Oracle 的json_value()(或json_query()- 没关系)

json_value(doc, '$.* ? (@.id == 1000).price')

我收到以下错误(使用 Oracle 18c):

 ORA-40597: JSON path expression syntax error ('$.* ? (@.id == 1000).price')
 JZN-00209: Unexpected characters after end of path
 at position 21

Oracle 18c 中有解决方法:

json_value(json_query(doc, '$.* ? (@.id == 1000)'), '$.price')

所以我的问题是:

SQL 标准是否允许在 Postgres 的实现中进行属性访问?
或者这根本没有在标准中指定并标记为“依赖于实现”?

(鉴于 Postgres 尽可能坚持标准的记录,我怀疑 Postgres 是正确的,而 Oracle 没有实施完整的标准)

oracle postgresql
  • 1 个回答
  • 575 Views
Martin Hope
a_horse_with_no_name
Asked: 2017-11-30 02:01:45 +0800 CST

不受 Oracle 监视的长时间运行的语句

  • 3

我们正试图找出为什么(相当复杂的)语句在运行时具有极高的差异。有时只需要“几分钟”(大约 40-50 分钟),有时甚至在 12 小时后仍未完成。

我解决此类问题的常用方法是检查语句是否受到监视,如果是,则使用它“实时”执行,dbms_sqltune.report_sql_monitor()以便我可以查明执行中的瓶颈。

但是,Oracle 永远不会监视该特定语句。根据 Oracle 手册,如果出现以下情况,将监视语句:

默认情况下,当 SQL 语句并行运行或在单次执行中消耗了至少 5 秒的 CPU 和 I/O 组合时间时,SQL 监控将自动启动

由于此语句的运行时间大大超过 5 秒,并且使用并行执行,因此应该对其进行监视。

我们甚至在 SQL 中添加了 hintsgather_plan_statistics和monitor来强制监控语句,但它仍然没有被监控。

根据“My Oracle Support”(文档 ID:1613163.1),监视仅限于计划少于 300 行的语句。当我生成计划时,它有 282 行(=计划中的最高行 ID),因此不应阻止监视。

有一个隐藏参数 ( "_sqlmon_max_planlines") 控制它,但这是一个托管数据库服务器,更改类似的东西非常复杂。

所以我的问题是:

对于为什么 Oracle 不监视语句是否有任何其他(可能未记录)限制?


这是 Oracle 11.2.0.3 企业版(计划升级到 11.2.0.4,但这可能需要一些时间)。

oracle monitoring
  • 2 个回答
  • 500 Views
Martin Hope
a_horse_with_no_name
Asked: 2016-12-08 02:56:43 +0800 CST

LOB 段在 DBA_SEGMENTS 中列出,但在 DBA_LOBS 中没有对应的行

  • 6

我试图找到属于一个相当大的 LOB 段的列(或表):

select segment_name, segment_type, bytes 
from dba_segments 
where segment_name = 'SYS_LOB0000103936C00014$$';

返回:

SEGMENT_NAME              | SEGMENT_TYPE | BYTES
--------------------------+--------------+-------------
SYS_LOB0000103936C00014$$ | LOBSEGMENT   | 422877069312

但是,当我尝试找到相应的表时:

select table_name, column_name, segment_name, tablespace_name, index_name 
from dba_lobs 
where segment_name = 'SYS_LOB0000103936C00014$$';

不返回任何行。

是否还有其他地方存储有关该 LOB 段的信息?

这是运行 RHEL 6.8 的 Oracle 11.2.0.4 (RAC)

oracle
  • 1 个回答
  • 20990 Views
Martin Hope
a_horse_with_no_name
Asked: 2015-10-23 02:42:21 +0800 CST

如何在 Oracle 中查找“FORCE PARALLEL QUERY”的当前设置

  • 0

我可以更改(覆盖)Oracle 会话中的当前并行级别,例如:

alter session force parallel query parallel 6;

是否有任何系统功能视图可以返回我6请求的值?

我想检查(在存储过程中)我当前的会话是否改变了这个(理想情况下也是 a 的设置alter session force parallel dml)

oracle oracle-11g-r2
  • 1 个回答
  • 1310 Views
Martin Hope
a_horse_with_no_name
Asked: 2015-04-16 02:01:19 +0800 CST

dbms_datapump API 在导入期间排除统计信息

  • 4

我们dbms_datapump用于在不同服务器之间复制数据或快速设置新模式。

但是,导入统计信息通常需要很长时间,并且还有一个缺点是模式统计信息在导入后被锁定。

所以我试图找到一种跳过导入统计数据的方法。

根据 Metalink Doc ID 1392981.1,这应该可以使用:

dbms_datapump.metadata_filter(handle => l_job_handle, 
      name => 'EXCLUDE_PATH_LIST', 
      value => '''STATISTICS''');

但是,当我尝试这样做时,我收到“ORA-39001:无效参数值”错误。

我还尝试了在不同地方找到的各种其他格式:

dbms_datapump.metadata_filter(handle => l_job_handle, 
      name => 'EXCLUDE_PATH_LIST', 
      value => 'STATISTICS');

dbms_datapump.metadata_filter(handle => l_job_handle, 
       name => 'EXCLUDE_PATH_EXPR', 
       value => 'like ''%/TABLE/STATISTICS/TABLE_STATISTICS''');

dbms_datapump.metadata_filter(handle => l_job_handle, 
       name => 'EXCLUDE_PATH_EXPR', 
       value => 'like ''%STATISTICS%''');

但它们都返回 ORA-39001。

我正在使用的版本是:

Oracle Database 11g 企业版 11.2.0.4.0 - 64 位生产

操作系统是 Windows Server,但这也发生在 Linux 安装上。

有什么想法可以在通过DBMS_DATAPUMPAPI 导入(或导出)期间跳过统计信息吗?

oracle statistics
  • 1 个回答
  • 6140 Views
Martin Hope
a_horse_with_no_name
Asked: 2014-10-09 05:33:33 +0800 CST

检测 SQL Server 中锁定的表或行

  • 20

我正在尝试了解/学习如何追踪被阻止会话的详细信息。

所以我创建了以下设置:

create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;

现在我从两个不同的客户端连接到数据库两次。

第一届会议问题:

begin transaction
update foo set some_data = 'update'
  where id = 1;

为了保留锁,我明确地不在那里提交。

在第二个会话中,我发出相同的语句,当然,由于锁定而等待。现在我正在尝试使用不同的查询来查看会话 2 正在等待foo表。

sp_who2显示以下内容(我删除了一些列以仅显示重要信息):

SPID | 状态 | BlkBy | 数据库名称 | 命令 | SPID | 请求ID
-----+--------------+--------+----------+---------- --------+------+----------
52 | 睡觉| . | 食物b | 等待命令 | 52 | 0        
53 | 睡觉| . | 食物b | 等待命令 | 53 | 0        
54 | 暂停 | 52 | 食物b | 更新 | 54 | 0        
56 | 可运行 | . | 食物b | 选择进入 | 56 | 0        

这是预期的,会话 54 被会话 52 中未提交的更改阻止。

查询sys.dm_os_waiting_tasks也显示了这一点。该声明:

select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;

返回:

session_id | 等待类型 | 资源地址 | 资源描述                                                            
-----------+-----------+--------+------ -------------------------------------------------- --------------------------
        54 | LCK_M_X | 0x000000002a35cd40 | 钥匙锁 hobtid=72057594046054400 dbid=6 id=lock4ed1dd780 mode=X associatedObjectId=72057594046054400

这也是意料之中的。

我的问题是,我不知道如何找到会话 54 正在等待的实际对象名称。

我发现了几个正在加入的查询,sys.dm_tran_locks如下sys.dm_os_waiting_tasks所示:

SELECT ....
FROM sys.dm_tran_locks AS l
  JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address

但是在我上面的测试场景中,这个连接不会返回任何东西。所以要么加入是错误的,要么dm_tran_locks实际上不包含我正在寻找的信息。

所以我正在寻找的是一个返回类似内容的查询:
“会话 54 正在等待表中的锁定foo”。


一些背景资料:

我试图解决的现实生活中的问题要复杂一些,但归结为“会话 54 正在等待哪个表”的问题。有问题的问题涉及更新多个表的大型存储过程以及从访问其中一些表的视图中进行选择。select即使我们启用了快照隔离和读取提交的快照,该语句也会被阻止。下一步是弄清楚选择被阻止的原因(我认为如果启用快照隔离就不可能)。

作为第一步,我想了解该会话正在等待什么。

locking sql-server-2012
  • 2 个回答
  • 166700 Views
Martin Hope
a_horse_with_no_name
Asked: 2014-08-21 05:00:46 +0800 CST

为什么系统视图之间存在排序规则冲突

  • 2

我正在使用以下语句从数据库中检索触发器列表:

select tr.name
from sys.triggers tr
union all
select tr.name
from sys.server_triggers tr;

但是,在我的本地 SQL Server 2012 Express 安装中,此操作失败并出现错误:

无法解决 SELECT 语句列 1 中 UNION ALL 运算符中“Latin1_General_CI_AS”和“Latin1_General_CI_AI”之间的排序规则冲突

我可以通过将语句更改为在联合的第二部分中明确使用不同的排序规则来“解决”这个问题:

select tr.name
from sys.triggers tr
union all
select tr.name collate database_default as name
from sys.server_triggers tr;

但是我觉得这是一个丑陋的黑客,我真的不明白为什么会首先发生冲突。两个视图最终都从中检索名称sys.sysschobjs.name,因此所有值都应具有相同的排序规则。

所以我的两个问题是:

  1. 为什么首先会有排序规则冲突?
  2. 仅在第二部分中使用是否安全collate database_default,或者我应该更好地将它用于两个查询(性能不是问题)。

有趣的是,相同的查询在针对定义了相同触发器的 SQL Server 2005(标准版)使用时不会产生问题。

sql-server collation
  • 1 个回答
  • 3536 Views
Martin Hope
a_horse_with_no_name
Asked: 2014-08-01 00:31:07 +0800 CST

为什么删除 MVIEW 会触发完全刷新?

  • 5

我刚刚在 Oracle 中创建了一个物化视图,但意识到我使用了错误的脚本,所以我想再次删除 MVIEW。

MVIEW 是使用如下语句创建的:

create materialized view foobar
  refresh start with trunc(sysdate) + 1/8  next sysdate + interval '8' hour
as
select ...
from ...;

创建需要一些时间。

现在意识到这是我运行的错误脚本:

drop materialized view foobar;

这也运行了一段时间。我首先认为这可能是由于某些锁或其他会话阻止了这一点,但不是:当我查询时v$session,我看到我的drop语句实际上触发了 mview 的完全刷新:

用户名 | 标识符 | 序列号 | 程序 | 状态 | SQL_ID | SQL_TEXT
----------+-----+--------+-------------------- ----+--------+----------------+------------------ ---------------------------------------------- ---
我的用户 | 294 | 29131 | 甲骨文@主机名 (J002) | 活跃 | 6snjgrzbtynyc | INSERT /*+ BYPASS_RECURSIVE_CHECK */ INTO "MY_USER"."FOOBAR" 选择 .....

事实上, 的drop materialized view运行时间与create.

所以我的问题是:为什么在我删除物化视图时 Oracle 会触发完全刷新?

环境:Oracle 11.2.0.3 64位


PS:我认为别名indexed-view是materialized-view错误的。尽管两者都引用相同的基本概念,但它们是 Microsoft 和 Oracle 使用的不同名称。对 Oracle 中的物化视图感兴趣的人可能对 SQL Server 中的索引视图不感兴趣。但我不知道如何删除这个别名

oracle materialized-view
  • 1 个回答
  • 1038 Views
Martin Hope
a_horse_with_no_name
Asked: 2014-06-28 04:07:18 +0800 CST

Oracle Enterprise Manage “CPU 利用率”令人​​困惑

  • 0

当我在企业管理器中(在性能选项卡中)显示 CPU 利用率时,显示利用率的图表与显示操作系统进程以及它们占用多少 CPU 的表之间存在很大差异。

该图显示了大约 15% 的利用率(这将是一个 100% 的核心,因为这是一个 8 核服务器),但进程列表显示为 100%。这反过来又意味着该过程使用了所有核心,但事实并非如此。ProcessExplorer 确实只显示进程的 CPU 使用率约为 10% oracle.exe。

那么问题来了:processlist中的“CPU Utilization (%)”列反映了什么?

在此处输入图像描述

oracle windows-server
  • 1 个回答
  • 2505 Views
Martin Hope
a_horse_with_no_name
Asked: 2014-03-29 02:01:43 +0800 CST

Oracle Enterprise Manager 从哪里获得“用户登录时间”指标?

  • 1

Oracle 的企业管理器有一个名为“用户登录时间”的指标,如果超过某个阈值,将显示警报。

我想直接使用 SQL 查询检索为此指标存储的数字。

但是,我找不到存储它的任何视图。我可以在视图中找到“每秒登录数”、“每 Txn 登录数”、“当前登录数”,并在DBA_HIST_SYSMETRIC_SUMMARY视图中找到“累计登录数”和“当前登录数” DBA_HIST_SYSSTAT 。

该视图DBA_HIST_METRIC_NAME也没有列出该名称的任何指标。

那么企业管理器从哪里获得这些信息呢?

我说的是这个警报:

在此处输入图像描述

oracle oracle-enterprise-manager
  • 3 个回答
  • 3335 Views
Martin Hope
a_horse_with_no_name
Asked: 2013-09-05 04:55:54 +0800 CST

无法更改 Oracle 的服务名称

  • 9

我正在尝试更改 Windows 2003 服务器上安装的 Oracle 11.2.0.3 的服务名称。

在安装期间,服务名称是使用默认域定义的,但我们想摆脱它。

到目前为止我所做的(以及之前所做的)将服务名称更改mydb.foo.bar为mydb:

alter system set service_names = 'mydb' scope = both;
alter database rename global_name to mydb;

这似乎奏效了:

SQL> 显示参数名称

名称类型值
------------------------------------ ----------- --- --------------------------
db_name 字符串 mydb
db_unique_name 字符串 mydb
global_names 布尔值 FALSE
instance_name 字符串 mydb
service_names 字符串 mydb
SQL>

(我从上述输出中删除了一些不相关的属性)

然后用于alter system register向监听器重新注册。

这没有任何效果,所以我重新启动了数据库和监听器,仍然没有运气。

目前的情况如下:

select name from v$active_services返回:

SERVICE_ID | 姓名 | 网络名字       
-----------+-----------------+--------
1 | 系统$背景 |                    
2 | SYS$用户 |                    
3 | 数据库 | 数据库           
5 | mydbXDB | mydbXDB        
6 | mydb.foo.bar | mydb.foo.bar

所以由于某种原因,旧的服务名称仍然存在并正在运行。

尝试使用停止服务时

SQL> exec dbms_service.stop_service('mydb.foo.bar');
PL/SQL 过程成功完成。

没有报错,但是在尝试删除服务时,Oracle 不让我:

SQL> exec dbms_service.delete_service('mydb.foo.bar');
开始 dbms_service.delete_service('mydb.foo.bar'); 结尾;

*
第 1 行的错误:
ORA-44305: 服务 mydb.foo.bar 正在运行
ORA-06512: 在“SYS.DBMS_SYS_ERROR”,第 86 行
ORA-06512:在“SYS.DBMS_SERVICE”,第 454 行
ORA-06512:在“SYS.DBMS_SERVICE”,第 343 行
ORA-06512: 在第 1 行

我确认我没有使用该服务的打开连接:

select count(*)
FROM v$session
where service_name = 'mydb.foo.bar';

返回0(零)

我还使用 oradim 重新创建了 Windows 服务,但无济于事。

有一次我跑了

alter system set service_names = 'mydb,mydb.foo.bar' scope = both;

这可能是我现在拥有两者的原因吗?

但是在将 service_names 更改为只有一个名称之后,第二个应该已经消失了,不是吗?

如果我不能让第二个服务消失,那么使用短服务名称而不是长服务名称使实例向侦听器注册就足够了。

我确定我错过了一些非常明显的东西,但我无法弄清楚它是什么。

oracle-11g-r2
  • 1 个回答
  • 38811 Views
Martin Hope
a_horse_with_no_name
Asked: 2013-03-12 05:43:17 +0800 CST

查找正在填满版本存储的事务

  • 6

我们已经为我们的一些 SQL Server 2005 数据库启用了“READ_COMMITTED_SNAPSHOT”。

现在我们不时看到我们的 TempDB 正在填满硬盘,我们怀疑版本存储是罪魁祸首。

我们通过监控 TempDB 使用情况sys.dm_db_file_space_usage,一旦我们看到版本存储正在增加(如 报告 version_store_reserved_page_count),我们希望识别正在积极使用版本存储的事务。

我正在使用以下语句来查找使用版本存储的事务:

SELECT db_name(spu.database_id) as database_name,
       at.transaction_begin_time as begin_time,
       case 
         when at.transaction_state in (0,1) then 'init'
         when at.transaction_state = 2 then 'active'
         when at.transaction_state = 3 then 'ended'
         when at.transaction_state = 4 then 'committing'
         when at.transaction_state = 6 then 'comitted'
         when at.transaction_state = 7 then 'rolling back'
         when at.transaction_state = 6 then 'rolled back'
         else 'other'
       end as transaction_state,
       ast.elapsed_time_seconds as elapsed_seconds,
       ses.program_name, 
       ses.row_count,
       (spu.user_objects_alloc_page_count * 8) AS user_objects_kb,
       (spu.user_objects_dealloc_page_count * 8) AS user_objects_deallocated_kb,
       (spu.internal_objects_alloc_page_count * 8) AS internal_objects_kb,
       (spu.internal_objects_dealloc_page_count * 8) AS internal_objects_deallocated_kb
FROM sys.dm_tran_active_snapshot_database_transactions ast
  JOIN sys.dm_tran_active_transactions at on at.transaction_id = ast.transaction_id
  JOIN sys.dm_exec_sessions ses ON ses.session_id = ast.session_id
  JOIN sys.dm_db_session_space_usage spu ON spu.session_id = ses.session_id
ORDER BY elapsed_time_seconds DESC
;

但这并不能帮助我确定每个事务在版本存储中实际使用了多少空间。

有没有办法获取有关每个事务(甚至更好:每个语句)版本存储中的空间使用情况的信息?

编辑:“潜在重复”(如何识别哪个查询正在填充 tempdb 事务日志?)不考虑版本存储(仅临时表、表变量以及用于排序和哈希操作的空间)。

实际上,接受的解决方案不会显示仅使用版本存储的交易(至少对我而言)

sql-server sql-server-2005
  • 1 个回答
  • 12958 Views
Martin Hope
a_horse_with_no_name
Asked: 2012-11-06 05:13:36 +0800 CST

SQL Server 触发器的性能

  • 1

我来自 Oracle/PostgreSQL 背景,很难应对 SQL Server 触发器实现的限制。

datetime如果不同列的值发生变化,我想更新两个不同的列。这是为了记录行的两个具体状态变化。

现在 SQL Server 既没有行级触发器,也没有before update触发器。所以我的理解是我需要加入插入和删除以找出是否发生了状态变化以及发生了哪些状态变化,然后对正在更新的表运行“定期”更新。

我的触发器目前看起来像这样:

create trigger ord_status_history_trigger
  on jobs
AFTER UPDATE
AS
  IF ( UPDATE(order_status) )
  BEGIN
    update jobs
      set  transfercomplete = case
                                when o.order_status = 'initial' and n.order_status = 'sent' then current_timestamp
                                else n.transfercomplete
                              end,
           installcomplete = case
                               when o.order_status = 'delivered' n.order_status = 'installed' then current_timestamp
                               else n.installcomplete
                            end
      from inserted n
        join deleted o on o.jobid = n.jobid
        join jobs aj on aj.jobid = n.jobid;
  END

我的问题是:这个触发器是否有效地导致表上的两个更新?

第一个是触发更新,第二个是触发器执行的更新?

或者 SQL Server 是否足够聪明,可以将其合并到对基表的单个更新中(基本上就像BEFORE UPDATEPostgreSQL 中的触发器一样)

我会在这里造成潜在的性能瓶颈吗?

我们也可以在应用程序中设置这些时间戳,但是如果我们可以将其委托给数据库会更好,这样我们就可以确保永远不会忘记这一点。

sql-server-2005 trigger
  • 1 个回答
  • 2535 Views
Martin Hope
a_horse_with_no_name
Asked: 2012-06-21 00:36:36 +0800 CST

安装 DB2Express 的问题

  • 3

我在我的 Windows 7(64 位)笔记本上安装了 DB2 Express 10.1。现在安装完成后我无法连接到数据库。在安装过程中,我将“C:\Datan\db\db2”指定为用于 DB2 的目录。

尝试连接时,出现以下错误:

SQL1031N 在指示的文件系统上找不到数据库目录。

但是数据库似乎在那里:

db2 => connect to db2inst
SQL1031N  The database directory cannot be found on the indicated file system.
SQLSTATE=58031

db2 => list database directory

 System Database Directory

 Number of entries in the directory = 1

Database 1 entry:

 Database alias                       = DB2INST
 Database name                        = DB2INST
 Local database directory             = C:\Daten\db\db2\IBM\DB2\DB2INST
 Database release level               = f.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = -1
 Alternate server hostname            =
 Alternate server port number         =

我验证了该目录的文件系统权限是否正确(运行 DB2 服务的用户对该目录具有完全控制权,我也将他设为所有者)。

的内容C:\Daten\db\db2\如下所示:

\---IBM
    \---DB2
        \---DB2INST
            +---cfg
            +---cfgcache
            +---DB2
            | +---ctrl
            | +---hmonCache
            | | \---DB2
            | | \---0
            | | \---ossipcres
            | +---日志
            | +---安全
            | | \---审计数据
            | +---spmlog
            | | \---SPMLOGSD
            | +---SQLDBDIR
            | +---TMP
            | \---UIF
            +---DB2DAS00
            | +---cfg
            | +---转储
            | +---日志
            | +---元数据
            | \---tmp
            | +---dastmp
            | \---schedtmp
            +---db2dump
            +---功能
            | \---不设防
            \ - -执照

然后我尝试重新编目数据库:

db2 => 取消编目数据库 db2inst
DB20000I UNATALOG DATABASE 命令成功完成。
DB21056W 在目录高速缓存被删除之前,目录更改可能不会生效
神清气爽。
db2 => 目录数据库 db2inst on "c:\Datan\db\db2\IBM\DB2\DB2INST\"
DB20000I CATALOG DATABASE 命令成功完成。
DB21056W 在目录高速缓存被删除之前,目录更改可能不会生效
神清气爽。

但这也无济于事。

由于某种原因,DB2 似乎无法访问(现有)目录:

db2 => 列出“c:\Datan\db\db2\IBM\DB2\DB2INST\”上的 db 目录
SQL1031N 在指示的文件系统上找不到数据库目录。
SQLSTATE=58031
db2 => 列出数据库目录

我没有使用 DB2 的经验,上次安装 Express 时一切顺利,所以我现在有点迷茫。

db2 windows
  • 2 个回答
  • 5193 Views
Martin Hope
a_horse_with_no_name
Asked: 2012-06-13 07:08:40 +0800 CST

SQL Server (2012) 非阻塞 DDL?

  • 5

我对 SQL Server 不是很有经验,所以也许我遗漏了一些东西

我的情况如下:

  • 会话 1 在关闭自动提交的情况下运行 CREATE TABLE(或其他 CREATE 语句)并且未提交 CREATE。
  • 会话 2 运行一条sp_table语句,但只要会话 1 未提交 DDL,它就会挂起

发生这种情况的场景是开发人员在数据库上工作。他们中的一些人浏览表格,其中一些人在做 DDL。如果一个用户忘记提交 DDL,则所有其他想要列出表的会话都会被阻止。请注意,它sp_tables是由例如 SQL 客户端(通过 JDBC 驱动程序 API)发出的,所以它不是可以更改的。

我正在使用的数据库启用了 snapshot_isolation,并且隔离级别设置为读取提交(SET ALLOW_SNAPSHOT_ISOLATION ON和SET READ_COMMITTED_SNAPSHOT ON)

我的假设是这些设置应该使 SQL Server 在锁定并发会话方面表现得更好(例如 PostgreSQL 和 Oracle,其中 SELECT 永远不会被任何作者阻止) - 但显然情况并非如此。

那么,有什么方法可以让 SQL Server 对 DDL 的并发读/写情况更加友好?(除了仅在自动提交模式下提交 DDL)。

sql-server-2012 concurrency
  • 2 个回答
  • 1558 Views
Martin Hope
a_horse_with_no_name
Asked: 2012-03-29 10:50:38 +0800 CST

Firebird 3.0 中的身份验证错误

  • 7

今天我想试一试 Firebird 3.0,但由于某种原因,我似乎无法安装它——至少不能以我可以从 JDBC 应用程序连接的方式安装。

我所做的是遵循这篇文章。这就是发生的事情:

c:\etc\Firebird30>gsec -add sysdba -pass masterkey

c:\etc\Firebird30>启动firebird.exe -a -m

c:\etc\Firebird30>isql
使用 CONNECT 或 CREATE DATABASE 指定数据库
SQL> 创建数据库 "localhost:c:\temp\mydbfb3.fdb" 用户 "sysdba" 密码 "masterkey";
语句失败,SQLSTATE = 08006
从连接读取数据时出错。
SQL>

现在“本地”创建数据库有效:

SQL> 创建数据库 "c:\temp\mydbfb3.fdb" 用户 "sysdba" 密码 "masterkey";
SQL>提交;
SQL>

但在这种情况下,当我从 JDBC 应用程序(仍然是“localhost”)连接时,我收到错误消息(使用 sysdba/masterkey 登录)

GDS 例外。335544472. 您的用户名和密码未定义。请您的数据库管理员设置 Firebird 登录。
原因:您的用户名和密码未定义。请您的数据库管理员设置 Firebird 登录。

我反复检查(不止一次)JDBC 应用程序中的用户名和密码是 sysdba/masterkey。

从命令行我确实可以访问新创建的数据库:

SQL> 连接 'c:\temp\mydbfb3.fdb';
数据库:'c:\temp\mydbfb3.fdb'
SQL> create table foo (bar integer);
SQL> 插入 foo 值 (1);
SQL> 从 foo 中选择 *;

         酒吧
=============
           1

SQL>提交;
SQL>

我确定我遗漏了一些明显的东西,但是什么?

firebird
  • 1 个回答
  • 10814 Views
Martin Hope
a_horse_with_no_name
Asked: 2011-12-16 01:49:12 +0800 CST

在 Oracle 11g 中使用 LOB 列对表进行分区

  • 4

我们有一个相当小的表(约 25k 行)正在被大量写入,并且大多数行很快就消失了(它是调度应用程序的一部分,用于存储有关该表中作业的信息)。

它是一个第三方应用程序,它执行大量小交易,导致该表上的竞争非常激烈。

这一切都在使用 Oracle 11gR1 的两节点 RAC 集群上运行

我们可以在 AWR 报告中看到,大部分时间都花在等待集群同步上。

我们想(散列)对该表进行分区,以便将争用分布在正在修改的块上。

但是,该表还包含一个BLOB列,应用程序使用该列来存储作业的状态。我们还看到对该列的 LOB 段的大量读取和写入。

我的问题是:当我们对表进行分区时,是否也可以创建多个 LOB 段?那么表分区(即段)和LOB段之间是一对一的关系吗?

我在手册中没有找到任何内容,但是由于 CREATE TABLE 的文档非常庞大,如果我忽略了某些内容,我不会感到惊讶。

oracle-11g partitioning
  • 1 个回答
  • 6427 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve