当您知道将使用对象关系映射器 (ORM)维基百科访问数据库时,需要注意哪些数据库设计问题?另请参阅实体框架 NHibernate 或 LLBLGenPro。
例如,我将注意 SqlServer 的 RPC 调用的 2100 参数限制。当使用 LLBLgen 并在使用复合主键时连接表时,这是一个问题,请参阅复合键的 MSDN 文章。
我们一直在研究将 SSD 与 Oracle 结合使用,以加快我们的测试迁移运行。目前完成迁移运行需要 12-18 小时,具体取决于数据量(我们显然也在进行大量性能调整)。我们有许多廉价的 linux 机器,用于各种运行和分析。
直接从戴尔购买 SSD 的成本高得令人望而却步。我想知道是否有人有使用消费级固态硬盘(例如 Crucial/Micron 固态硬盘)的经验。
我意识到 TRIM 支持在 Linux(使用 Centos)上会是一个问题。有没有人在 Windows 7 上使用过它们来解决这个问题?
搜索VARCHAR2Oracle 中列的大小是否会影响性能的报告似乎不一。
我想VARCHAR稍微解释一下大小的问题,并希望对此有所了解:
给定(多行)自由文本字段(不是名称之类的简短内容)要存储在(Oracle)数据库中,是否有任何意义(性能或其他)不最大化VARCHAR容量(VARCHAR2(4000)在 Oracle 上)而是选择较小的值,例如 1024 或 512,因为无论如何这在 98% 的情况下可能就足够了。
这是我要找的:
如果您使用过该工具,我会对您发现的利弊感兴趣。我可以列出一个列表,但实际使用该工具的洞察力更有价值。
是否有一个需要 > 2 秒的简单查询,以便我可以测试慢查询记录器?
我正在寻找类似通用递归或迭代语句的东西。
我最近看到了“where 1=1 statement”这个问题;为了编写更清晰的代码(从宿主语言的角度),我在构建动态 SQL 时经常使用的 SQL 构造。
一般来说,添加到 SQL 语句中是否会对查询性能产生负面影响?我不是在寻找关于特定数据库系统的答案(因为我已经在 DB2、SQL Server、MS-Access 和 mysql 中使用过它)——除非在不了解细节的情况下不可能回答。
对于具有标识列的表,是否应该为标识列创建聚集或非聚集 PK/唯一索引?
原因是将为查询创建其他索引。使用非聚集索引(在堆上)并返回索引未涵盖的列的查询将使用较少的逻辑 I/O (LIO),因为没有额外的聚集索引 b 树查找步骤?
create table T (
Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table)
A .... -- A, B, C have mixed data type of int, date, varchar, float, money, ....
B ....
C ....
....)
create index ix_A on T (A)
create index ix_..... -- Many indexes can be created for queries
-- Common query is query on A, B, C, ....
select A, …Run Code Online (Sandbox Code Playgroud) performance sql-server database-internals index-tuning heap performance-tuning
由于各种原因,从日志记录到延迟关联,我已经在我的系统中使用 UUID 有一段时间了。当我变得不那么天真时,我使用的格式发生了变化:
VARCHAR(255)VARCHAR(36)CHAR(36)BINARY(16)当我到达最后一个时BINARY(16),我开始将性能与基本的自动增量整数进行比较。测试和结果如下所示,但如果你只是想总结,表示INT AUTOINCREMENT和BINARY(16) RANDOM对数据相同的性能范围高达20万(该数据库已预先填充之前测试)。
我最初对使用 UUID 作为主键持怀疑态度,事实上我仍然如此,但是我看到这里有潜力创建一个可以同时使用两者的灵活数据库。尽管许多人强调两者的优点,但使用这两种数据类型抵消了哪些缺点?
PRIMARY INTUNIQUE BINARY(16)此类设置的用例将是表间关系的传统主键,唯一标识符用于系统间关系。
我本质上试图发现的是两种方法之间的效率差异。除了使用的四倍磁盘空间(在添加额外数据后可能在很大程度上可以忽略不计)之外,在我看来它们是相同的。
架构:
-- phpMyAdmin SQL Dump
-- version 4.0.10deb1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Sep 22, 2015 at 10:54 AM
-- Server version: 5.5.44-0ubuntu0.14.04.1
-- PHP Version: 5.5.29-1+deb.sury.org~trusty+3
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 …Run Code Online (Sandbox Code Playgroud) 在 2015 年的 re:Invent 演讲中,AWS 提到真空不仅应该在更新或删除之后运行,而且还应该在插入之后运行。这是谈话的相关部分:
http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s
据说即使块只收到插入,也必须对块进行一些清理,并且可以在第一次选择块时(减慢读取速度)或在真空期间进行清理。这是真的吗?如果是这样,究竟必须进行哪些清理工作?
我有一个相当大的表,其中一列是 XML 数据,XML 条目的平均大小约为 15 KB。所有其他列都是常规整数、大整数、GUID 等。为了获得一些具体数字,假设该表有一百万行,大小约为 15 GB。
我注意到的是,如果我想选择所有列,这个表选择数据的速度真的很慢。当我做
SELECT TOP 1000 * FROM TABLE
Run Code Online (Sandbox Code Playgroud)
从磁盘读取数据大约需要 20-25 秒 - 即使我没有对结果强加任何排序。我使用冷缓存(即 after DBCC DROPCLEANBUFFERS)运行查询。IO统计结果如下:
扫描计数 1,逻辑读 364,物理读 24,预读 7191,lob 逻辑读 7924,lob 物理读 1690,lob 预读 3968。
它抓取了大约 15 MB 的数据。执行计划如我所料显示聚集索引扫描。
除了我的查询外,磁盘上没有任何 IO;我还检查了聚集索引碎片是否接近 0%。这是一个消费级 SATA 驱动器,但我仍然认为 SQL Server 能够以比 ~100-150 MB/min 更快的速度扫描表。
XML 字段的存在导致大部分表数据位于 LOB_DATA 页上(实际上约 90% 的表页是 LOB_DATA)。
我想我的问题是 - 我认为 LOB_DATA 页面会导致扫描缓慢不仅是因为它们的大小,还因为当表中有很多 LOB_DATA 页面时,SQL Server 无法有效扫描聚集索引,我是否正确?
更广泛地说 - 拥有这样的表结构/数据模式是否合理?使用 Filestream 的建议通常说明更大的字段大小,所以我真的不想走那条路。我还没有真正找到关于这个特定场景的任何好的信息。
我一直在考虑 XML 压缩,但它需要在客户端或使用 SQLCLR 完成,并且需要在系统中实现相当多的工作。
我尝试了压缩,因为 XML 是高度冗余的,所以我可以(在 …
performance ×10
oracle ×3
mysql ×2
sql-server ×2
blob ×1
heap ×1
index-tuning ×1
optimization ×1
oracle-se ×1
orm ×1
postgresql ×1
slow-log ×1
vacuum ×1
varchar ×1
xml ×1