考虑以下具有多列索引的示例表:
create table BigNumbers (
col1 tinyint not null,
col2 tinyint not null,
col3 tinyint not null,
index IX_BigNumbers clustered (col1, col2, col3)
)
DECLARE @n INT = 100;
DECLARE @x1 INT = 0;
DECLARE @x2 INT = 0;
DECLARE @x3 INT = 0;
SET NOCOUNT ON;
WHILE @x3 <= @n BEGIN
SET @x2 = 0;
WHILE @x2 <= @n BEGIN
SET @x1 = 0;
WHILE @x1 <= @n BEGIN
insert into BigNumbers values (@x1, @x2, @x3);
SET @x1 = …
Run Code Online (Sandbox Code Playgroud) 我有一个包含三列的表:HashUID1、HashUID2、Address_Name(这是一个文本电子邮件地址,前两个哈希列是将事件参与者表链接到电子邮件地址的疯狂创建。它丑陋,几乎无法解决由我控制。专注于 address_name 索引)
它有 7800 万行。没有正确排序。无论如何,该索引被拆分到许多快速 LUN 上并执行非常快速的索引查找。
我需要创建一系列查询以一次仅提取 20,000 个“每页行”,但要避免冲突或欺骗。由于没有标识列或易于排序的列,是否有一种简单的方法可以全选并翻页?
我说的是否正确,如果我将 select * from hugetablewithemails 放入临时表,然后通过 row_number 通过它选择该表在事务期间保留在内存中,对我来说,这是过多的内存资源? 这似乎是首选的分页方法。我宁愿按统计百分比分页。:(
有一个索引按顺序维护 address_name 电子邮件地址,并且维护得很好。在过去的一周里,我一直想通过花费一些时间来研究构建一个基于统计的窗口函数吐出范围的过程(我不擅长,但这个查询真的让我感兴趣)来帮助其他开发人员提供索引的一系列字符 1 到(变量)LEFT LIKE 字符,满足 20,000 行——但我什至没有时间开始查询......
几个问题:
有什么建议?不是在寻找实际的代码,只是一些基于经验的提示或建议,也许是警告。我想避免在初始扫描后进行额外的索引扫描。
这是正确的方法吗?
我正在考虑打破所有电子邮件地址的索引总和,收集行数(*),/20,000,并将其用作窗口函数,根据总行数的百分比对最小/最大子字符串(1,5)值进行分组建立分组范围。想法?
这是针对无法修改源数据库的 ETL 过程。
我希望通过一次完整的索引扫描,我可以做到:
查询以根据索引使用情况(按字母顺序排序)获取直方图,并使用 min/max 将其分解(窗口化)以创建这样的一些范围,以便轻松查找所需的索引:
A-> AAAX,(例如 20k 行)AAA-Z,B->(另外 20k),B->BAAR -> BAAR-> CDEFG -> CDEFH > FAAH,等等。
我们为这个 ETL 过程在这些数据库中运行读提交。我们只尝试将它批量处理成 20k 行,因为 DBA 说我们通过抓取完整的表格使用了太多的网络资源。如果数据发生了变化(这是一个问题),我们会即时更新我们的 DW 和临时表。
我喜欢用临时表,但如果我这样做,我会溢出到tempdb中,并获得关于其从DBA的圈套通过电子邮件和数据库太大。
我是一名 Web 开发人员(不是 DB 管理员!)在处理 MySQL 上的 1.7m 记录表时遇到性能问题。这是那个表:
CREATE TABLE `bbcmapimp_pc_raw` (
`postcode` char(8) NOT NULL,
`pc_sector` char(6) DEFAULT NULL,
`pc_district` char(4) DEFAULT NULL,
`pc_area` char(2) DEFAULT NULL,
`parliamentary_constituency_code` char(9) DEFAULT NULL,
`parliamentary_constituency` varchar(255) DEFAULT NULL,
`mp_name` varchar(255) DEFAULT NULL,
`district_code` char(4) DEFAULT NULL,
`district` varchar(45) DEFAULT NULL,
`country` varchar(255) DEFAULT NULL,
`suffix` char(5) DEFAULT NULL,
PRIMARY KEY (`postcode`),
KEY `pcc` (`parliamentary_constituency_code`),
KEY `suffix_index` (`pc_area`,`suffix`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我只需要迭代表,但在我第一次尝试时,我使用了 OFFSET,这太可怕了!从那以后,我了解了 MySQL 在引擎盖下所做的事情,并理解了为什么它变得越来越慢。
所以,我试图修改我的查询以使用 WHERE 子句,但问题是我按两个字段对查询进行排序(该表定义了一个复合索引)。
一种解决方案是添加一个按正确顺序排列的 ID 字段并使用它;但我想知道是否有任何方法可以在一个大于 …