Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 学习数据库优化部分的好资源_Sql_Sql Server_Database - Fatal编程技术网

Sql 学习数据库优化部分的好资源

Sql 学习数据库优化部分的好资源,sql,sql-server,database,Sql,Sql Server,Database,我擅长于数据库SQL编程部分,但我想进一步进入数据库优化部分,比如:何时何地建立索引,如何决定哪个查询优于其他查询,如何优化数据库。你能给我介绍一些好的资源或书籍吗 对优化sql server查询有非常深入和透彻的解释。我最近一直在为我的公司关注这一点,我学到了一些关于查询优化的有趣事情 我一次运行了半个小时的SQL Profiler,记录了需要1000次读取或更多的查询,然后记录了需要50个CPU或更多的查询 我最初专注于具有最高读取和CPU的单个查询。然而,在将日志写入数据库之后,我能够查

我擅长于数据库SQL编程部分,但我想进一步进入数据库优化部分,比如:何时何地建立索引,如何决定哪个查询优于其他查询,如何优化数据库。你能给我介绍一些好的资源或书籍吗


对优化sql server查询有非常深入和透彻的解释。

我最近一直在为我的公司关注这一点,我学到了一些关于查询优化的有趣事情

我一次运行了半个小时的SQL Profiler,记录了需要1000次读取或更多的查询,然后记录了需要50个CPU或更多的查询

我最初专注于具有最高读取和CPU的单个查询。然而,在将日志写入数据库之后,我能够查询聚合结果,以查看哪些查询需要最多的聚合读取和CPU。针对这些问题实际上比只针对最昂贵的查询有很大帮助

最昂贵的查询可能一天运行一次,因此最好对其进行优化。然而,如果第十个最昂贵的查询每小时运行100次,那么首先对其进行优化会更有帮助

以下是我到目前为止所学内容的总结,可以帮助您开始识别优化查询:

请查找有关数据库/查询优化的一些提示

将函数应用于参数,而不是列

查看数据库查询时最常见的错误之一是对数据库表不正确地使用函数。每当我们需要对一列应用一个函数并根据一个值验证结果时,有必要检查我们是否有可以对给定列应用的反向函数。这样,数据库引擎就可以对该列使用索引,而无需定义基于函数的索引

对于一个没有任何索引的60行表,下面的查询

SELECT ticker.SYMBOL,
ticker.TSTAMP,
ticker.PRICE
FROM ticker
WHERE TO_CHAR(ticker.TSTAMP, 'YYYY-MM-DD') = '2011-04-01'
在0.006s中执行,而反向查询

SELECT ticker.SYMBOL,
ticker.TSTAMP,
ticker.PRICE
FROM ticker
WHERE
ticker.TSTAMP = TO_DATE('2011-04-01', 'YYYY-MM-DD')
-执行时间为0.004s

Exists子句而不是子查询中的Exists子句

数据库开发中观察到的另一种模式是,人们选择简单且最方便的解决方案。对于本技巧,我们将研究如何在列表中查找元素。最简单、最方便的解决方案是使用IN运算符

SELECT symbol, tstamp, price
FROM ticker
WHERE price IN (3,4,5);
-或 选择符号、tstamp、价格 从股票行情 其中,从阈值中选择价格中的价格,其中操作=‘购买’

当我们有一个小的可管理列表时,这种方法是可行的。当列表变得非常大,并且列表是动态的时,将根据我们只有在运行时才有的参数生成该列表,这种方法对于数据库来说成本非常高。另一种解决方案是使用EXISTS运算符,如下面的代码段所示:

SELECT symbol, tstamp, price
FROM ticker t
WHERE EXISTS (SELECT 1 FROM threshold m WHERE t.price = m.price AND m.action = 'Buy');

这种方法将更快,因为一旦引擎发现命中,它将停止寻找,因为条件已被证明是真实的。With IN将在进一步处理之前收集子查询的所有结果。

您使用的是什么RDBMS?因为查询分析器/优化器是不同的,所以其中很多都是特定于RDBMS的。