【发布时间】:2019-07-25 09:04:45
【问题描述】:
3 个表格和 1 个视图 查询将如何使用假的“null as col”值?
Table1
- IndexedCol1
- Col2
- CommonIndexedCol1
- CommonIndexedCol2
- CommonIndexedCol3
Table2
- IndexedCol2
- Col3
- Col4
- CommonIndexedCol1
- CommonIndexedCol2
- CommonIndexedCol3
Table3
- IndexedCol3
- Col5
- Col6
- CommonIndexedCol1
- CommonIndexedCol2
- CommonIndexedCol3
View1
- Table1.IndexedCol1
- Table2.IndexedCol2
- Table3.IndexedCol3
- CommonIndexedCol1
- CommonIndexedCol2
- CommonIndexedCol3
View1 查询是:
SELECT IndexedCol1, null as IndexedCol2, null as IndexedCol3, CommonIndexedCol1, CommonIndexedCol2, CommonIndexedCol3 FROM Table1
UNION
SELECT null as IndexedCol1, IndexedCol2, null as IndexedCol3, CommonIndexedCol1, CommonIndexedCol2, CommonIndexedCol3 FROM Table2
UNION
SELECT null as IndexedCol1, null as IndexedCol2, IndexedCol3, CommonIndexedCol1, CommonIndexedCol2, CommonIndexedCol3 FROM Table3
假设每个表有 100 万行
如果我运行以下查询
SELECT * FROM View1 WHERE CommonIndexedCol1=1 AND IndexedCol1 is NOT NULL
postgres 是否会跳过具有 SELECT(null as IndexedCol1)的选择,因此仅查询 1 个表,仅 100 万行,它是否理解此选择将导致所有空值,因此它应该跳过第二个和第三个选择查询开始? 或者它会查询 3 个表中的全部 300 万条记录是否为非空 IndexedCol1?
【问题讨论】:
-
PostgreSQL 支持EXPLAIN 告诉你它将如何处理查询..
-
运行
explain (analyze) select ...,你会看到Postgres会做什么 -
@a_horse_with_no_name 是的,问题中的拼写错误,已修复...我现在就写
EXPLAIN,谢谢
标签: postgresql view