我有一个带有列的 InnoDB 表“idtimes”(MySQL 5.0.22-log)
`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
Run Code Online (Sandbox Code Playgroud)
使用复合唯一键
UNIQUE KEY `id_time` (`id`,`time`)
Run Code Online (Sandbox Code Playgroud)
所以每个 id 可以有多个时间戳,每个时间戳可以有多个 id。
我正在尝试设置一个查询,在其中获取所有条目以及每个条目的下一个更大时间(如果存在),因此它应该返回,例如:
+-----+------------+------------+
| id | time | nexttime |
+-----+------------+------------+
| 155 | 1300000000 | 1311111111 |
| 155 | 1311111111 | 1322222222 |
| 155 | 1322222222 | NULL |
| 156 | 1312345678 | 1318765432 |
| 156 | 1318765432 | NULL |
+-----+------------+------------+
Run Code Online (Sandbox Code Playgroud)
现在我到目前为止:
SELECT l.id, l.time, r.time FROM
idtimes AS l LEFT JOIN idtimes …Run Code Online (Sandbox Code Playgroud) 我有一个观点,complicated_view-- 有一些连接和 where 子句。现在,
select * from complicated_view (9000 records)
Run Code Online (Sandbox Code Playgroud)
更快,更快,比
select top 500 * from complicated_view
Run Code Online (Sandbox Code Playgroud)
我们说的是 19 秒对 5+ 分钟。
第一个查询返回所有 9000 条记录。如何只获得前 500 名的时间长得可笑?
显然,我将在这里查看执行计划 ---- 但是一旦我弄清楚为什么SQL Server 以次优方式运行“前 500”,我该如何实际告诉它以快速方式运行计划,喜欢坐满桌?
当然,我可能不得不完全重写视图——但很奇怪。
基本上,我将此数据表连接到第 3 方软件,该软件使用select top 500 *无法修改的默认查询预先检查表。因此,除了将此视图转储到实际表中(非常草率)之外,我也无法绕过他们的“前 500 名”附录。
这是 SQL Server 2012。
编辑:不同意重复标志。另一个问题,顶部比所有的都快。这将是预期的行为,返回较少的行。我的情况正好相反。另外,我的理解是 Top 100 是一种与 Top 100+ 不同的算法。我什至不认为重复的问题有正确的答案。也就是说,TOP X 查询将在很早的时候对潜在的大量表进行排序,而不是在它们被聚合/过滤/等之后。为什么是一个谜,但如何显然存在。
performance sql-server execution-plan select top query-performance
考虑这个选择语句:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Run Code Online (Sandbox Code Playgroud)
它返回query_id带有值的列1以及玩家的其他列。
如何将一个至少让上面的SQL回报query_id的1,即使选择,反而找不到行那场比赛?
顺便说一句,它是 PostgreSQL 8.4。
我们有一个大约 1TB 的大型数据库,在强大的服务器上运行 SQL Server 2014。几年来,一切都运行良好。大约 2 周前,我们进行了全面维护,其中包括: 安装所有软件更新;重建所有索引和压缩 DB 文件。但是,我们没想到在某个阶段,在实际负载相同的情况下,DB 的 CPU 使用率会增加超过 100% 到 150%。
经过大量的故障排除,我们将其缩小到一个非常简单的查询,但我们找不到解决方案。查询非常简单:
select top 1 EventID from EventLog with (nolock) order by EventID
Run Code Online (Sandbox Code Playgroud)
它总是需要大约 1.5 秒!但是,使用“desc”的类似查询总是需要大约 0 毫秒:
select top 1 EventID from EventLog with (nolock) order by EventID desc
Run Code Online (Sandbox Code Playgroud)
PTable 大约有 5 亿行;EventID是ASC数据类型为 bigint(身份列)的主聚集索引列(ordered )。顶部有多个线程向表中插入数据(较大的 EventID),底部有 1 个线程删除数据(较小的 EventID)。
在 SMSS 中,我们验证了两个查询始终使用相同的执行计划:
聚集索引扫描;
估计行数和实际行数均为1;
估计和实际执行次数均为1;
估计I/O成本是8500(好像有点高)
如果连续运行,则两者的查询成本相同 50%。
我更新了索引统计with fullscan,问题依旧;我再次重建索引,问题似乎消失了半天,但又回来了。
我打开了 IO 统计:
set statistics io on …Run Code Online (Sandbox Code Playgroud) performance sql-server select sql-server-2014 top query-performance
有没有办法使用WITH语句执行多个操作?
就像是
WITH T AS
(
SELECT * FROM Tbl
)
BEGIN
OPEN P_OUTCURSOR FOR
SELECT * FROM T;
SELECT COUNT(*) INTO P_OUTCOUNT FROM T;
END;
Run Code Online (Sandbox Code Playgroud)
我想选择一些数据和它的计数...
我有一张comments表,可以简化为:
comments
=======
id
user_id
text
parent_id
Run Code Online (Sandbox Code Playgroud)
where 可以parent_id为空,但可能是其父注释的键。
现在,我如何才能select对特定评论的所有后代?
评论可能低了好几层……
我通过一个复杂的选择查询创建了表CREATE TABLE ... AS SELECT...。如何在此查询中添加自动增量主键?
例如:
create table `user_mv` select `user`.`firstname` as
`firstname`,
`user`.`lastname` as `lastname`,
`user`.`lang` as `lang`,
`user`.`name` as `user_name`,
`group`.`name` as `group_name`
from `user`
inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`)
left join `group` on (`group`.`group_id`=`user_groups`.`group_id`)
where `user`.`lang`=`group`.`lang`
Run Code Online (Sandbox Code Playgroud)
此查询创建一个包含firstname, lastname, lang, username,group_name列的表。我希望它也有一个id作为自动增量主键的列。
有没有办法通过更改此查询来做到这一点?我知道我可以通过在执行此查询后更改表来做到这一点,但是如果有任何方法可以直接在create table语句中执行此操作,我想知道如何执行此操作。
在 Oracle 的文档The Query Optimizer 中,在View Merging 下,我找到了以下信息
视图合并优化适用于仅包含选择、投影和连接的视图。也就是说,可合并视图不包含集合运算符、聚合函数、DISTINCT、GROUP BY、CONNECT BY 等。 (强调我的)
然而,我只能猜测这样的投影实际上指的是什么。
这适用于最有可能出现在 StackOverflow/dba.stackexchange 上的主要关系数据库管理系统,包括SQL Server、MySQL、PostgreSQL 和 SQLite (WebSQL)。
select 'abc' abc, 1 def;
Run Code Online (Sandbox Code Playgroud)
它不适用于 Oracle。为什么我们需要在Oracle中选择DUAL?SQL 的 ISO/ANSI 标准是否要求SELECT语句的 FROM 子句?
根据Bacon Bit的回答,它似乎是 SQL 标准所要求的。
所以实际上,因为名称 DUAL 用词不当,如果我要创建一个表并将其命名为 ATOM 或 ONE,例如create table one (atom int);.. select 'abc' abc, 1 def FROM one;- 与 相比是否有性能损失SELECT .. FROM DUAL?
我有下表:
CREATE TABLE post (
id bigint primary key,
thread_id bigint,
is_notice boolean,
title text,
content text
)
Run Code Online (Sandbox Code Playgroud)
我使用以下查询显示列表:
SELECT * FROM post ORDER BY is_notice desc, thread_id desc, id
Run Code Online (Sandbox Code Playgroud)
然后,给定由 id(ie SELECT * FROM post where id=3)选择的帖子,我如何检索下一个和上一个帖子?
select ×10
mysql ×3
oracle ×3
performance ×2
postgresql ×2
sql-server ×2
top ×2
ctas ×1
cte ×1
foreign-key ×1
innodb ×1
join ×1
null ×1
primary-key ×1