我擅长数据库(sql)编程部分,但我想进入数据库优化部分,如:索引的何时何地,如何确定哪个查询优于其他查询,如何优化数据库。你能指导一些可以引导我的好资源或书籍吗?
答案 0 :(得分:5)
Inside Microsoft SQL Server 2005: Query Tuning and Optimization,
Inside Microsoft SQL Server 2005: T-SQL Querying
Inside Microsoft SQL Server 2005: The Storage Engine
对优化sql server查询有非常深入和深入的解释。
答案 1 :(得分:4)
答案 2 :(得分:0)
我最近一直专注于我的公司,我学到了一些有关查询优化的有趣方法。
我一次运行SQL Profiler半小时,并记录需要1000次或更多次读取的查询(后来需要50次或更多CPU的查询)。
我最初专注于具有最高读取和CPU的单个查询。但是,在将日志写入数据库之后,我能够查询聚合结果,以查看哪些查询需要最多的聚合读取和CPU。定位这些实际上比仅针对最昂贵的查询提供了更多帮助。
最昂贵的查询可能每天运行一次,因此优化它是很好的。但是,如果第10个最昂贵的查询每小时运行100次,那么首先优化它会更有帮助。
以下是我到目前为止所学到的内容的摘要,它可以帮助您开始识别优化查询:
A Beginner's Guide to Database Query Optimization
Highly Inefficient Linq Queries that Break Database Indexing
An Obscure Performance Pitfall for Test Accounts and Improperly Indexed Database Tables
答案 3 :(得分:0)
请查找有关数据库/查询优化的一些提示。
将函数应用于参数,而不是列
查看数据库查询时遇到的最常见错误之一是对数据库表使用不当的函数。每当我们需要将一个函数应用于一个列并根据一个值验证结果时,值得检查我们是否具有可以对给定列应用的反向函数。通过这种方式,数据库引擎可以使用针对该列的索引,并且不需要定义基于功能的索引。
针对没有索引的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.004秒内执行
存在子句而不是IN(子查询)
数据库开发中的另一个观察模式是人们选择简单且最方便的解决方案,对于本技巧,我们将看一下在列表中查找元素。最简单和最方便的解决方案是使用IN运算符。
SELECT symbol, tstamp, price
FROM ticker
WHERE price IN (3,4,5);
- 或 SELECT符号,tstamp,价格 来自自动收报机 价格IN(SELECT price FROM threshold WHERE action ='Buy');
当我们有一个小的可管理列表时,这种方法是可行的。当列表变得非常大并且列表是动态的(它将基于我们仅在运行时具有的参数生成)时,这种方法对于数据库而言变得非常昂贵。另一种解决方案是使用EXISTS运算符,如下面的代码片段所示:
SELECT symbol, tstamp, price
FROM ticker t
WHERE EXISTS (SELECT 1 FROM threshold m WHERE t.price = m.price AND m.action = 'Buy');
这种方法会更快,因为一旦发动机发现了撞击,它就会退出,因为条件证明是正确的。使用IN,它将在进一步处理之前收集子查询中的所有结果。