标签: query-performance

T-SQL中的CPU时间与经过的时间

从我读过的内容(如果我错了,请纠正我的任何一点);

  • CPU时间是CPU使用的时间(即没有其他资源造成的延迟)

  • 经过的时间是挂钟时间(执行操作所花费的时间量,无论任何资源延迟或多个线程等)

  • 除多处理器环境外,经过的时间通常高于CPU时间

假设我的所有资源(如I/O)所用的时间为0

我可以说CPU时间除以核心数<=已用时间吗?

t-sql sql-server query-performance

5
推荐指数
1
解决办法
5797
查看次数

查询日期:"dateval LIKE'2014-01-01%'"是最佳做法?

答案建议使用大于/小于查询匹配给定日期的日期.但是我公司的一位老兵告诉我要用LIKE '2014-02-06%'.

什么是最佳做法?一个比另一个有什么显着优势吗?

mysql sql datetime date-range query-performance

5
推荐指数
1
解决办法
292
查看次数

Delta E(CIE Lab)在SQL中的性能计算和排序

我有一个数据库表,其中每一行都是一种颜色.我的目标:给定输入颜色,计算它与DB表中每种颜色的距离,并按该距离对结果进行排序.或者,作为用户故事说明:当我选择一种颜色时,我希望看到与我选择的颜色最相似的颜色列表,其中最接近的匹配位于列表顶部.

据我所知,为了做到这一点,各种Delta E(CIE Lab)公式是最佳选择.我无法找到公式的任何本机SQL实现,所以我编写了自己的SQL版本的Delta E CIE 1976Delta E CIE 2000.我根据python-colormath实现生成的结果验证了公式的SQL版本的准确性.

1976年的公式很容易用SQL或任何其他语言编写,因为它是一个简单的欧几里德距离计算.对于我来说,它对任何大小的数据集执行得很好而且快速(在具有100,000行的颜色表上测试它,并且查询花费不到1秒).

相比之下,2000年的公式非常漫长而复杂.我设法在SQL中实现它,但它的性能不是很好:查询10,000行大约需要5秒,查询100,000行大约需要1分钟.

我写了一个名为colorsearchtest示例应用程序(在Python/Flask/Postgres中),以解决我的实现问题(我在Heroku上设置了一个演示).如果您试用这个应用程序,您可以清楚地看到1976年和2000年Delta E查询之间的性能差异.

这是颜色表的模式(对于每种颜色,它存储相应的RGB和Lab表示,作为三个数值):

CREATE TABLE color (
    id integer NOT NULL,
    rgb_r integer,
    rgb_g integer,
    rgb_b integer,
    lab_l double precision,
    lab_a double precision,
    lab_b double precision
);
Run Code Online (Sandbox Code Playgroud)

这是表格中的一些数据(所有颜色都是随机颜色,由我的应用程序中的脚本生成):

INSERT INTO color (id, rgb_r, rgb_g, rgb_b, lab_l, lab_a, lab_b)
VALUES (902, 164, 214, 189, 81.6521019943304793,
        -21.2561872439361323, 7.08354581694699004);

INSERT INTO color (id, rgb_r, rgb_g, …
Run Code Online (Sandbox Code Playgroud)

algorithm postgresql colors query-performance flask

5
推荐指数
1
解决办法
1509
查看次数

Redshift/PostgreSQL 中用于子查询的 GroupAggregate

我注意到 Redshift 的查询优化器中有一些奇怪的行为,我想知道是否有人可以解释它或指出解决方法。

对于大型group by查询,让优化器计划 GroupAggregate 而不是 HashAggregate 是非常重要的,因此它不会尝试将临时结果放入内存中。一般来说,这对我来说很好用。但是当我尝试将其group by用作子查询时,它会切换到 HashAggregate。

例如,考虑以下查询。

select install_app_version, user_id, max(platform) as plat
from dailies
group by install_app_version, user_id;
Run Code Online (Sandbox Code Playgroud)

日常表有 sortkeys (install_app_version, user_id) 和 distkey (user_id)。因此 GroupAggregate 是可能的,并且查询计划看起来应该是这样的。

XN GroupAggregate  (cost=0.00..184375.32 rows=1038735 width=51)
  ->  XN Seq Scan on daily_players  (cost=0.00..103873.42 rows=10387342 width=51)
Run Code Online (Sandbox Code Playgroud)

相反,如果我在任何其他查询的子查询中使用上述内容,我会得到一个 HashAggregate。例如,即使是像这样简单的事情

select count(1) from
(   select install_app_version, user_id, max(platform) as plat
    from daily_players
    group by install_app_version, user_id
);
Run Code Online (Sandbox Code Playgroud)

有查询计划

XN Aggregate  (cost=168794.32..168794.32 rows=1 width=0)
  ->  XN Subquery Scan …
Run Code Online (Sandbox Code Playgroud)

sql query-optimization query-performance amazon-redshift

5
推荐指数
1
解决办法
693
查看次数

为什么将查询计数分配给变量比直接检查更好?

最近我有一个性能调优经验,我想在这里分享并试图理解为什么这种改进发生了.

在我的一个过程中,我想根据其他一些记录的存在返回一个数据集.

我的查询:

IF (SELECT COUNT(1) FROM ...) > 0
    SELECT …
Run Code Online (Sandbox Code Playgroud)

此查询大约需要5秒钟.

我做了一个更改并将IF语句的输出分配给变量然后检查它.

DECLARE @cnt INT = 0
SELECT @cnt = COUNT(1) FROM …

IF @cnt > 0
    SELECT …
Run Code Online (Sandbox Code Playgroud)

这个运行不到1秒.

我也试过IF EXISTS,但在改进之前得到了相同的结果(5秒).

我非常想知道为什么编译器的行为差异很大,如果有任何特定的答案.

谢谢

sql t-sql sql-server sql-server-2008-r2 query-performance

5
推荐指数
1
解决办法
108
查看次数

将对象数组作为属性插入neo4j

我正在尝试插入对象数组作为节点的属性。我试过了

MERGE (ss:Label1 {sId: 12345})
  ON MATCH SET ss.id = 14770746012, ss.setC = 1,ss.nl = [{id: 24, status: 0}]
  ON CREATE SET ss.id = 14770746012, ss.setC = 1,ss.nl = [{id: 24, status: 0}]
Run Code Online (Sandbox Code Playgroud)

如果运行,则会出现以下错误:

Property values can only be of primitive types or arrays thereof
Run Code Online (Sandbox Code Playgroud)

我什至尝试使用嵌套数组,这给了我与上面相同的错误。

我在Neo4j文档中研究过Neo4j不支持“属性值嵌套”

如何达到我的要求?

arrays neo4j query-performance

5
推荐指数
1
解决办法
996
查看次数

DocumentDB PartitionKey和性能

我有一个场景,我存储大量的第三方数据,供业务用户进行临时分析.使用多个自连接,投影和范围,大多数针对数据的查询都会很复杂.

PartitionKey在Azure DocumentDB中选择使用时,我看到人们建议使用逻辑分隔符,如TenantId,DeviceId等.

然而,鉴于DocumentDB的并行特性,我很好奇它如何处理PartitionKey基于某种GUID或大整数的基于某种GUID或大整数,因此在大型读取期间,它将是高度分辨的.

考虑到这一点,我设计了一个包含两个集合的测试:

  1. test-col-1
    • PartitionKey 是TenantId,大约有100个可能的值
  2. test-col-2
    • PartitionKey是由第三方指定的符合"AB1234568"模式的唯一值.保证第三方在全球范围内独一无二.

两个集合都设置为100,000 RU.

在我的实验中,我加载了大约2,000个文档的集合.每个文档大小约为20 KB,并且高度非规范化.每个文档都是一个订单,其中包含多个作业,每个作业都包含用户,价格等.

示例查询:

SELECT
orders.Attributes.OrderNumber,
orders.Attributes.OpenedStamp,
jobs.SubOrderNumber,
jobs.LaborTotal.Amount As LaborTotal,
jobs.LaborActualHours As LaborHours,
jobs.PartsTotal.Amount As PartsTotal,
jobs.JobNumber,
jobs.Tech.Number As TechNumber,
orders.Attributes.OrderPerson.Number As OrderPersonNumber,
jobs.Status
FROM orders
JOIN jobs IN orders.Attributes.Jobs
JOIN tech IN jobs.Techs
WHERE   orders.TenantId = @TentantId
    AND orders.Attributes.Type = 1
    AND orders.Attributes.Status IN (4, 5)";
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我调整了以下设置:

  1. 默认 ConnectionPolicy
  2. 最佳做法 ConnectionPolicy
    • ConnectionMode.Direct, Protocol.Tcp
  3. 各种MaxDegreeOfParallelism价值观
  4. 各个 MaxBufferedItemCount

使用GUID PartitionKey查询集合EnableCrossPartitionQuery = …

azure query-performance azure-cosmosdb

5
推荐指数
1
解决办法
762
查看次数

MySQL 中 where 子句中多列索引的列顺序是否重要?

我有下表:

CREATE TABLE `student` ( 
     `name` varchar(30) NOT NULL DEFAULT '',
     `city` varchar(30) NOT NULL DEFAULT '', 
     `age`  int(11) NOT NULL DEFAULT '0',
     PRIMARY KEY (`name`,`city`) 
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我想知道,如果我执行以下两条SQL,它们的性能是否相同?

mysql> select * from student where name='John' and city='NewYork';
mysql> select * from student where city='NewYork' and name='John';
Run Code Online (Sandbox Code Playgroud)

涉及问题:

  1. 如果有一个多列索引(name, city),那两条SQL都用了吗?
  2. 优化器是否因为索引而将第二个 sql 更改为第一个?

我对他们两个执行解释,结果如下:

mysql> explain select * from student where name='John' and city='NewYork';
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+

| id | select_type | table   | type  | possible_keys | key     | …
Run Code Online (Sandbox Code Playgroud)

mysql sql indexing query-performance

5
推荐指数
2
解决办法
2916
查看次数

MySQL:为什么IN子句中的第5个ID会大大改变查询计划?

鉴于以下两个问题:

查询#1

SELECT log.id
FROM log
WHERE user_id IN
      (188858, 188886, 189854, 203623, 204072)
      and type in (14, 15, 17)
ORDER BY log.id DESC
LIMIT 25 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

查询#2 - 4个ID而不是5

SELECT log.id
FROM log
WHERE user_id IN
      (188858, 188886, 189854, 203623)
      and type in (14, 15, 17)
ORDER BY log.id DESC
LIMIT 25 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

解释计划

-- Query #1
1   SIMPLE  log range   idx_user_id_and_log_id  idx_user_id_and_log_id  4       41280   Using index condition; Using where; Using filesort
-- Query #2
1   SIMPLE …
Run Code Online (Sandbox Code Playgroud)

mysql sql indexing query-performance

5
推荐指数
1
解决办法
139
查看次数

哪个查询有更好的性能?

SELECT *
FROM { SELECT * FROM BigMillionTable UNION ALL SELECT * FROM SmallTensTable } 
WHERE (some_condition)
Run Code Online (Sandbox Code Playgroud)

VS

SELECT * 
FROM BigMillionTable 
WHERE (some_condition)

UNION ALL

SELECT * 
FROM SmallTensTable
WHERE (some_condition) 
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 第一个查询是否需要将所有行放在 BigMillionTable主内存中才能执行UNION ALL
  2. 哪个查询提供更好的性能?

sql oracle oracle11g query-performance

5
推荐指数
1
解决办法
124
查看次数