标签: database-performance

PostgreSQL:为什么这个简单的查询不使用索引?

我有一个带有列c的表t,它是一个int并且在其上有一个btree索引.

为什么以下查询不使用此索引?

explain select c from t group by c;
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

HashAggregate  (cost=1005817.55..1005817.71 rows=16 width=4)
  ->  Seq Scan on t  (cost=0.00..946059.84 rows=23903084 width=4)
Run Code Online (Sandbox Code Playgroud)

我对索引的理解是有限的,但我认为这些查询是索引的目的.

database postgresql relational-database database-performance

9
推荐指数
2
解决办法
3252
查看次数

ActiveRecord查询比直接SQL慢得多?

我一直在努力优化我的项目的数据库调用,我注意到下面两个相同调用之间的性能"显着"差异:

connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
  "SELECT SUM(my_column)
   FROM table
   WHERE id = #{id} 
   AND created_at BETWEEN '#{lower}' and '#{upper}'")
Run Code Online (Sandbox Code Playgroud)

和第二个版本:

sum = Table.
      where(:id => id, :created_at => lower..upper).
      sum(:my_column)
Run Code Online (Sandbox Code Playgroud)

使用第一个版本的方法平均需要300毫秒才能执行(该操作在其中总共被称为几千次),而使用第二个版本的方法需要大约550毫秒.这几乎是速度下降100%.

我仔细检查了第二个版本生成的SQL,它与第一个版本的第一个相同,但是它使用表名添加表列.

  • 为什么减速?ActiveRecord和SQL之间的转换是否真的使得操作几乎耗费了2倍?
  • 如果我需要执行相同的操作很多次并且我不想达到开销,我是否需要坚持直接编写SQL(甚至可能是sproc)?

谢谢!

postgresql ruby-on-rails database-performance ruby-on-rails-3

9
推荐指数
1
解决办法
4521
查看次数

使用"FileSort"的Mysql Order by子句

我有一个表格结构

comment_id primary key
comment_content 
comment_author
comment_author_url
Run Code Online (Sandbox Code Playgroud)

当我点火查询时

explain SELECT * FROM comments  ORDER BY comment_id
Run Code Online (Sandbox Code Playgroud)

它将结果输出为

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  comments    ALL     NULL    NULL    NULL    NULL    22563   Using filesort
Run Code Online (Sandbox Code Playgroud)

为什么无法找到我定义为主键的索引?

mysql indexing explain database-performance

9
推荐指数
2
解决办法
8543
查看次数

由于派生表,实体框架很慢

我使用MySQL Connector/Net 6.5.4与LINQ实体,我经常得到糟糕的查询性能,因为实体框架生成使用派生表的查询.

这是我多次遇到的简化示例.在C#中,我写了一个这样的查询:

var culverCustomers = from cs in db.CustomerSummaries where cs.Street == "Culver" select cs;
// later...
var sortedCustomers = culverCustomers.OrderBy(cs => cs.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

而不是像这样生成简单的查询:

SELECT cust.id FROM customer_summary cust WHERE cust.street = "Culver" ORDER BY cust.name
Run Code Online (Sandbox Code Playgroud)

实体框架使用派生表生成一个查询,如下所示:

SELECT Project1.id FROM (
    SELECT cust.id, cust.name, cust.street FROM customer_summary cust
    WHERE Project1.street = "Culver"
) AS Project1 -- here is where the EF generates a pointless derived table
ORDER BY Project1.name
Run Code Online (Sandbox Code Playgroud)

如果我解释两个查询,我得到第一个查询:

id, select_type, table, type, possible_keys, rows
1,  PRIMARY, …
Run Code Online (Sandbox Code Playgroud)

c# mysql linq-to-entities entity-framework database-performance

9
推荐指数
1
解决办法
1883
查看次数

Django - 有效地批量创建继承的模型

Python 2.7.9 Django 1.7 MySQL 5.6

我想填充属于多个类的一大堆对象实例,将它们堆叠成一个类似create()的查询,打开数据库连接,执行查询,然后关闭.我的主要动机是性能,但代码紧凑性也是一个优点.

功能bulk_create()似乎正是我想要的,但我违反了至少一个这里列出的警告,即

它不适用于多对多关系.

它不适用于多表继承方案中的子模型.

这些限制也在源代码中描述:

# So this case is fun. When you bulk insert you don't get the primary
# keys back (if it's an autoincrement), so you can't insert into the
# child tables which references this. There are two workarounds, 1)
# this could be implemented if you didn't have an autoincrement pk,
# and 2) you could do it by doing …
Run Code Online (Sandbox Code Playgroud)

mysql inheritance django-models database-performance python-2.7

9
推荐指数
1
解决办法
2220
查看次数

追随者 - mongodb数据库设计

所以我正在使用mongodb,我不确定我是否已经为我正在尝试做的事情获得了正确/最佳的数据库集合设计.

可以有许多项目,用户可以创建包含这些项目的新组.任何用户都可以关注任何组!

在此输入图像描述

我没有将关注者和项目添加到组集合中,因为组中可能有5个项目,或者可能有10000个(对于关注者来说相同),并且从研究中我认为您不应该使用未绑定的数组(其中由于尺寸扩大而必须移动文档时由于性能问题而导致限制未知.(在遇到性能问题之前,是否有建议的阵列长度最大值?)

我认为使用以下设计时,真正的性能问题可能是当我想要获取用户为特定项目关注的所有组(基于user_id和item_id)时,因为我必须找到所有组用户正在关注,并从中查找具有group_id $ in和项ID的所有item_group.(但我实际上看不到任何其他方式这样做)

Follower
.find({ user_id: "54c93d61596b62c316134d2e" })
.exec(function (err, following) {
  if (err) {throw err;};

  var groups = [];

  for(var i = 0; i<following.length; i++) {
    groups.push(following[i].group_id)
  }

  item_groups.find({
  'group_id': { $in: groups },
  'item_id': '54ca9a2a6508ff7c9ecd7810'
  })
  .exec(function (err, groups) {
    if (err) {throw err;};

    res.json(groups);

  });

})
Run Code Online (Sandbox Code Playgroud)

是否有更好的DB模式来处理这种类型的设置?

更新:在下面的评论中添加了示例用例.

任何帮助/建议将非常感谢.

非常感谢,Mac

javascript database-design mongodb database-performance database-schema

9
推荐指数
1
解决办法
4703
查看次数

SQL Server 2014上的DECRYPTBYKEY比SQL Server 2012慢

几年来,我们一直在某些SQL Server 2012实例上使用对称密钥进行加密/解密.我们最近安装了一些SQL Server 2014的新实例,并遇到了解密SQL Server 2014安装数据的一些性能问题.

考虑一个看起来像这样的表:

CREATE TABLE [dbo].[tblCertTest](
[article_id_enc] [varbinary](100) NOT NULL,
[article_id] [int] NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

和键和证书创建如下:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Passwrrrrd12'

CREATE CERTIFICATE MyCertificateName
WITH SUBJECT = 'A label for this certificate'

CREATE SYMMETRIC KEY MySymmetricKeyName WITH
IDENTITY_VALUE = 'a fairly secure name',
ALGORITHM = AES_256,
KEY_SOURCE = 'a very secure strong password or phrase'
ENCRYPTION BY CERTIFICATE MyCertificateName;
Run Code Online (Sandbox Code Playgroud)

我们的数据集大约有90000行,article_id是一个5位数字.稍微简化一下,article_id_enc使用以下命令加密:

update tblCertTest set article_id_enc = ENCRYPTBYKEY(KEY_GUID('MySymmetricKeyName'),convert(varbinary(100), article_id))
Run Code Online (Sandbox Code Playgroud)

我们已经应用了所有可用的修补程序,我们尝试了不同的SQL Server 2012和SQL Server …

sql-server encryption database-performance sql-server-2012 sql-server-2014

9
推荐指数
1
解决办法
1420
查看次数

更改SQL Server中的非聚簇索引以添加更多包含的列

是否可以更改现有的非聚集索引以包含更多列作为Covered列的一部分.

例如

ALTER INDEX IX_NC_TableName_ColumnName
FOR TableName(ColumnName)
INCLUDE(Col1, Col2, Col3)
Run Code Online (Sandbox Code Playgroud)

想要包含Col4在上面的索引中.

添加此列会有什么影响?会有碎片还是其他什么?

sql-server indexing database-performance

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

SQL Server查询优化 - 简单查询中的意外缓慢

可能的解释在评论中

在SQL Server 2014企业版(64位)中 - 我试图从视图中读取.标准查询只包含一个ORDER BY和这样的OFFSET-FETCH子句.

方法1

SELECT

    *

FROM Metadata
ORDER BY
    AgeInHours      ASC, 
    RankingPoint    DESC, 
    PublishDate     DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

但是,这个相当简单的查询比以下返回相同结果的查询执行快9倍(在跳过大量行(如150k)时显而易见).

在这种情况下,我首先读取主键,然后将其用作WHERE...IN函数的参数

方法2

SELECT 
    * 
FROM Metadata
WHERE NewsId IN (
    SELECT

        NewsId

    FROM Metadata
    ORDER BY
        AgeInHours      ASC, 
        RankingPoint    DESC, 
        PublishDate     DESC
    OFFSET 150000 ROWS
    FETCH NEXT 40 ROWS ONLY
)
ORDER BY
    AgeInHours      ASC, 
    RankingPoint    DESC, 
    PublishDate     DESC
Run Code Online (Sandbox Code Playgroud)

这两个基准标记显示了这种差异

(40 row(s) …
Run Code Online (Sandbox Code Playgroud)

sql sql-server database-performance query-performance sql-server-2014

9
推荐指数
1
解决办法
418
查看次数

Laravel API的mysql查询未在performance_schema.events_statements_summary_by_digest中被跟踪

我在这里面临一些非常奇怪的问题.我们在AWS EC2上托管了一个laravel API,我们使用RDS(mysql 5.6).我最近在RDS上启用了performance_schema.以下是我注意到的行为

  1. 我们的RDS实例上有两个数据库.一个用于wordpress,一个用于我们的laravel API.Wordpress数据库查询正在逐渐消化.但是从我们的laravel应用程序运行的查询不是.
  2. 出于某种原因,当我将MySql Workbench连接到RDS实例并在我们的Laravel数据库上执行查询时,它们会在语句摘要中出现.
  3. 我登录到我的EC2机器,在RDS上连接到MySQL并执行一些查询,并在语句摘要中跟踪它们.

所以看起来只有当我们的Laravel应用程序执行查询时,它们才会被跟踪.

我们的Laravel版本是4.2.我试图找出最近两天的原因,任何帮助都将是一种解脱.

我在上述所有步骤中使用的用户都是相同的,并且拥有所有数据库的所有权限.

- 编辑 -

我进行了许多其他测试,他们都只指出了一个与Laravel有关的结论.我在托管laravel的同一台服务器上创建了一个简单的php文件.在此文件中,我使用相同的用户/密码连接到相同的实例/数据库.我在这个文件中所做的只是在$ pdo上运行一个非常简单的查询.

$stmt = $pdo->query('SELECT name FROM trades');
        while ($row = $stmt->fetch())
        {
            echo $row['name'] . "\n";
        }
Run Code Online (Sandbox Code Playgroud)

它出现在查询分析[ https://prnt.sc/j3ochd]中(我手动检查了performance_schema.events_statements_summary_by_digest)

但是我可以点击我们的laravel api,它实际上返回了交易表本身的条目(非常类似于我上面运行的查询).但这会出现在我的查询分析报告(Percona PMM)或events_statements_summary_by_digest中

mysql database-performance amazon-rds laravel laravel-4

9
推荐指数
1
解决办法
167
查看次数