有人可以告诉我数据库调优和数据库查询优化之间的确切区别吗?
我已阅读维基百科上的以下链接:
http://en.wikipedia.org/wiki/Query_optimization
http://en.wikipedia.org/wiki/Database_tuning
根据我的理解,数据库调优似乎不是别的,而是数据库查询优化。我还是很困惑
两者到底有什么区别?
我需要更新表中的数千行。例如,我有 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)
注意 …
我为每个家长分配了一组孩子,为每个孩子分配了一个日期,所有这些都在一张表中。我想:为每个家长找到最大日期的孩子。我写了一份声明,就是这样做的:
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。
我需要帮助来调整以下涉及从 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)
任何帮助将不胜感激。非常感谢。
我的 DBA 告诉我,OPTION (FORCE ORDER)当访问一组特定的视图时,我应该始终在我的 SQL 语句中使用。我明白这是为了防止服务器否决他的加入顺序。
很公平 - 让 DBA 开心是值得的,我很乐意遵守。
但是,我想在我自己的架构中编写几个视图,但这显然不受支持。
那么,我如何在编写我的观点时实现同样的目标,OPTION (FORCE ORDER)即被强制执行?
谢谢弗雷德
寻找在 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) 我需要查询一个表,并且可以根据前端选择的选项在 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) 我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
在 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) 当我们的应用程序通过 ADO.Net 提交带有输入参数的 SQL 时,参数定义默认为 nvarchar。如果该字段在数据库表上定义为 varchar 和索引,则不会使用索引,从而导致扫描而不是查找。我们正在从 Teradata 转换为 SQL Server,因此这是转换过程中的系统性问题。应用团队向我提交了这个:
当我们在代码中将任何内容定义为字符串时,ADO.Net 提供程序会自动假定它是 SQLServer 中的 NVarchar。
他们的解决方案之一是仅对超过 1,000 行的表进行补救。我认为这在很多层面上都是错误的,但我正在寻找一些额外的输入。
我是一名 Teradata DBA,正在向 MSSQL DBA 过渡。
我假设 ADO.Net 中的这个设置是可配置的。对我来说很明显输入参数定义需要匹配表中的字段定义,特别是如果它是导致全表扫描的索引的一部分。
任何人都可以帮助我(1)如何设置输入参数定义以匹配表定义?,以及(2)如果这是系统性的,为什么只在表结束时修复这些参数和查询是一个坏主意1,000 条记录的大小?
oracle ×3
performance ×3
indexing ×2
mysql ×2
sql ×2
sql-server ×2
apache-spark ×1
database ×1
date ×1
group-by ×1
oracle12c ×1
postgresql ×1
scala ×1
t-sql ×1