我有一个超过 30 亿行的 SQL Server 表。我的一个查询需要很长时间,所以我正在考虑优化它。查询如下所示:
SELECT [Enroll_Date]
,Count(*) AS [Record #]
,Count(Distinct UserID) AS [User #]
FROM UserTable
GROUP BY [Enroll_Date]
Run Code Online (Sandbox Code Playgroud)
[Enroll_Date] 是具有少于 50 个可能值的低选择性列,而 UserID 列是具有超过 2 亿个不同值的高选择性列。根据我的研究,我认为我应该在这两列上创建一个非聚集复合索引,理论上高选择性列应该是第一列。但我不确定在我的情况下,这是否有效,因为我在 group by 子句中使用了低选择性列。
该表没有聚集索引。
我有一个 RAID10 服务器,并且 Postgres 将日志(pg_xlog aka WAL)写入同一个 RAID10 阵列。
我在带有大缓冲区的同步模式下使用 WAL 并执行大量批量插入和更新,因此希望可以使用该缓冲区。
将日志拆分到一个额外的磁盘上而不是在 raid10 中是个好主意吗?我可以用 2 个磁盘在 RAID 中填充内容,但这真的会改善什么吗?
我期待有人能说出一些优点和缺点。
当我转到“工具”>“选项”>“环境”>“键盘”并
键入 Query.Sp_whoisactive 时,
按快捷键:Ctrl+F1
单击“分配”。
当我按Ctrl+ 时F1,它仍然调用帮助。
我正在尝试破解一个名为 Phabricator / Phorge 的 FLOSS 应用程序
让我们看一下这个简单的 MySQL 表,它按 ID 及其状态( 、 等)存储一些open
问题:closed
invalid
CREATE TABLE `ponder_question` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status` varchar(32) NOT NULL,
PRIMARY KEY (`id`),
KEY `status` (`status`),
Run Code Online (Sandbox Code Playgroud)
我想先按特定状态排序,然后再按其他状态排序。所以:
SELECT * FROM ponder_question
ORDER BY status='open' DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)
它有效,但请考虑这一点DESCRIBE
。该查询显然正在检查 5000 行,这可能太多了/它正在进行全表扫描:
ID | 选择类型 | 桌子 | 分区 | 类型 | 可能的键 | 钥匙 | 密钥长度 | 参考 | 行 | 过滤的 | 额外的 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 简单的 | 思考问题 | 无效的 | 指数 | 无效的 | 地位 | 130 | 无效的 | 5000 | 100.00 | 使用索引;使用文件排序 |
(相反,如果你EXPLAIN …