我在尝试调整以下查询时遇到了麻烦。我曾经 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) 我正在尝试查找属于相当大的 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 10 和 11 的测试数据库,我计划尝试迁移到 PostgreSQL。
一些谷歌搜索暗示 perl 脚本“ora2pg”可能有用,而且是免费的。然而,现在我花了太多时间试图让它在我的 winx64 机器上运行,因为 MinGw 不会编译它并且 activeperl 模块讨厌我。
是否有其他值得一看的免费工具,或者我应该启动并运行 Linuxbox 并以这种方式尝试 ora2pg?
问候
我正在尝试使用 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) 换句话说,是否可以声明一列VARCHAR(n)并使其估计大小不是n/2?
一个示例用例可能是存储 URL - 您希望大多数是相对的并且少于 20 个字符左右(例如“About/AboutUs”),但希望偶尔支持带有大量查询字符串参数的长 URL。
'+' 运算符在以下语句中的表现如何?
select + 'taco'; --Result is 'taco'
Run Code Online (Sandbox Code Playgroud)
它是与第一个字符串空白('' + 'taco')进行字符串连接,还是其他意思?
在 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;。
我只是想知道是否存在插入/删除组合比更新其他插入函数更快的常见场景。
这是我的具体例子。
我必须使用一次包含 1000 条记录的页面更新数据库。(我无法合并页面)。
这些记录中约有 5% 或 50 行是需要“更新”而不是作为全新插入的重复项。
我认为,不是“基于 ID 更新,否则插入新行”的典型功能,“插入所有内容”并在最后一次性删除重复项可能会更快。
两个原因:
并行性。如果我希望多个进程同时处理这个任务,那么......如果我有一个很大的提交大小和同时搜索和更新 ID 的事务,我可能会遇到行锁。通过“插入所有内容”并稍后删除“旧”记录,我可以有无限的进程同时写入数据。
我觉得在最后优化一个大的“删除查找”很容易。它看起来像下面这样:
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)我的意思是性能提升是存在的——我只是想知道这是否违背了最佳实践。有人能明白为什么插入 + 删除重复项似乎比“更新,如果没有找到,插入”更快?
我可以看到一个危险是在数据加载运行时有一段时间表不准确(在删除之前)。但是在任何更新过程中,这种情况难道不是真的吗?
这也将是数据仓库的临时表,而不是实时使用的数据。我只是想知道为什么我没有经常看到这种方法。
目前我们执行两个查询以使用分页过滤器获取计数和结果。虽然我们可以轻松地将这两者结合到一个网络调用中(使用 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)
维护两个查询真的很有挑战性——单个查询减少了维护开销。
是否可以在合并的 when-not-matched-then 子句中报告错误(引发异常或其他任何内容)?我的目标是像
WHEN NOT MATCHED THEN RAISE NO_DATA_FOUND;
Run Code Online (Sandbox Code Playgroud)
或者任何会告诉调用者脚本失败的东西。
sql-server ×5
oracle ×4
t-sql ×2
count ×1
etl ×1
impdp ×1
insert ×1
migration ×1
mysql ×1
operator ×1
optimization ×1
parallelism ×1
performance ×1
postgresql ×1
tuning ×1