标签: database-performance

如何让MS SQL Server透明地使用CHECKSUM /哈希索引?

看起来SQL Server不会自动使用CHECKSUM /哈希索引,除非CHECKSUM列明确包含在查询的搜索参数中.这是一个问题,因为我不控制查询表的应用程序,我可能不会破坏它们的性能.

有没有办法让SQL Server使用新的CHECKSUM /哈希索引而不修改查询以包含新的CHECKSUM /哈希列?

Repro脚本

CREATE TABLE big_table
(
    id BIGINT IDENTITY CONSTRAINT pk_big_table PRIMARY KEY,
    wide_col VARCHAR(50),
    wide_col_checksum AS CHECKSUM(wide_col),
    other_col INT
)

CREATE INDEX ix_checksum ON big_table (wide_col_checksum)
Run Code Online (Sandbox Code Playgroud)

插入一些测试数据:

SET NOCOUNT ON
DECLARE @count INT = 0
BEGIN TRANSACTION
WHILE @count < 10000
BEGIN
    SET @count = @count + 1
    INSERT INTO big_table (wide_col, other_col) 
    VALUES (SUBSTRING(master.dbo.fn_varbintohexstr(CRYPT_GEN_RANDOM(25)), 3, 50), @count)
    IF @count % 1000 = 0
    BEGIN
        COMMIT TRANSACTION
        BEGIN TRANSACTION
    END
END …
Run Code Online (Sandbox Code Playgroud)

sql-server indexing hash sql-server-2008 database-performance

8
推荐指数
1
解决办法
1635
查看次数

从SQLite中的固定宽度列读取是否更快?

从没有存储varchar或其他可变长度数据的表中读取通常会更快吗?在MySQL中,这更快,因为它可以准确计算磁盘上存储行的位置.

database sqlite database-performance

7
推荐指数
2
解决办法
4366
查看次数

教条2:限制左联/分页 - 最佳实践

我有一个大查询(在我的查询构建器中)和很多左连接.所以我得到他们的评论和标签等文章.假设我有以下dql:

$dql = 'SELECT blogpost, comment, tags 
FROM BlogPost blogpost 
LEFT JOIN blogpost.comments comments
LEFT JOIN blogpost.tags tags';
Run Code Online (Sandbox Code Playgroud)

现在让我们说我的数据库有超过100个博客帖子,但我只想要前10个,但是包含那些10及其所有标签的所有评论,如果它们存在的话.如果我使用setMaxResults它限制行.所以我可能得到前两个帖子,但最后一个帖子缺少一些评论或标签.所以跟随不起作用.

$result = $em->createQuery($dql)->setMaxResults(15)->getResult();
Run Code Online (Sandbox Code Playgroud)

使用doctrine2.2附带的几乎没有文件记录的分页解决方案对我来说并不是真的有效,因为它太慢了,我也可以加载所有数据.

我在Stackoverflow文章中尝试了解决方案,但即使该文章仍然缺少最佳实践,所提出的解决方案也非常慢.

对于如何做到这一点,是否有最佳实践?没有人在生产模式下使用Doctrine2.2吗?

pagination subquery query-builder database-performance doctrine-orm

7
推荐指数
1
解决办法
5761
查看次数

Oracle首选列长度

列长度​​的倍增因子是否会以某种方式影响数据库性能?

换句话说,以下两个表的性能有什么区别:

TBL1:
  - CLMN1 VARCHAR2(63)
  - CLMN2 VARCHAR2(129)
  - CLMN3 VARCHAR2(250)
Run Code Online (Sandbox Code Playgroud)

TBL2:
  - CLMN1 VARCHAR2(64)
  - CLMN2 VARCHAR2(128)
  - CLMN3 VARCHAR2(256)
Run Code Online (Sandbox Code Playgroud)

我们是否应该总是尝试将列的长度设置为某个功率,2或者只考虑最大值?

一些开发人员声称数据库中列长度的倍增因子之间存在某种联系,因为它影响Oracle如何分配和保存磁盘上的数据并在内存中共享其缓存.有人可以证明或反驳这一点吗?

oracle database-design database-performance

7
推荐指数
1
解决办法
1297
查看次数

MySQL获取时间优化

我有一张包含2百万个寄存器的表,但它会很快增长.基本上,该表包含具有相应描述符的图像的兴趣点.当我尝试执行选择空间上接近查询点的点的查询时,总执行时间会花费太长时间.更确切地说,持续时间/提取= 0.484秒/ 27.441秒.查询非常简单,只返回约17000行.

我的查询是:

SELECT fp.fingerprint_id, fp.coord_x, fp.coord_y, fp.angle,
fp.desc1, fp.desc2, fp.desc3, fp.desc4, fp.desc5, fp.desc6, fp.desc7, fp.desc8, fp.desc9, fp.desc10,
fp.desc11, fp.desc12, fp.desc13, fp.desc14, fp.desc15, fp.desc16, fp.desc17, fp.desc18, fp.desc19,
fp.desc20, fp.desc21, fp.desc22, fp.desc23, fp.desc24, fp.desc25, fp.desc26, fp.desc27, fp.desc28,
fp.desc29, fp.desc30, fp.desc31, fp.desc32
FROM fingerprint fp 
WHERE 
fp.is_strong_point = 1 AND 
(coord_x BETWEEN 193-40 AND 193+40) AND (coord_y BETWEEN 49-15 AND 49+15 ) 
LIMIT 1,1000000;
Run Code Online (Sandbox Code Playgroud)

这就是我所做的.

  1. 我试图改变key_buffer_sizemy.ini,但没有看到太大的变化.
  2. 另外我试图将coord_x和coord_y设置为索引,但查询时间变慢了.
  3. 该表由coord_x字段的范围划分,这给了我更好的结果.

我如何减少获取时间?是否可以将其减少到毫秒?

mysql query-optimization database-performance

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

查询动态连接列的性能优化

SQL Server数据库中的当前情况

有一个包含以下列的表条目:

  • EntryID(int)
  • EntryName(nvarchar)
  • EntrySize(int)
  • EntryDate(日期时间)

此外,应该可以为Entry保存额外的元数据.这些元数据的名称和值应该可以自由选择,并且应该可以在不改变数据库表结构的情况下动态添加这些元数据.每个元数据键可以是以下数据类型之一:

  • 文本
  • 数值
  • 约会时间
  • 布尔值(True/False)

因此,有一个表DataKey来表示具有以下列的元数据名称和数据类型:

  • DataKeyID(int)
  • DataKeyName(nvarchar)
  • DataKeyType(smallint)0:文本; 1:数字; 2:日期时间; 3:比特

在表DataValue中,可以根据元数据键的数据类型插入Entry和DataKey值的每个组合.对于每种数据类型,都有一个可以为空的值列.此表包含以下列:

  • DataValueID(int)
  • EntryID(int)外键
  • DataKeyID(int)外键
  • TextValue(nvarchar)可以为空
  • NumericValue(float)可以为空
  • DateValue(datetime)可以为空
  • BoolValue(位)Nullable

数据库结构图:

在此输入图像描述

目标

目标是检索满足规范的条目列表,如WHERE子句.如下例所示:

假设:

  • 元数据键KeyName1是文本
  • 元数据键KeyName2是DateTime
  • 元数据键KeyName3是数字
  • 元数据键KeyName4是布尔值

查询:

... WHERE (KeyName1 = „Test12345“ AND KeyName2 BETWEEN ’01.09.2012 00:00:00’ AND
’01.04.2013 23:59:00’) OR (KeyName3 > 15.3 AND KeyName4 = True)
Run Code Online (Sandbox Code Playgroud)

目标是以非常有效的方式执行这些查询,同时使用大量数据

  • 条目数> 2.000.000
  • 50和100之间或大于100的数据键数
  • 每个条目至少指定一个值的子集,或者也可以是每个键的值(2.000.000*100)

问题

构建查询时出现第一个问题.通常,查询需要具有可以在WHERE子句中使用的列的集合.在这种情况下,查询中使用的列也是表DataKey中的条目,以便能够动态添加元数据而无需更改数据库表结构.在研究期间,已经发现在运行时使用PIVOT表技术的解决方案.但事实证明,当数据库中存在大量数据时,此解决方案非常慢.

质询

  • 是否有更有效的方法或结构来保存数据用于此目的?
  • 如何满足上面列出的要求,同时还要考虑查询时的性能和时间消耗?

这是一个sql小提琴与描述的数据库结构和一些示例数据:http://www.sqlfiddle.com/#!3/d1912 / 3

sql t-sql sql-server performance database-performance

7
推荐指数
1
解决办法
576
查看次数

左连接与Hive内部连接 ​​- 内部连接和多个连接,地图连接的性能

有没有人知道Hive中左连接与内连接的性能是否有差异,通过hive.auto.convert.join = True启用Map Join?

我问的原因,按https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization#LanguageManualJoinOptimization-JoinOptimization

外连接提供了更多挑战.由于map-join运算符只能流式传输一个表,因此流表必须是所有行都需要的表.对于左外连接,这是连接左侧的表; 对于右外连接,右侧的表等.这意味着即使内连接可以转换为地图连接,也无法转换外连接.如果除了需要流式传输的表之外的表可以适合大小配置,则只能转换外部联接.

似乎这是说(a)外连接根本无法转换为内连接,(b)只有在不需要流式传输的表是"左连接"表时才能转换它(S).有谁知道它是哪一个?

另外,在Hive中INNER JOIN和LEFT JOIN的性能是否存在差异,就像在SQL中一样?当涉及多个左连接时,这种差异是否会变得更加放大(或者,或者,首先开始存在)?我问的原因是我正在考虑在一些左连接查找表中添加几个虚拟条目以将我的连接转换为内部...直观地看起来它可能会有所不同,性能明智,但我找不到任何文档或讨论无论如何.好奇,如果有人有这方面的经验.

performance hadoop hive left-join database-performance

7
推荐指数
0
解决办法
2336
查看次数

Rails:如何跨主/从数据库分割写/读查询

我的网站有很大的读取流量.比写入流量重很多.

为了提高我的网站的性能,我想到了主/从数据库配置.

octupus gem似乎提供我想要的,但因为我的应用是巨大的,我不能去虽然数百万行源代码的更改查询分发(发送读取查询从服务器和写入查询主服务器).

MySQL Proxy 似乎是解决此问题的好方法,但由于它是alpha版本,我不想使用它.

所以我的问题是什么是跨主/从服务器分割读/写查询的最佳方法?

是否可以在不使用rails中的任何gems的情况下拆分读/写查询?

mysql ruby-on-rails master-slave database-performance octopus

7
推荐指数
2
解决办法
7555
查看次数

Firebase Android:使用许多侦听器缓慢"加入",似乎与文档相矛盾

实施一个Android +火力地堡的应用程序,其具有多对多的关系:用户< - >窗口小部件(窗口小部件可被共享的多个用户).

注意事项:

  1. 列出用户拥有的所有小部件.
  2. 用户只能看到与他/她共享的小部件.
  3. 能够看到共享给定Widget的所有用户.
  4. 单个Widget可以由具有相同权限的多个用户拥有/管理(修改Widget并更改共享对象).与Google云端硬盘与特定用户共享的方式类似.

实现提取(join-style)的方法之一是遵循以下建议:https://www.firebase.com/docs/android/guide/structuring-data.html(" Joining Flattened Data"):

// fetch a list of Mary's groups
ref.child("users/mchen/groups").addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
    // for each group, fetch the name and print it
    String groupKey = snapshot.getKey();
    ref.child("groups/" + groupKey + "/name").addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
        System.out.println("Mary is a member of this group: " + snapshot.getValue());
      }
      @Override
      public void onCancelled(FirebaseError firebaseError) { …
Run Code Online (Sandbox Code Playgroud)

android join database-performance firebase firebase-realtime-database

7
推荐指数
1
解决办法
889
查看次数

SELECT DISTINCT 在我的 PostgreSQL 表上比预期的要慢

这是我的表架构:

CREATE TABLE tickers (
    product_id TEXT NOT NULL,
    trade_id INT NOT NULL,
    sequence BIGINT NOT NULL,
    time TIMESTAMPTZ,
    price NUMERIC NOT NULL,
    side TEXT NOT NULL,
    last_size NUMERIC NOT NULL,
    best_bid NUMERIC NOT NULL,
    best_ask NUMERIC NOT NULL,
    PRIMARY KEY (product_id, trade_id)
);
Run Code Online (Sandbox Code Playgroud)

我的应用程序在“ticker”频道上订阅了 Coinbase Pro 的 websocket,并在收到消息时在行情表中插入一行。

该表现在有近 200 万行。

我认为运行SELECT DISTINCT product_id FROM tickers会很快,但它需要大约 500 到 600 毫秒。这是来自的输出EXPLAIN ANALYZE

HashAggregate  (cost=47938.97..47939.38 rows=40 width=8) (actual time=583.105..583.110 rows=40 loops=1)
  Group Key: product_id
  ->  Seq Scan …
Run Code Online (Sandbox Code Playgroud)

sql postgresql query-optimization database-performance postgresql-performance

7
推荐指数
1
解决办法
478
查看次数