Con*_*bil 3 postgresql performance index
我需要在一个包含大约 6 亿行的现有表上插入一个新的两字段索引。该表包含大约一年内积累的数据,每天大约添加 200 万行新行。
\n\n我知道一次性向一个非常大的表添加新索引需要很长时间,因此为了节省时间,我首先使用以下命令仅对最后几天的数据建立索引\xe2\x80\xa6
\n\nCREATE INDEX idx_001\nON message (deviceNumber, messageTime)\nWHERE messageTime >='07-May-2018 00:00:00' ;\n
Run Code Online (Sandbox Code Playgroud)\n\n一天索引大约需要 3 小时,即大约 40 分钟。
\n\n理想情况下,我\xe2\x80\x99d 喜欢对整个表建立索引,但如果一天的数据需要 40 分钟,一次性完成将需要一周以上的时间。
\n\n我想我可以创建很多小索引,每个索引用于几天的数据,也许像这样\xe2\x80\xa6
\n\nCREATE INDEX idx_002\nON message (deviceNumber, messageTime)\nWHERE messageTime <'07-May-2018 00:00:00' AND messageTime >='01-May-2018 00:00:00' ;\n
Run Code Online (Sandbox Code Playgroud)\n\n但我\xe2\x80\x99d 更喜欢坚持使用一个索引。有没有办法改变现有索引的 where 子句来增加覆盖天数?或者我必须创建很多小索引吗?
\n不,您不能更改索引。因为,即使 PostgreSQL 允许这样做,它仍然需要重建索引。除非它对该WHERE
条款实施非常智能的检查,这将服务于相当罕见的用例。
拥有许多索引也不是最佳选择。每次运行查询时,规划器都必须考虑所有现有索引并选择最好的索引。如果您有多个索引,规划器会花费更多时间。不是年龄 - 但这种延迟仍然会影响涉及该表的每个查询。
我的建议是......要有耐心并建立一个大索引。您可以使用CREATE INDEX CONCURRENTLY
它来避免锁定。
归档时间: |
|
查看次数: |
1093 次 |
最近记录: |