的PostgreSQL 9.4 表如下所示創建。爲了最有效,我傾向於在下面的查詢使用Index Only Scan
:爲什麼不能在索引創建的索引上使用僅索引掃描?</p> <pre><code>CREATE TABLE foo ( id integer, date date, value numeric(14,3) ); </code></pre> <p>我使用的<code>ROW_NUMBER()</code>窗口功能和<code>COALESCE</code>優化查詢:
SELECT id, c_val
FROM (
SELECT id, COALESCE(value, 0) c_val, ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC NULLS LAST) rn
FROM foo) sbt
WHERE sbt.rn = 1;
所以,如果我創建指標如下:
CREATE INDEX ON foo (id, date DESC NULLS LAST, value);
規劃者選擇使用Index Only Scan
,但如果我這樣做它以這種方式:
CREATE INDEX ON foo (id, date DESC NULLS LAST, COALESCE(value, 0));
規劃師只會做Index Scan
。
爲什麼?我試圖避免在執行查詢時評估COALESCE
函數的成本。爲什麼它不適用於Index Only Scan
?
coalesce()的「成本」幾乎爲零,不用擔心。 –