我注意到在尝试运行总查询时,有时估计的计划只显示"获取查询"

并且实际计划显示了聚集索引扫描的重复提取

在其他场合(例如,当向TOP查询添加a时),估计的计划显示填充工作表的"人口查询"阶段

实际计划显示聚集索引扫描以填充工作表,然后重复搜索该工作表.

(额外的问题:如果有人能够解释为什么第一个查询中的每个扫描都算作2个逻辑读取,这可能也很有启发性)
我在这里找到了这篇文章,它解释了FAST_FORWARD游标可以使用动态计划或静态计划.在这种情况下,第一个查询似乎是使用动态计划,第二个查询是静态计划.
我也发现,如果我尝试
SET @C2 = CURSOR DYNAMIC TYPE_WARNING FOR SELECT TOP ...
Run Code Online (Sandbox Code Playgroud)
光标被隐式转换为keyset游标,因此很明显TOP动态游标不支持该构造,也许是出于Ruben的答案的原因 - 仍在寻找对此的明确解释.
但是我还读到,动态游标往往比它们的静态对应物(源1,源2)慢,这似乎让我感到惊讶,因为静态变种必须读取源数据,复制它,然后读取副本而不仅仅是读取源数据.我前面提到的文章提到了动态游标的使用.谁能解释一下这些是什么?它只是一个RID或CI键,还是不同的东西?markers
SET STATISTICS IO OFF
CREATE TABLE #T ( ord INT IDENTITY PRIMARY KEY, total INT, Filler char(8000))
INSERT INTO #T (total) VALUES (37),(80),(55),(31),(53)
DECLARE @running_total INT,
@ord INT,
@total …Run Code Online (Sandbox Code Playgroud) 在我们的产品中,我们有一个通用的搜索引擎,并试图优化搜索性能.查询中使用的许多表都允许空值.我们应该重新设计我们的表以禁止空值进行优化吗?
我们的产品上都运行Oracle和MS SQL Server.
有什么用sp_updatestats?我可以在生产环境中运行它以提高性能吗?
我编写了一个守护进程处理器,它将从一个数据库中获取记录并将它们插入另一个数据库进行同步.它将根据每个记录指示标志获取记录,该标志是布尔数据类型.
我的表有数十万条记录.当我选择sync_done为false的记录时,是否会导致任何数据库性能问题?或者我应该为该sync_done列(布尔数据类型)应用索引,以提高性能,因为它将对sync_done值为false的记录应用select操作?
例如,假设我有10000条记录.其中,9500已经同步(sync_done为true),将仅选择记录的其余部分(sync_done为false).最终,9500条记录不会受到选择操作的影响.
请建议我如何继续.
我一直在研究只读与读写数据库事务的性能.MySQL服务器是远程的,因此我很容易看到不同事务类型之间的差异.这是连接池,我知道它基于比较第一次和第二次JDBC调用.
当我将Spring AOP配置为在我的DAO调用上使用只读事务时,与读写相比,调用速度慢 30-40%:
<!-- slower -->
<tx:method name="find*" read-only="true" propagation="REQUIRED" />
...
// slower
@Transaction(readOnly = true)
Run Code Online (Sandbox Code Playgroud)
要么
<!-- faster -->
<tx:method name="find*" read-only="false" propagation="REQUIRED" />
...
// faster
@Transaction
Run Code Online (Sandbox Code Playgroud)
与:
<!-- slower -->
<tx:method name="find*" read-only="true" propagation="REQUIRED" />
...
// slower
@Transaction(readOnly = true)
Run Code Online (Sandbox Code Playgroud)
要么
<!-- faster -->
<tx:method name="find*" read-only="false" propagation="REQUIRED" />
...
// faster
@Transaction
Run Code Online (Sandbox Code Playgroud)
看看tcpdump,似乎只读事务在与MySQL交谈时做得更多.这是只读转储与读写.
任何人都可以解释为什么只读通话需要更长的时间.这是预期的吗?
除了改善网络之外,还有什么我做错了或能做些什么来提高速度?刚刚发现了这篇很棒的帖子并提供了一些很好的性能建议.还有其他意见吗?
非常感谢.
java spring hibernate database-performance spring-transactions
我有一个表示安全摄像机NVR元数据的数据库.recording每1分钟的视频片段有一个26字节的行.(如果你很好奇,一个设计文档正在进行这里.)我的设计限制是8个摄像头,1年(约4万行,半一万元左右的相机).我已经伪造了一些数据来测试性能.此查询比我预期的要慢:
select
recording.start_time_90k,
recording.duration_90k,
recording.video_samples,
recording.sample_file_bytes,
recording.video_sample_entry_id
from
recording
where
camera_id = ?
order by
recording.start_time_90k;
Run Code Online (Sandbox Code Playgroud)
这只是扫描相机的所有数据,使用索引过滤掉其他相机和订购.索引看起来像这样:
create index recording_camera_start on recording (camera_id, start_time_90k);
Run Code Online (Sandbox Code Playgroud)
explain query plan 看起来像预期:
0|0|0|SEARCH TABLE recording USING INDEX recording_camera_start (camera_id=?)
Run Code Online (Sandbox Code Playgroud)
行很小.
$ sqlite3_analyzer duplicated.db
...
*** Table RECORDING w/o any indices *******************************************
Percentage of total database...................... 66.3%
Number of entries................................. 4225560
Bytes of storage consumed......................... 143418368
Bytes of payload.................................. 109333605 76.2%
B-tree depth...................................... 4
Average payload per entry......................... 25.87
Average unused …Run Code Online (Sandbox Code Playgroud) 所以我有一个包含大型数据集的表,这个表有三列我想删除.
问题是:Postgres将如何处理它?
它会遍历每个条目还是只是更新映射信息而没有太多开销?ALTER TABLE在这种特殊情况下,我可以只使用或应该使用交换表吗?
并且,如果它有任何区别,则所有三列都具有固定长度(两个整数和一个数字).
如果已经有人问过我很抱歉,但谷歌找不到任何相关的问题/文章......
postgresql ddl database-design database-performance postgresql-9.2
我在我的数据库中有一个表CANDIDATE在MySQL 5.5下运行,我试图从第一个名称中包含RAM的表中获取行,所以我可以运行以下两个查询,但我想现在我们应该使用哪个查询关于优化的长期.
SELECT * FROM CANDIDATE c WHERE firstname REGEXP 'ram';
SELECT * FROM CANDIDATE c WHERE firstname LIKE'%ram%';
Run Code Online (Sandbox Code Playgroud) 我需要存储数十亿个小数据结构(每个大约200个字节).到目前为止,将每个元素存储为单独的文档运行良好,Mongo每秒提供大约10,000个结果.我使用20字节哈希作为每个文档的_id,以及_id字段上的单个索引.在测试中,这适用于具有5,000,000个文档的数据集.
在操作中,我们将每秒发出大约10,000个请求,每秒更新现有文档大约1,000次,并且每秒插入新文档可能大约100次或更少.
当我们无法在RAM中存储整个索引时,我们如何管理更大的数据集?如果我们将几个元素组合到每个文档中,MongoDB会表现得更好 - 为了更快地搜索索引,但每个查询中返回的数据更多?
与SO上的其他问题不同,我不仅对我们可以填充到Mongo的数据感兴趣.它可以清楚地管理我们正在查看的数据量.我担心的是find,考虑到RAM的限制,我们如何才能最大限度地提高大型集合的操作速度.
我们的搜索将倾向于聚集; 大约50,000个元素将满足约50%的查询,但剩余的50%将随机分布在所有数据中.我们可以通过将这些50%移动到他们自己的集合中来获得性能提升,以便将最常用数据的较小索引保持在ram中吗?
将_id字段的大小从20字节减小到8字节会对MnogoDB的索引速度产生重大影响吗?
我开发了一个用户批量上传模块.有两种情况,当我在数据库没有记录时批量上传20 000条记录.它需要大约5个小时.但是当数据库已经有大约30 000条记录时,上传速度非常慢.上传20 000条记录大约需要11个小时.我只是通过fgetcsv方法读取CSV文件.
if (($handle = fopen($filePath, "r")) !== FALSE) {
while (($peopleData = fgetcsv($handle, 10240, ",")) !== FALSE) {
if (count($peopleData) == $fieldsCount) {
//inside i check if user already exist (firstName & lastName & DOB)
//if not, i check if email exist. if exist, update the records.
//other wise insert a new record.
}}}
Run Code Online (Sandbox Code Playgroud)
以下是运行的查询.(我正在使用Yii框架)
SELECT *
FROM `AdvanceBulkInsert` `t`
WHERE renameSource='24851_bulk_people_2016-02-25_LE CARVALHO 1.zip.csv'
LIMIT 1
SELECT cf.*, ctyp.typeName, cfv.id as customId, cfv.customFieldId,
cfv.relatedId, cfv.fieldValue, …Run Code Online (Sandbox Code Playgroud)