- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在对 Redshift 进行简单测试,以尝试加快将数据插入 Redshift 表的速度。我今天注意到的一件事是做这样的事情
CREATE TABLE a (x int) DISTSTYLE key DISTKEY (x) SORTKEY (x);
INSERT INTO a (x) VALUES (1), (2), (3), (4);
VACUUM a; ANALYZE a;
EXPLAIN SELECT MAX(x) FROM a;
产量
QUERY PLAN
XN Aggregate (cost=0.05..0.05 rows=1 width=4)
-> XN Seq Scan on a (cost=0.00..0.04 rows=4 width=4)
我知道这只有 4 行,但它仍然不应该进行全表扫描来查找预排序列的最大值。元数据不是包含在 ANALYZE
完成的工作中吗?
作为健全性检查,SELECT x FROM a WHERE x > 3
的 EXPLAIN
仅扫描 2 行而不是整个表。
编辑:我在表中插入了 1,000,000 多行,随机值从 1 到 10,000。抽真空并分析。查询计划仍然表示它必须扫描所有 1,000,004 行。
最佳答案
分析小型数据集中的查询计划不会对数据库如何执行查询产生任何实际见解。
优化器有阈值,当不同计划之间的成本差异足够小时,它就会停止考虑替代计划。这个想法是,对于简单的查询,搜索“完美”执行计划所花费的时间可能会超过次优计划的总执行时间。
Redshift 是基于 ParAccel DB 的代码开发的。 ParAccel 实际上有数百个参数,可以更改/调整以针对不同的工作负载/情况优化数据库。
由于 Redshift 是一种“托管”产品,因此在给定“预期”工作负载的情况下,它已将这些设置预设为 Amazon 工程师认为最佳的水平。
一般来说,Redshift 和 ParAccel 不太适合单片查询。无论如何,这些查询往往会在所有切片中运行,即使它们只会在单个切片中查找数据。
一旦查询在切片中执行,读取的最小数据量就是一个 block 。根据 block 大小,这可能意味着数十万行。
请记住,Redshift 没有索引。所以你不会有一个简单的记录查找,它会从索引中读取一些条目,然后激光聚焦在磁盘上的单个页面上。它将始终至少读取该表的整个 block ,并将在每个切片中执行此操作。
如何拥有有意义的数据集来评估查询计划?
简短的回答是您的表每个切片将有“大量”数据 block 。
我的表需要每个切片多少个 block ?答案取决于几个因素:
所以让我们从头开始。
当在 Redshift 中创建表并插入数据时,Redshift 会为每个切片分配至少一个 block 。
这是一个简单的例子:
如果您创建了一个包含两个 ds1.8xlarge 节点的集群,那么每个节点将有 16 个切片乘以两个节点,总共有 32 个切片。
假设我们正在查询,并且 WHERE 子句中的列是类似于“ITEM_COUNT”的整数。一个整数占用 4 个字节。
Redshift uses a block size of 1MB.
因此,在这种情况下,您的 ITEM_COUNT 列至少有 32 个 block 乘以 1MB 的 block 大小,这相当于 32MB 的存储空间。
如果您有 32MB 的存储空间并且每个条目只占用 4 个字节,那么您可以拥有超过 800 万个条目,并且它们都可以放在一个 block 中。
但是等等......
有压缩,如果您有 75% 的压缩率,这意味着即使 3200 万条记录仍然能够放入单个 block 中。
底线是什么?
为了分析您的查询计划,您需要具有多个 block 的表和列。在我们上面的示例中,3200 万行仍然是一个 block 。
这意味着在上面的配置中,根据所有假设,具有单个记录的表基本上很可能与具有 3200 万条记录的表具有相同的查询计划,因为在这两种情况下,数据库只需要读取每片一个 block 。
如果您想了解您的数据如何跨切片分布以及使用了多少 block ,您可以使用以下查询:
每片有多少行:
Select trim(name) as table_name, id, slice, sorted_rows, rows
from stv_tbl_perm
where name like '<<your-tablename>>'
order by slice;
如何计算有多少 block :
select trim(name) as table_name, col, b.slice, b.num_values, count(b.slice)
from stv_tbl_perm a, stv_blocklist b
where a.id = b.tbl
and a.slice = b.slice
and name like '<<your-tablename>>'
group by 1,2,3,4
order by col, slice;
关于sql - 为什么 Redshift 需要进行全表扫描才能找到 DIST/SORT 键的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39090962/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!