我一直在为不同的公司工作,我注意到他们中的一些人更喜欢拥有将所有“亲戚”加入表格的视图。但是在应用程序中,有时我们只需要使用 1 列。
那么只进行简单的选择,然后将它们“加入”到系统代码中会更快吗?
该系统可以是 php、java、asp 或任何连接到数据库的语言。
所以问题是,从服务器端(php、java、asp、ruby、python...)到数据库并运行一个查询来获取我们需要的一切或从服务器端到数据库并运行哪个更快?一次只从一个表中获取列的查询?
使用 LEFT JOIN 或 NOT EXISTS 格式之间是否有最佳实践?
使用一个比另一个有什么好处?
如果没有,应该首选哪个?
SELECT *
FROM tableA A
LEFT JOIN tableB B
ON A.idx = B.idx
WHERE B.idx IS NULL
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM tableA A
WHERE NOT EXISTS
(SELECT idx FROM tableB B WHERE B.idx = A.idx)
Run Code Online (Sandbox Code Playgroud)
我在 Access 中对 SQL Server 数据库使用查询。
编辑Postgres 9.3
我正在处理具有以下架构的报告:http : //sqlfiddle.com/#!15/fd104/2
当前查询工作正常,如下所示:
基本上它是一个 3 表内连接。我没有做这个查询,而是离开它的开发人员,我想修改查询。如您所见,TotalApplication只计算基于a.agent_id. 您可以totalapplication在结果中看到该列。我想要的是删除它并将其更改totalapplication为新的两列。我想添加一个completedsurvey和partitalsurvey列。所以基本上这部分会变成
SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE a.created_at >= '2015-08-01' AND
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id
Run Code Online (Sandbox Code Playgroud)
我刚刚添加AND disposition = 'Completed Survey'但我需要另一列partialsurvey具有相同的查询,completedsurvey唯一的区别是
AND disposition = 'Partial Survey'
Run Code Online (Sandbox Code Playgroud)
和
COUNT(a.id) as PartialSurvey
Run Code Online (Sandbox Code Playgroud)
但我不知道该把查询放在哪里,也不知道查询会是什么样子。所以最终输出有这些列
agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph
Run Code Online (Sandbox Code Playgroud)
一旦确定,然后 applicationperhour …
我有一个用户定义的函数:
create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
-- blah blah
end
Run Code Online (Sandbox Code Playgroud)
现在我想在另一张桌子上加入这个,就像这样:
select f.ID, f.Desc, u.Field1, u.Field2
from Foo f
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1
Run Code Online (Sandbox Code Playgroud)
换句话说,所有的Foo记录,其中SomeCriterion1,我想看到的Foo ID和Desc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID。
这样做的语法是什么?
概念性问题:单个查询是否比连接更快,或者:我应该尝试将客户端所需的所有信息都压缩到一个SELECT 语句中,还是只使用看起来方便的尽可能多的信息?
TL;DR:如果我的联合查询比运行单个查询花费的时间更长,这是我的错还是可以预料的?
首先,我不是很精通数据库,所以可能只是我,但我注意到当我必须从多个表中获取信息时,通过对单个表的多个查询来获取这些信息“通常”更快(也许包含一个简单的内部连接)并在客户端将数据拼凑在一起,以尝试编写一个(复杂的)连接查询,我可以在一个查询中获取所有数据。
我试图把一个非常简单的例子放在一起:
架构设置:
CREATE TABLE MASTER
( ID INT NOT NULL
, NAME VARCHAR2(42 CHAR) NOT NULL
, CONSTRAINT PK_MASTER PRIMARY KEY (ID)
);
CREATE TABLE DATA
( ID INT NOT NULL
, MASTER_ID INT NOT NULL
, VALUE NUMBER
, CONSTRAINT PK_DATA PRIMARY KEY (ID)
, CONSTRAINT FK_DATA_MASTER FOREIGN KEY (MASTER_ID) REFERENCES MASTER (ID)
);
INSERT INTO MASTER values (1, 'One');
INSERT INTO MASTER values (2, 'Two');
INSERT …Run Code Online (Sandbox Code Playgroud) 我有两个具有相同名称、类型和索引键列的表。其中一个具有唯一的聚集索引,另一个具有非唯一的.
测试设置
设置脚本,包括一些真实的统计数据:
DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;
CREATE TABLE #left (
a char(4) NOT NULL,
b char(2) NOT NULL,
c varchar(13) NOT NULL,
d bit NOT NULL,
e char(4) NOT NULL,
f char(25) NULL,
g char(25) NOT NULL,
h char(25) NULL
--- and a few other columns
);
CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)
UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;
CREATE …Run Code Online (Sandbox Code Playgroud) join sql-server sql-server-2014 sort-operator sql-server-2017
我正在使用 SQL SERVER 2008 R2
我刚刚在 SQL 中遇到 APPLY 并且喜欢它如何解决如此多情况下的查询问题,
我使用 2 个左连接来获得结果的许多表,我能够获得 1 个外部应用。
我的本地数据库表中有少量数据,部署后代码应该在至少 20 倍大的数据上运行。
我担心对于大量数据,外部应用可能需要比 2 个左连接条件更长的时间,
谁能告诉我 apply 究竟是如何工作的,以及它如何影响非常大数据的性能,如果可能的话,每个表的大小有一些比例关系,比如与 n1^1 或 n1^2 成比例......其中 n1 是表中的行数1.
这是带有 2 个左连接的查询
select EC.*,DPD.* from Table1 eC left join
(
select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
group by member_id,parent_gid,child_gid,LOB,group_gid
) DPD2 on DPD2.parent_gid = Ec.parent_gid
AND DPD2.child_gid = EC.child_gid
AND DPD2.member_id = EC.member_id
AND DPD2.LOB = EC.default_lob
AND DPD2.group_gid = EC.group_gid
left join
Table2 dpd on dpd.parent_gid = dpd2.parent_gid
and …Run Code Online (Sandbox Code Playgroud) 背景
我想提供重现select查询所需的数据库子集。我的目标是使我的计算工作流程可重复(如可重复研究)。
题
有没有办法可以将这个 select 语句合并到一个脚本中,该脚本将查询的数据转储到一个新数据库中,这样数据库就可以安装在新的 mysql 服务器上,并且该语句可以与新数据库一起使用。除了查询中已使用的记录外,新数据库不应包含其他记录。
更新: 为了澄清起见,我对查询结果的 csv 转储不感兴趣。我需要能够做的是转储数据库子集,以便它可以安装在另一台机器上,然后查询本身可以重现(并且可以针对相同的数据集进行修改)。
例子
例如,我的分析可能会查询需要来自多个(在本例中为 3 个)表中的记录的数据子集:
select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
Run Code Online (Sandbox Code Playgroud) 我注意到查询子句中的USING构造(而不是ON)可能会在某些情况下引入优化障碍。FROMSELECT
我的意思是这个关键词:
选择 * 从一个 加入 b使用(a_id)
只是在更复杂的情况下。
上下文:this comment to this question。
我用这个了很多,从来没有发现过这么远。我会对展示效果的测试用例或任何指向更多信息的链接非常感兴趣。我的搜索努力是空的。
完美的答案将是一个测试用例,USING (a_id)与替代 join 子句相比,它的性能较差ON a.a_id = b.a_id——如果这真的可以发生的话。
我是 SQL 新手,想知道这两种JOIN类型有什么区别?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用其中一种?
join ×10
sql-server ×4
performance ×3
postgresql ×3
mysql ×2
select ×2
backup ×1
count ×1
cross-apply ×1
exists ×1
functions ×1
mysqldump ×1
optimization ×1
syntax ×1
tuning ×1