标签: database-performance

FAST_FORWARD游标何时会有一个工作表(这是否应该避免)?

背景

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

取

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

获取扫描

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

获取并填充

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

寻求

  1. SQL Server在选择一种方法而不是另一种方法时使用了什么标准?
  2. 我是否正确地认为第一种方法(没有额外的工作表填充步骤)更有效率?

(额外的问题:如果有人能够解释为什么第一个查询中的每个扫描都算作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)

sql sql-server cursor sql-server-2008 database-performance

31
推荐指数
2
解决办法
2766
查看次数

NULL值如何影响数据库搜索的性能?

在我们的产品中,我们有一个通用的搜索引擎,并试图优化搜索性能.查询中使用的许多表都允许空值.我们应该重新设计我们的表以禁止空值进行优化吗?

我们的产品上都运行OracleMS SQL Server.

sql database oracle database-performance query-performance

30
推荐指数
6
解决办法
5万
查看次数

exec sp_updatestats做什么?

有什么用sp_updatestats?我可以在生产环境中运行它以提高性能吗?

sql sql-server database-performance

29
推荐指数
1
解决办法
3万
查看次数

性能调优:为布尔列创建索引

我编写了一个守护进程处理器,它将从一个数据库中获取记录并将它们插入另一个数据库进行同步.它将根据每个记录指示标志获取记录,该标志是布尔数据类型.

我的表有数十万条记录.当我选择sync_done为false的记录时,是否会导致任何数据库性能问题?或者我应该为该sync_done列(布尔数据类型)应用索引,以提高性能,因为它将对sync_done值为false的记录应用select操作?

例如,假设我有10000条记录.其中,9500已经同步(sync_done为true),将仅选择记录的其余部分(sync_done为false).最终,9500条记录不会受到选择操作的影响.

请建议我如何继续.

postgresql indexing database-performance

28
推荐指数
2
解决办法
2万
查看次数

为什么spring/hibernate只读数据库事务比读写运行慢?

我一直在研究只读与读写数据库事务的性能.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交谈时做得更多.这是只读转储读写.

  1. 任何人都可以解释为什么只读通话需要更长的时间.这是预期的吗?

  2. 除了改善网络之外,还有什么我做错了或能做些什么来提高速度?刚刚发现了这篇很棒的帖子并提供了一些很好的性能建议.还有其他意见吗?

非常感谢.

java spring hibernate database-performance spring-transactions

28
推荐指数
1
解决办法
9023
查看次数

这个SQLite查询可以更快地进行吗?

我有一个表示安全摄像机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)

sqlite performance database-performance

26
推荐指数
1
解决办法
880
查看次数

在大型数据集上删除Postgres中的列

所以我有一个包含大型数据集的表,这个表有三列我想删除.
问题是:Postgres将如何处理它?

它会遍历每个条目还是只是更新映射信息而没有太多开销?ALTER TABLE在这种特殊情况下,我可以只使用或应该使用交换表吗?

并且,如果它有任何区别,则所有三列都具有固定长度(两个整数和一个数字).

如果已经有人问过我很抱歉,但谷歌找不到任何相关的问题/文章......

postgresql ddl database-design database-performance postgresql-9.2

24
推荐指数
2
解决办法
9224
查看次数

MySQL | REGEXP VS喜欢

我在我的数据库中有一个表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)

regex mysql database-performance

24
推荐指数
4
解决办法
2万
查看次数

在MongoDB中快速搜索数十亿个小文档的策略

我需要存储数十亿个小数据结构(每个大约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的索引速度产生重大影响吗?

search scalability mongodb database-performance pymongo

19
推荐指数
1
解决办法
9999
查看次数

MYSQL查询执行速度很慢

我开发了一个用户批量上传模块.有两种情况,当我在数据库没有记录时批量上传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)

php mysql sql yii database-performance

19
推荐指数
3
解决办法
3063
查看次数