标签: query-optimization

数据库调优和数据库查询优化有什么区别?

有人可以告诉我数据库调优和数据库查询优化之间的确切区别吗?

我已阅读维基百科上的以下链接:

http://en.wikipedia.org/wiki/Query_optimization

http://en.wikipedia.org/wiki/Database_tuning

根据我的理解,数据库调优似乎不是别的,而是数据库查询优化。我还是很困惑

两者到底有什么区别?

database query-optimization database-tuning

2
推荐指数
1
解决办法
3876
查看次数

如何更新 PostgreSQL 中的大量行?

我需要更新表中的数千行。例如,我有 1000 行,id 为 - 1, 2.. 1000:

mytable:
| id   | value1 | value2 |
|  1   |  Null  |  Null  |
|  2   |  Null  |  Null  |
...
| 1000 |  Null  |  Null  |
Run Code Online (Sandbox Code Playgroud)

现在我需要更改前 10 行。我可以这样做:

UPDATE mytable SET value1=42, value2=111 WHERE id=1
...
UPDATE mytable SET value1=42, value2=111 WHERE id=10
Run Code Online (Sandbox Code Playgroud)

这需要很多请求,而且速度不是很快,所以我决定进行此优化:

UPDATE mytable SET value1=42  WHERE id in (1, 2, 3.. 10)
UPDATE mytable SET value2=111 WHERE id in (1, 2, 3.. 10)
Run Code Online (Sandbox Code Playgroud)

注意 …

postgresql query-optimization

2
推荐指数
1
解决办法
5751
查看次数

使用单个选择在组中查找最大值

我为每个家长分配了一组孩子,为每个孩子分配了一个日期,所有这些都在一张表中。我想:为每个家长找到最大日期的孩子。我写了一份声明,就是这样做的:

create table t(
  parent string,
  child string,
  date date,
);
Run Code Online (Sandbox Code Playgroud)

主键:(父、子)

select a.*
from
    (select parent, child, date from t) a
  join
    (select parent, max(date) as lastdate from t group by parent) b
  on
    a.parent = b.parent
    and a.date = b.lastdate
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我在表 t 上进行了 2 个单独的选择。假设表 t很大,我想仅通过表 t 上的一个选择来完成此操作。那可能吗?

我在 Oracle 10g EE 上使用 Oracle SQl Developer。

sql oracle query-optimization

2
推荐指数
1
解决办法
133
查看次数

使用 ALL_OBJECTS 视图调整查询

我需要帮助来调整以下涉及从 Oracle 数据字典 ALL_OBJECTS 进行查询的查询。

SELECT OBJECT_NAME ,OBJECT_TYPE 
FROM ALL_OBJECTS OBJ 
WHERE (OBJ.OWNER ='HR') 
AND (OBJ.OBJECT_TYPE IN ('TABLE','VIEW'));
Run Code Online (Sandbox Code Playgroud)

我尝试使用如下提示调整查询,但没有太多帮助。

SELECT /*+ STAR_TRANSFORMATION */ OBJECT_NAME
       ,OBJECT_TYPE 
FROM ALL_OBJECTS OBJ 
WHERE (OBJ.OWNER ='HR') 
AND (OBJ.OBJECT_TYPE IN ('TABLE','VIEW'));
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。非常感谢。

oracle performance query-optimization data-dictionary

2
推荐指数
1
解决办法
2239
查看次数

定义视图时如何让 T-SQL 执行 OPTION (FORCE ORDER)?

我的 DBA 告诉我,OPTION (FORCE ORDER)当访问一组特定的视图时,我应该始终在我的 SQL 语句中使用。我明白这是为了防止服务器否决他的加入顺序。

很公平 - 让 DBA 开心是值得的,我很乐意遵守。

但是,我想在我自己的架构中编写几个视图,但这显然不受支持。

那么,我如何在编写我的观点时实现同样的目标,OPTION (FORCE ORDER)即被强制执行?

谢谢弗雷德

t-sql sql-server query-optimization

2
推荐指数
1
解决办法
3590
查看次数

使用多列索引 MYSQL 进行优化

寻找在 MySQL 中优化以下查询的方法。我曾尝试在 sales_date、serviceID 和 initalStatus 上创建多列索引,但它没有得到使用。我试图研究,但我对优化很陌生,似乎找不到合适的答案。下面是查询:

SELECT 
COUNT(id) as TotalAccounts,
AVG(sale_value) AS SaleValue,
AVG(credit_card = 1) * 100 AS CreditCard,
SUM(CASE WHEN pre_status = 1 AND bill_status = 'current' THEN 1 
ELSE 0
END) AS Active, 
SUM(CASE WHEN pre_status = 1 AND bill_status = 'past' THEN 1 
ELSE 0
END) AS PastDue, 
SUM(CASE WHEN `status` = 0 AND bill_status = 'past' THEN 1 
ELSE 0
END) AS Canceled
FROM table_x  
WHERE sales_date >= CAST('2015-01-01' AS DATE) 
AND sales_date <= …
Run Code Online (Sandbox Code Playgroud)

mysql indexing query-optimization amazon-aurora

2
推荐指数
1
解决办法
1809
查看次数

在 where 子句中使用 case 语句时 Oracle 存储过程不使用索引

我需要查询一个表,并且可以根据前端选择的选项在 WHERE 子句中传递一个或最多六个参数。我在 WHERE 子句中使用了 CASE 语句来处理所有排列。

这是 SP 代码片段:

create procedure return_data ( 
     p_field1 in varchar(20), 
     p_field2 in varchar2(30), 
     p_field3 in varchar2(30), 
     cur out sys_refcursor)
is 
begin
    open cur for
        select col1, col2, col3,col4,col5,col6 
        from master_table
        where (case when (p_field1 is null) then (1) 
                   when (p_field1 is not null) and (col1=p_field1) then 1 
                   else 0 end) =1 
       and (case when (p_field2 is null) then (1) 
                 when (p_field2 is not null) and (col2=p_field2) then 1 
                 else 0 end) =1 
      ... …
Run Code Online (Sandbox Code Playgroud)

oracle indexing performance query-optimization oracle12c

2
推荐指数
1
解决办法
217
查看次数

火花计数与拍摄和长度

com.datastax.spark:spark-cassandra-connector_2.11:2.4.0在运行 zeppelin notebooks 时使用,但不明白 spark 中两个操作之间的区别。第一个操作需要很多时间进行计算,第二个操作立即执行。有人可以向我解释两种操作之间的区别吗:

import com.datastax.spark.connector._
import org.apache.spark.sql.cassandra._

import org.apache.spark.sql._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
import spark.implicits._

case class SomeClass(val someField:String)

val timelineItems = spark.read.format("org.apache.spark.sql.cassandra").options(scala.collection.immutable.Map("spark.cassandra.connection.host" -> "127.0.0.1", "table" -> "timeline_items", "keyspace" -> "timeline" )).load()
//some simplified code:
val timelineRow = timelineItems
        .map(x => {SomeClass("test")})
        .filter(x => x != null)
        .toDF()
        .limit(4)

//first operation (takes a lot of time. It seems spark iterates through all items in Cassandra and doesn't use laziness with limit 4)
println(timelineRow.count()) //return: 4 …
Run Code Online (Sandbox Code Playgroud)

performance scala query-optimization apache-spark apache-spark-sql

2
推荐指数
1
解决办法
1793
查看次数

如何在 MySQL 中按日期/时间段对结果进行分组,同时仍使用索引?

在 MySQL 中,您可以创建要在查询中使用的索引,以防止全表扫描。只能使用一个索引。

此外,为了使用索引,索引的字段不能通过函数(即DATE(), MONTH(), YEAR())运行,因为这样查询优化器将不知道结果是什么,因此不能使用索引并将回退到而是进行完整(或部分)表扫描。

假设您想要运行一个按日/月/季度/年 ( GROUP BY date(created_at)) 对条目进行分组的报告,您如何设计一个查询来在仍然使用索引的情况下执行此操作?

示例表:

CREATE TABLE `datesort` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `value` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `c_v` (`created_at`,`value`)
) ENGINE=InnoDB;

-- Problem Query
EXPLAIN SELECT COUNT(*), `value`, created_at
FROM datesort
WHERE created_at > NOW() - INTERVAL 1 DAY
GROUP BY date(created_at), value;

-- Using where; Using index; Using temporary; Using filesort

vs

EXPLAIN SELECT COUNT(*), `value`, created_at
FROM …
Run Code Online (Sandbox Code Playgroud)

mysql sql group-by date query-optimization

2
推荐指数
1
解决办法
1999
查看次数

索引上的 SQL 输入参数过滤默认为 nvarchar,导致全表扫描

当我们的应用程序通过 ADO.Net 提交带有输入参数的 SQL 时,参数定义默认为 nvarchar。如果该字段在数据库表上定义为 varchar 和索引,则不会使用索引,从而导致扫描而不是查找。我们正在从 Teradata 转换为 SQL Server,因此这是转换过程中的系统性问题。应用团队向我提交了这个:

当我们在代码中将任何内容定义为字符串时,ADO.Net 提供程序会自动假定它是 SQLServer 中的 NVarchar。

他们的解决方案之一是仅对超过 1,000 行的表进行补救。我认为这在很多层面上都是错误的,但我正在寻找一些额外的输入。

我是一名 Teradata DBA,正在向 MSSQL DBA 过渡。

我假设 ADO.Net 中的这个设置是可配置的。对我来说很明显输入参数定义需要匹配表中的字段定义,特别是如果它是导致全表扫描的索引的一部分。

任何人都可以帮助我(1)如何设置输入参数定义以匹配表定义?,以及(2)如果这是系统性的,为什么只在表结束时修复这些参数和查询是一个坏主意1,000 条记录的大小?

sql-server query-optimization

2
推荐指数
1
解决办法
23
查看次数