最初发布:https : //stackoverflow.com/questions/11173717/expensive-query-on-select-distinct-with-multiple-inner-join-in-postgres
歌曲表只有大约 4k 行,帖子和电台更少。运行查询而不DISTINCT ON修复它。
在 Mac OS X Lion 上运行 Postgres。
Song Load (7358.2ms)
EXPLAIN (426.2ms)
EXPLAIN for:
SELECT DISTINCT ON (songs.rank, songs.shared_id) songs.*,
songs.*,
posts.url as post_url,
posts.excerpt as post_excerpt,
stations.title as station_title,
stations.slug as station_slug
FROM "songs"
INNER JOIN "posts" ON "posts"."id" = "songs"."post_id"
inner join stations on stations.blog_id = songs.blog_id
WHERE "songs"."processed" = 't'
AND "songs"."working" = 't'
ORDER BY songs.rank desc
LIMIT 24 OFFSET 0
QUERY PLAN
------------------------------------------------------------------------------------------------
Limit (cost=546147.28..546159.16 …Run Code Online (Sandbox Code Playgroud) 这个查询给了我多个点击,因为每个assetid可能包含很多vb.title. 如何将结果限制为每个仅 1 次命中assetid?
'select DISTINCT v.id,
v.purchasedate,
v.customerid,
v.assetid,
va.description,
vb.title
from purchases v,
asset va,
assetdescription vb
where customerid = '$kid'
and v.assetid = va.id
and vb.assetid = va.id
order by v.purchasedate'
Run Code Online (Sandbox Code Playgroud) 如果我在 a 的WHERE两边重复子句中的过滤器,我会获得更高的性能OUTER JOIN吗?
要澄清使用代码:
select *
from #main_select
left outer join
(
select
main_id
,sum(aggregated) as agg
from #left_table
group by main_id
) as grouped
on #main_select.id=grouped.main_id
where #main_select.id = 1
--same reuslts
select *
from #main_select
left outer join
(
select
main_id
,sum(aggregated) as agg
from #left_table
where main_id=1 -- in this case I added where same as Left outer join
group by main_id
) as grouped
on #main_select.id=grouped.main_id
where #main_select.id = 1
Run Code Online (Sandbox Code Playgroud) 我已经阅读了几次以下代码,试图弄清楚它在做什么。
“右外连接是将右表中不匹配的行与左表中的匹配行一起返回。”
好的,但是"item_cnt"表中不存在该列,那么它作为别名使用的是哪一列?我正在为 1z0-047 做准备,所以任何帮助将不胜感激。
您执行了以下查询以显示PRODUCT_NAME产品的订购次数:
SELECT p.product_name, i.item_cnt
FROM (SELECT product_id, COUNT (*) item_cnt
FROM order_items
GROUP BY product_id) i RIGHT OUTER JOIN products p ON i.product_id = p.product_id;
Run Code Online (Sandbox Code Playgroud)
我认为该列应该存在。但这里是包含所有示例架构的 Oracle 文档页面。如果我用 ctrl+f for 搜索item_cnt,我什么也没找到:Oracle example schemas。
我有一份供应国家/地区名单的供应商名单。例如:
供应商 A 供应给:
以及另一份供应商及其供应商工厂清单 例如:
供应商 A 制造:
如何构建(供应商、国家、工厂)的所有可能组合的列表(按行)?我有超过 10.000 个供应商。例如,对于供应商 A:
有人可以帮我解决这个问题吗?我已经尝试使用 Excel 和 Access 进行了数周的研究。
这是我的问题的简化版本。我有这些表:
id - 姓名 - 姓氏 - 父亲的名字 - 母亲的名字
id - 名称
id - 姓氏
我想查询主表,但我想从其他表中获取姓名、父亲姓名和母亲姓名的 ID。我想要类似的东西;
SELECT
'id from names table that matches record name'
, 'id from surnames table that matches record surname'
, 'id from names table that matches record fathers name'
, 'id from names table that matches record mothers name'
FROM master_table
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何多次加入同一个表。
SQL Server 2008 R2,但在所有其他版本的 SQL Server 上也发现了可能的行为。
这似乎很明显,但对我来说,这似乎是一个错误。
以下查询给出了意想不到的结果,这是设置:
CREATE TABLE #Base (
Key1 int,
RefDate date
)
CREATE TABLE #JoinTable (
Key1 int,
RefDate date
)
INSERT INTO #Base
SELECT 1, '2012-05-05'
UNION
SELECT 2, '2013-06-06'
UNION
SELECT 3, '2014-07-07'
UNION
SELECT 4, '2015-08-08'
UNION
SELECT 5, '2016-09-09'
INSERT INTO #JoinTable
SELECT 4, '2012-05-05'
UNION
SELECT 5, '2013-06-06'
UNION
SELECT 6, '2014-07-07'
UNION
SELECT 7, '2015-08-08'
UNION
SELECT 8, '2016-09-09'
Run Code Online (Sandbox Code Playgroud)
以下查询按我的预期执行,返回仅出现在基表中的 3 行:
SELECT *
FROM #Base b
LEFT …Run Code Online (Sandbox Code Playgroud) 我们使用大量关联表来管理系统中各种不同对象之间的一对多关系。
为了说明这个问题,举两个例子:
users, events, ass_users_events. 在ass_users_events将只包含User_ID与Event_ID列,都与外键关系。projects, tasks, ass_projects_tasks. 在ass_projects_tasks将只包含Project_ID与Task_ID列,都与外键关系。NB1:每个对象表实际上都使用了一个自动递增整数主键和一个带有唯一索引的 UUID 列的组合,该索引是实际的记录 ID。出于这个问题的目的,我们仅使用 UUID,因此不会发生冲突。
NB2:我们使用这种格式而不是直接的外键列/索引的原因是实际情况比这个例子复杂得多,许多不同的表有许多不同的连接,我们不希望 ORM 做很多每次加载记录时进行不必要的工作。
问题是我们开始为系统中的几乎所有新对象类型为系统中的许多其他现有对象创建这些关联表,从长远来看,这似乎不可持续,我们最终会数百种关联类型。
我们正在考虑的一个潜在解决方案是摆脱所有当前的关联表,而是创建一个具有以下结构的表:obj_1_id, obj_1_type, obj_2_id, obj_2_type。每列都将被索引,可能作为复合索引(即INDEX object_1 (obj_1_type,obj_1_id)和INDEX object_2 (obj_2_type,obj_2_id))。
上面屁股表中的示例将变为:abc,user,123,event, 和def,project,456,task。
该解决方案使我们能够灵活地在不同对象之间构建任意数量的关系类型,并且 ass 表上有足够的索引以保持性能。我的问题是,仅在连接期间使用索引与在较小的表中定义外键关系相比是否存在缺点,但可能有数百个?
编辑: 我认为下面有一些误解,所以这可能会澄清一些事情:
我使用多态对象结构,但每个对象都存储在它自己的表中,即用户、产品、类别、事件等。
至于提议的 ass 表,它将只有 4 个功能字段,具有非常简单的数据类型(加上一个ai_col作为主要数据类型)。typecols的数据类型为 varchar(10),id 的数据类型为CHAR(32) / BINARY(16)。SELECT …
我对 JOIN 操作的语法有点好奇,特别是我们设置条件的 ON 子句。假设我们正在对现有表和我们刚刚创建为 JOIN 中的子查询的表执行连接,例如:
SELECT DISTINCT ssn, job, identifier, startdate, enddate, salary, ceasing
FROM oldcontracts
JOIN (SELECT DISTINCT name, identifier FROM jobs)
ON oldcontracts.job = jobs.name
;
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我们将如何设置一个有效的 ON 条件?我这样说是因为语法具有以下形式:
table1.column <condition> table2.column
Run Code Online (Sandbox Code Playgroud)
显然,SQL 2005 对我们从何处获取这些列非常严格。这意味着我在 jobs.name 上收到一个错误,说它不是一个有效的标识符。我假设 SQL 抛出这个错误是因为作业不是在操作中加入的表。
我知道解决这个问题的方法是简单地将作业设置为 table2 以在 JOIN 中使用,并根据需要调整 SELECT,然后一切都会工作,但我很想知道是否有办法解决一列一个子查询,假设该特定子查询是在 JOIN 操作中用作 table2 的那个?
我有一个查询问题。我有一个带有汽车及其规格的数据库,每个型号都有与该型号相关的不同汽车及其价格。我想创建一个查询,为我提供每个模型的最低和最高价格。
像这样:
+--------+----------+
| model | price |
+--------+----------+
| golf | 4000 |
| golf | 6000 |
| golf | 10000 |
| panda | 3000 |
| panda | 5000 |
| panda | 7000 |
+--------+----------+
Run Code Online (Sandbox Code Playgroud)
查询给了我这个:
+--------+----------+
| model | price |
+--------+----------+
| golf | 4000 |
| golf | 10000 |
| panda | 3000 |
| panda | 7000 |
+--------+----------+
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?
join ×10
sql-server ×3
mysql ×2
postgresql ×2
aggregate ×1
foreign-key ×1
functions ×1
group-by ×1
index ×1
innodb ×1
ms-access ×1
oracle ×1
performance ×1
syntax ×1