小编a_h*_*ame的帖子

查询调优问题

我在尝试调整以下查询时遇到了麻烦。我曾经 100% 专注于基础设施方面,但自今年 8 月以来,我在一家处理卡公司工作,该公司只要求我的“阴暗面”——查询调整技能。

如果您能为我提供提高查询性能的建议和技巧,我将不胜感激。以下是表格:

CREATE TABLE [dbo].[Delivery](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Address_Name] [varchar](120) NULL,
[Address_Street] [varchar](120) NULL,
[Address_Complement] [varchar](120) NULL,
[Address_City] [varchar](120) NULL,
[Address_District] [varchar](120) NULL,
[Address_Number] [varchar](120) NULL,
[Address_State] [varchar](120) NULL,
[Address_ZipCode] [varchar](120) NULL,
[OsFk] [int] NOT NULL,
[WebstoreOrderId] [int] NOT NULL,
[CourierType] [int] NULL,
 CONSTRAINT [PK_Delivery] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql tuning

6
推荐指数
1
解决办法
114
查看次数

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

我正在尝试查找属于相当大的 LOB 段的列(或表):

select segment_name, segment_type, bytes 
from dba_segments 
where segment_name = 'SYS_LOB0000103936C00014$$';
Run Code Online (Sandbox Code Playgroud)

返回:

select segment_name, segment_type, bytes 
from dba_segments 
where segment_name = 'SYS_LOB0000103936C00014$$';
Run Code Online (Sandbox Code Playgroud)

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

select table_name, column_name, segment_name, tablespace_name, index_name 
from dba_lobs 
where segment_name = 'SYS_LOB0000103936C00014$$';
Run Code Online (Sandbox Code Playgroud)

不返回任何行。

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

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

oracle

6
推荐指数
1
解决办法
2万
查看次数

甲骨文到 PostgreSQL

我有一些运行 Oracle 10 和 11 的测试数据库,我计划尝试迁移到 PostgreSQL。

一些谷歌搜索暗示 perl 脚本“ora2pg”可能有用,而且是免费的。然而,现在我花了太多时间试图让它在我的 winx64 机器上运行,因为 MinGw 不会编译它并且 activeperl 模块讨厌我。

是否有其他值得一看的免费工具,或者我应该启动并运行 Linuxbox 并以这种方式尝试 ora2pg?

问候

postgresql oracle migration

5
推荐指数
1
解决办法
882
查看次数

尝试使用 impdp 复制架构

我正在尝试使用 oracle 的 IMPDP 工具完整地复制 SCHEMA。我已经设置了一个指向自身的数据库链接,并且该链接工作正常。然后我运行这个:

impdp username/password@instancename schemas=TARGET_SCHEMA 
      network_link=LINK_BACK_TO_TARGET 
      directory=HOME_DIR logfile=IMPDP_COPY_BACKUP.log 
      remap_schema=TARGET_SCHEMA:SOURCE_SCHEMA 
      TRANSFORM=STORAGE:n:table;
Run Code Online (Sandbox Code Playgroud)

在我的两个测试系统中一切正常,但在 Oracle 11gR2 生产中,它开始移动表并产生以下结果:

Processing object type SCHEMA_EXPORT/TABLE/TABLE
ORA-39126: Worker unexpected fatal error in 
    KUPW$WORKER.UPDATE_TD_BASE_PO_INFO [UPDATE 
    "ADMIN"."SYS_IMPORT_SCHEMA_04" mtu SET 
    mtu.base_process_order = NVL((SELECT mts1.process_order 
    FROM "ADMIN"."SYS_IMPORT_SCHEMA_04" mts1 WHERE 
    mts1.process_order > 0 AND mts1.duplicate = 0 
    AND mts1.object_schema = mtu.base_object_schema 
    AND mts1.object_name = mtu.base_object_name AND 
    mts1.object_type = mtu.base_object_type AND 
    mts1.processing_state != :1 ), 
    (-1000 - (SELECT MIN(mts2.process_order) FROM 
    "ADMIN"."SYS_IMPORT_SCHEMA_04" mts2 WHERE 
    mts2.process_order > 0 AND mts2.duplicate = 0 …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 impdp

5
推荐指数
1
解决办法
2052
查看次数

是否可以将行大小估计与最大列宽分离?

换句话说,是否可以声明一列VARCHAR(n)并使其估计大小不是n/2?

一个示例用例可能是存储 URL - 您希望大多数是相对的并且少于 20 个字符左右(例如“About/AboutUs”),但希望偶尔支持带有大量查询字符串参数的长 URL。

sql-server optimization

5
推荐指数
1
解决办法
72
查看次数

带有一个操作数的“+”运算符!

'+' 运算符在以下语句中的表现如何?

select + 'taco';  --Result is 'taco'
Run Code Online (Sandbox Code Playgroud)

它是与第一个字符串空白('' + 'taco')进行字符串连接,还是其他意思?

mysql sql-server t-sql operator

5
推荐指数
1
解决办法
261
查看次数

在 SQL 查询中包含 SQL 文件

在 Oracle SQL Developer 中,有没有办法在 SQL 查询中包含 SQL 文件?就像\include{myfile.tex}LaTeX 中的命令一样。

例子:

  • file1.sql 包含 FROM my_table;
  • file2.sql 包含 SELECT * \include{file1.sql}

执行file2.sql从Oracle SQL Developer中应该是相当于执行SELECT * FROM my_table;

oracle-sql-developer

5
推荐指数
1
解决办法
2607
查看次数

是否存在插入 + 删除比更新更快的实际场景?(SQL 服务器)

我只是想知道是否存在插入/删除组合比更新其他插入函数更快的常见场景。

这是我的具体例子。

我必须使用一次包含 1000 条记录的页面更新数据库。(我无法合并页面)。

这些记录中约有 5% 或 50 行是需要“更新”而不是作为全新插入的重复项。

我认为,不是“基于 ID 更新,否则插入新行”的典型功能,“插入所有内容”并在最后一次性删除重复项可能会更快。

两个原因:

  1. 并行性。如果我希望多个进程同时处理这个任务,那么......如果我有一个很大的提交大小和同时搜索和更新 ID 的事务,我可能会遇到行锁。通过“插入所有内容”并稍后删除“旧”记录,我可以有无限的进程同时写入数据。

  2. 我觉得在最后优化一个大的“删除查找”很容易。它看起来像下面这样:

    with CTE as (
       select primary_id,update_date,
              rn = row_number()over(partition by primary_id order by update_date desc)
       from MyTable
    )
    delete from CTE where rn > 1
    
    Run Code Online (Sandbox Code Playgroud)

我的意思是性能提升是存在的——我只是想知道这是否违背了最佳实践。有人能明白为什么插入 + 删除重复项似乎比“更新,如果没有找到,插入”更快?

我可以看到一个危险是在数据加载运行时有一段时间表不准确(在删除之前)。但是在任何更新过程中,这种情况难道不是真的吗?

这也将是数据仓库的临时表,而不是实时使用的数据。我只是想知道为什么我没有经常看到这种方法。

performance sql-server etl insert parallelism

5
推荐指数
1
解决办法
265
查看次数

在主查询中包括结果计数?

目前我们执行两个查询以使用分页过滤器获取计数和结果。虽然我们可以轻松地将这两者结合到一个网络调用中(使用 sql 分隔符),但有没有办法在遵循DRY原则的单个查询中做到这一点?

-- count    
SELECT COUNT(*) FROM table;

-- result with pagination
SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY tbl.idn) AS row, * FROM tbl)_tbl
WHERE row >= 1 AND row <= 10;
Run Code Online (Sandbox Code Playgroud)

维护两个查询真的很有挑战性——单个查询减少了维护开销。

sql-server count

5
推荐指数
1
解决办法
3134
查看次数

报告合并的 when-not-matched-then 子句中的错误

是否可以在合并的 when-not-matched-then 子句中报告错误(引发异常或其他任何内容)?我的目标是像

WHEN NOT MATCHED THEN RAISE NO_DATA_FOUND;
Run Code Online (Sandbox Code Playgroud)

或者任何会告诉调用者脚本失败的东西。

oracle

5
推荐指数
1
解决办法
1891
查看次数