我正在研究数据库,我正在研究关系数据库的一些局限性.
我得到大桌子的连接是非常昂贵的,但我不完全确定为什么.DBMS需要做什么才能执行连接操作,瓶颈在哪里?
非规范化如何帮助克服这种费用?其他优化技术(例如索引)如何帮助?
欢迎个人经历!如果您要发布资源链接,请避免使用Wikipedia.我知道在哪里找到它.
与此相关,我想知道云服务数据库(如BigTable和SimpleDB)使用的非规范化方法.看到这个问题.
database performance join denormalization relational-database
这更像是"为什么这样做的事情"这个问题,而不是"我不知道该怎么做"这个问题......
所以关于拉动你知道你将要使用的相关记录的福音就是使用,:include因为你将获得一个连接并避免一大堆额外的查询:
Post.all(:include => :comments)
Run Code Online (Sandbox Code Playgroud)
但是,当您查看日志时,没有发生加入:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Run Code Online (Sandbox Code Playgroud)
它正在采取一种捷径,因为它会立即提取所有注释,但它仍然不是连接(这是所有文档似乎都说的).我可以获得连接的唯一方法是使用:joins而不是:include:
Post.all(:joins => :comments)
Run Code Online (Sandbox Code Playgroud)
日志显示:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我有一个有六个关联的应用程序,在一个屏幕上我显示所有这些数据.似乎最好有一个加入查询而不是6个人.我知道在性能方面,进行连接而不是单个查询并不总是更好(事实上,如果你花费时间,看起来上面的两个单独的查询比连接更快),但是在所有文档之后我一直在阅读,我很惊讶地看到:include不像宣传的那样工作.
也许Rails的是认识到性能问题,并除非在某些情况下,不加入呢?
我想在一个视图中加入3个表; 这是情况:
我有一张表格,其中包含申请在大学校园内生活的学生的信息.我有另一张桌子,列出了每个学生的霍尔偏好(其中3个).但是这些首选项中的每一个仅仅是一个ID号,并且ID号在第三个表中具有相应的Hall Name(没有设计该数据库......).
差不多,我INNER JOIN在桌子上有他们的偏好和他们的信息,结果是......
John Doe | 923423 | Incoming Student | 005
Run Code Online (Sandbox Code Playgroud)
哪个005会是HallID.所以现在我想将它HallID与第三个表匹配,其中该表包含一个HallID和HallName.
所以,我希望我的结果像......
John Doe | 923423 | Incoming Student | Foley Hall <---(INSTEAD OF 005)
Run Code Online (Sandbox Code Playgroud)
这是我目前拥有的:
SELECT
s.StudentID, s.FName,
s.LName, s.Gender, s.BirthDate, s.Email,
r.HallPref1, r.HallPref2, r.HallPref3
FROM
dbo.StudentSignUp AS s
INNER JOIN RoomSignUp.dbo.Incoming_Applications_Current AS r
ON s.StudentID = r.StudentID
INNER JOIN HallData.dbo.Halls AS h
ON r.HallPref1 = h.HallID
Run Code Online (Sandbox Code Playgroud) 我想知道如何编写此查询.
我知道这个实际的语法是假的,但它会帮助你理解我想要的东西.我需要这种格式,因为它是一个更大的查询的一部分.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
Run Code Online (Sandbox Code Playgroud)
我需要在一个查询中返回所有内容.
此外,它需要在一行,所以以下将不起作用:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
Run Code Online (Sandbox Code Playgroud) LEFT| RIGHT| FULL)(INNER| OUTER)连接?merge?join?concat?update?谁?什么?为什么?!... 和更多.我已经看到了这些反复出现的问题,询问了pandas合并功能的各个方面.今天关于合并及其各种用例的大部分信息在几十个措辞严厉,不可搜索的帖子中都是分散的.这里的目的是为后代整理一些更重要的观点.
这个QnA应该是关于常见熊猫习语的一系列有用的用户指南的下一部分(参见关于转动的这篇文章,以及关于连接的这篇文章,我将在稍后介绍).
请注意,这篇文章并不是文档的替代品,所以请阅读它!一些例子来自那里.
假设我有一张顾客表和一张购买表.每次购买都属于一个客户.我想在一个SELECT语句中获取所有客户的列表以及他们上次购买的列表.什么是最佳做法?有关构建索引的建议吗?
请在答案中使用这些表/列名称:
在更复杂的情况下,通过将最后一次购买放入客户表中,是否(性能方面)有利于对数据库进行非规范化?
如果(购买)ID保证按日期排序,是否可以通过使用类似的方式简化语句LIMIT 1?
大多数SQL方言都接受以下查询:
SELECT a.foo, b.foo
FROM a, b
WHERE a.x = b.x
SELECT a.foo, b.foo
FROM a
LEFT JOIN b ON a.x = b.x
Run Code Online (Sandbox Code Playgroud)
现在很明显,当您需要外连接时,需要第二种语法.但是在进行内部连接时,为什么我更喜欢第二种语法(反之亦然)?
在MySQL中JOIN,ON和之间有什么区别USING()?据我所知,USING()只是更方便的语法,而ON当列名不相同时允许更多的灵活性.然而,这种差异是如此微小,你会认为他们只是消失了USING().
除此之外还有更多的东西吗?如果是,我应该在特定情况下使用哪个?
如何使用JOIN从一个表中选择所有列,从另一个表中选择一些列?在MySQL中.