(首先对不起我的英语。我不是母语人士)
我在选择数据方面遇到了问题。
我的问题是我不知道如何从表“component”优化SELECT。据我了解 - 我不能创建任何索引,以帮助Postgres根据其他表中的规则集进行选择。
我有以下架构: 组件可以有多个参数和一个所有者。参数和所有者可以添加到任何组。有几个输送机应该出现这些组件。有特殊的过滤规则,基于组件的组和所有者。此规则可以允许组件或阻止它。 规则可以是任何数字,并且可以为它们应用一些额外的逻辑。
表“组件”可以包含大量数据。每个输送机应按部分(或页面)处理组件。
知道我这样做: 1.取出输送机ID并将其所有规则选择到临时表中。 2.浏览所有组件并为每个组件调用我的函数,其中包含component_id和owner_id,并使用步骤1中的临时表来检查规则。
看起来像这样:
SELECT *
FROM component
WHERE check_rules(component_id, owner_id)
LIMIT p_limit OFFSET p_offset
但在这种情况下,Postgres每次都应该通过表格中的所有记录,这会使性能受到影响。 此结构应在具有大量数据的高负载环境中工作。所以我需要优化这种情况或有能力扩展它。 在这种情况下可能使用Postgres并不是一个好的解决方案,我需要使用其他一些系统(比如MapReduce或BigTable,但是知道我不能使用它们)。
请推荐一些东西。 非常感谢。
如果我被告知它不清楚,这里有一些sql代码。
CREATE TABLE component(
component_id int,
component_name varchar,
owner_id int);
CREATE TABLE parameter(
parameter_id int,
name varchar);
–component can have several parameters
CREATE TABLE component_parameter(
component_id int,
parameter_id int);
--tables for grouping parameters and owners
CREATE TABLE parameter_group(
group_id int,
parameter_id int);
CREATE TABLE owner_group(
group_id int,
owner_id int)
CREATE TABLE conveyor(
conveyor_id int,
conveyor_name varchar)
CREATE TABLE conveyor_rule(
conveyor_id int,
rule_id int,
allow_work boolean)
CREATE TABLE conveyor_rule_item(
rule_id int,
parameter_group_id int,
owner_group_id int)
答案 0 :(得分:0)
我建议摆脱WHERE语句中的函数和临时表的使用。而不是他们,尝试使用INNER JOINS。如果这是不可能的,请尝试至少将其中一个取出,例如通过创建临时表并加入,或创建一个不使用临时表的函数。