我運行一個使用PostgreSQL 9.1作爲後端的配方網站。當用戶搜索食譜時,我根據用戶想要查找的內容即時創建查詢。例如,如果用戶想要查找具有在30分鐘烹調時間所有的食譜,我會生成查詢:PostgreSQL - 在所有表搜索中排除特定行集合的絕對最快方法是什麼
SELECT * From Recipes WHERE CookTime < 30;
我現在需要「隱藏」某些配方,這意味着他們將永遠不會顯示在任何搜索中,永遠。獲得他們的唯一方法是直接瞭解URL。要做到這一點,我添加了一個新列食譜表:
ALTER TABLE Recipes ADD COLUMN Hidden boolean not null default false;
CREATE INDEX IDX_Recipes_Hidden ON Recipes(Hidden);
我的想法是隻是硬編碼的那句「不隱藏」到每一個WHERE子句。例如,上面的查詢現在是:
select * from recipes where not Hidden and CookTime < 30;
我的問題:
根據查詢分析器,它將會產生一個位圖到兩個指標結合起來。請記住99%的配方將會隱藏而不是。我想知道這種技術是否是從所有查詢中排除特定配方的最佳方法。我知道絕對的最快的方法是創建一個單獨的表隱藏的食譜,但是這將是重新分解了大量的,所以我想避免這種情況。
爲什麼你認爲需要大量的重新分解?您可以使用一組規則將視圖隱藏在視圖後面。這是PostgreSQL中的分區工作原理> – vyegorov 2012-04-19 06:46:33
「請記住99%的配方不會隱藏」請勿索引此字段,只是時間和空間的一部分。除非你使用條件索引:WHERE hidden = true – 2012-04-19 08:06:40
看來我們在這裏有相同的(種)問題:http://stackoverflow.com/a/8544893/905902。無論如何,我同意@Frank Heikens;該索引可能是沒有意義的(除非所有的數據庫都保存在內存中,並且有更多的內存可用) – wildplasser 2012-04-19 08:47:35