我重构了一个从另一家公司继承的应用程序的缓慢部分,以使用内部连接而不是子查询
WHERE id IN (SELECT id FROM ...)
Run Code Online (Sandbox Code Playgroud)
重构的查询运行速度提高了约100倍.(约50秒到约0.3)我预计会有所改善,但任何人都可以解释为什么它如此激烈?where子句中使用的列都已编入索引.SQL是否每行执行一次where子句中的查询?
更新 - 解释结果:
不同之处在于"where in in()"查询的第二部分 -
2 DEPENDENT SUBQUERY submission_tags ref st_tag_id st_tag_id 4 const 2966 Using where
Run Code Online (Sandbox Code Playgroud)
vs 1带连接的索引行:
SIMPLE s eq_ref PRIMARY PRIMARY 4 newsladder_production.st.submission_id 1 Using index
Run Code Online (Sandbox Code Playgroud) 我前几天正在考虑规范化,而且我想到了,我想不出一个数据库中应该有1:1关系的时间.
名称:SSN?我将它们放在同一个表PersonID:AddressID?同样,同桌.
我可以提出一个很多或者很多的例子:很多(有适当的中间表),但从不是1:1.
我错过了一些明显的东西吗
最近NoSQL获得了极大的欢迎.
NoSQL相对于传统RDBMS有哪些优势?
当我想在SHA数据库中存储SHA1哈希的结果时,我遇到了一个简单的问题:
VARCHAR字段应该在多长时间内存储哈希的结果?
我和一些同事讨论了存储历史数据的最佳方法.目前,对于某些系统,我使用单独的表来存储历史数据,并保留当前活动记录的原始表.所以,假设我有桌子FOO.在我的系统下,所有活动记录将进入FOO,所有历史记录将进入FOO_Hist.FOO中的许多不同字段可以由用户更新,因此我希望保持对更新的所有内容的准确帐户.除了自动递增的HIST_ID之外,FOO_Hist保存与FOO完全相同的字段.每次更新FOO时,我都会在FOO_Hist中执行一个插入语句,类似于:insert into FOO_HIST select * from FOO where id = @id.
我的同事说这是糟糕的设计,因为出于历史原因我不应该有一个表的精确副本,而应该只是在活动表中插入另一条记录,并带有一个标志,表明它是出于历史目的.
是否有处理历史数据存储的标准?在我看来,我不想把我的所有历史记录都放在同一个表格中,因为它可能超过一百万条记录(我在考虑长期).
你或你的公司如何处理这个问题?
我正在使用MS SQL Server 2008,但我想保持任何DBMS的通用和任意的答案.
如果我在数据库中有两个关系,如下所示:
CREATE TABLE Courses (
CourseID int NOT NULL PRIMARY KEY,
Course VARCHAR(63) NOT NULL UNIQUE,
Code CHAR(4) NOT NULL UNIQUE
);
CREATE TABLE BookCourses (
EntryID int NOT NULL PRIMARY KEY,
BookID int NOT NULL,
Course CHAR(4) NOT NULL,
CourseNum CHAR(3) NOT NULL,
CourseSec CHAR(1) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我建立了两者之间的外键关系,如下所示:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
然后,你可以看到,Course在属性BookCourses关系引用Code属性的Courses关系.
我的问题是当两个关系中的任何一个发生删除时,删除级联的方式是什么?如果我删除Courses关系中的元组,它会删除关系中的所有引用元组BookCourses,还是反过来?
感谢您的时间.
在数据库中实现可自定义(意味着具有未知级别的树结构)树数据结构的最佳方法是什么?
在使用带有外键的表之前,我已经完成了这一次.
你能看到其他什么实现,这种实现是否有意义?
在SQL Server中设置外键时,在什么情况下应该在删除或更新时级联它,背后的原因是什么?
这可能也适用于其他数据库.
我最关注每个场景的具体例子,最好是那些成功使用它们的人.
每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.
这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:
我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.
我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:
我知道的方法是:
1.为创建和修改的日期和用户添加列
表格示例:
主要缺点:我们失去了修改的历史.提交后无法回滚.
2.仅插入表格
表格示例:
主要缺点:如何保持外键最新?需要巨大的空间
3.为每个表创建单独的历史记录表
历史表示例:
主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.
4.为所有表创建合并历史记录表
历史表示例:
主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.
ORACLE不允许在包含主键的任何列中使用NULL值.似乎大多数其他"企业级"系统也是如此.
同时,大多数系统还允许可空列的唯一约束.
为什么唯一约束可以有NULL但主键不能?这有一个基本的逻辑原因,还是更多的技术限制?
database-design ×10
sql ×4
database ×3
cascade ×2
mysql ×2
rdbms ×2
audit ×1
foreign-keys ×1
hash ×1
join ×1
logging ×1
nosql ×1
one-to-one ×1
performance ×1
relation ×1
sha1 ×1
sql-server ×1
tree ×1