我将数据放在posgresql表上,在运行一些查询(不包含ORDER BY
子句)时,我发现在查询计划中(与EXPLAIN
一起输出)很多时候用于从列中对元组进行排序。
版本:这是表格架构
有两种类型的表class_tableX
和prop_tableY
。
以下是我如何构建它们并为它们编制索引。
CREATE TABLE IF NOT EXISTS "prop_tableY" (
s VARCHAR(100),
p VARCHAR(100),
o VARCHAR(100),
PRIMARY KEY (s,p,o)
)
CREATE INDEX "index_prop_tableY" ON "prop_tableY" (s,p,o)
CREATE TABLE IF NOT EXISTS "class_tableX" (
s VARCHAR(100),
o VARCHAR(100),
PRIMARY KEY (s,o)
)
CREATE INDEX "index_prop_tableX" ON "prop_tableY" (s,o)
版本:以下是查询
EXPLAIN SELECT t2.p AS prop, t2.o AS obj, COUNT(t2.o) AS num
FROM "class_Event" AS t1, (
(SELECT s,p,o FROM "prop_sliceHasAnomaly")
UNION (SELECT s,p,o FROM "prop_eventHasDuration")
UNION (SELECT s,p,o FROM "prop_sliceHasEndEvent")
UNION (SELECT s,p,o FROM "prop_eventPrecedeInCPU")
UNION (SELECT s,p,o FROM "prop_eventFollowInTask")
UNION (SELECT s,p,o FROM "prop_topObjectProperty")
UNION (SELECT s,p,o FROM "prop_eventDetails")
UNION (SELECT s,p,o FROM "prop_switchTo")
UNION (SELECT s,p,o FROM "prop_eventIsExecutedOn")
UNION (SELECT s,p,o FROM "prop_runningAction")
UNION (SELECT s,p,o FROM "prop_anomalyHasSlice")
UNION (SELECT s,p,o FROM "prop_eventPrecedeInTrace")
UNION (SELECT s,p,o FROM "prop_sliceHasStartEvent")
UNION (SELECT s,p,o FROM "prop_eventHasActiveDuration")
UNION (SELECT s,p,o FROM "prop_eventFollowInTrace")
UNION (SELECT s,p,o FROM "prop_runningTask")
UNION (SELECT s,p,o FROM "prop_eventOrdering")
UNION (SELECT s,p,o FROM "prop_domain")
UNION (SELECT s,p,o FROM "prop_sliceHasFunctionality")
UNION (SELECT s,p,o FROM "prop_traceContainsEvent")
UNION (SELECT s,p,o FROM "prop_eventHasDurationFromPreviousOccurrence")
UNION (SELECT s,p,o FROM "prop_eventPrecedeOccurrence")
UNION (SELECT s,p,o FROM "prop_eventPrecedeinTask")
UNION (SELECT s,p,o FROM "prop_switchFrom")
UNION (SELECT s,p,o FROM "prop_eventEndAt")
UNION (SELECT s,p,o FROM "prop_subPropertyOf")
UNION (SELECT s,p,o FROM "prop_eventFollowOccurrence")
UNION (SELECT s,p,o FROM "prop_eventFollowInCPU")
UNION (SELECT s,p,o FROM "prop_subClassOf")
UNION (SELECT s,p,o FROM "prop_eventHasDurationToNextOccurrence")
UNION (SELECT s,p,o FROM "prop_requestComponent")
UNION (SELECT s,p,o FROM "prop_eventStartAt")
UNION (SELECT s,p,o FROM "prop_range")
UNION (SELECT s,p,o FROM "prop_functionalityHasSlice") ) AS t2,
"prop_runningTask" t3
WHERE t1.s = t2.s
AND t3.s = t2.s
AND t3.o LIKE '%ts_record0%'
GROUP BY t2.p, t2.o
HAVING (COUNT(t2.o) > 1)
所以我想知道是否有可能从表的列中自动排序(一次)元组以避免在查询执行期间执行这些排序步骤?
我的理解是,在插入表格之前可以对事物进行排序。但在我的情况下,由于隐私的原因很难做到。这就是为什么我对postgres实现的方法感兴趣