【发布时间】:2011-03-14 22:47:04
【问题描述】:
过去两天我一直在阅读有关索引以及如何优化数据库的内容。
尽管我对索引有一个清晰的想法,但我还不知道如何实际优化我的数据库。
您能推荐任何优化数据库的教程或技术吗?
请具体一点,因为我已经阅读了很多理论,但到目前为止还没有具体的说明
谢谢
【问题讨论】:
标签: sql sql-server-2008 indexing
过去两天我一直在阅读有关索引以及如何优化数据库的内容。
尽管我对索引有一个清晰的想法,但我还不知道如何实际优化我的数据库。
您能推荐任何优化数据库的教程或技术吗?
请具体一点,因为我已经阅读了很多理论,但到目前为止还没有具体的说明
谢谢
【问题讨论】:
标签: sql sql-server-2008 indexing
一些最爱:
【讨论】:
首先查看索引的最关键的事情是: 外键(这些不会自动建立索引,通常用于连接,因此通常应该建立索引,除非表大小很小并且会保持很小。)FK 通常需要索引。
where 子句中具有足够可变性以使索引有用的东西。例如,在 where 子句中使用的 last_name 可能需要索引,但仅包含“Y”或“N”文本的字段不会从中受益。 您会经常订购的东西。
如果只有一个查询在 where 或 order by 中使用该特定字段,则不要索引,除非查询花费的时间太长。
不要索引的东西: 大字段是 text 或 varchar(Max) 或通常通过 '%text%' 搜索的内容。与常规索引相比,这些可能从全文索引中受益更多。
位域。对位字段进行索引根本没有意义(并非所有数据库甚至都允许索引),因为它没有足够的可变性来充分利用索引。
请记住,每个索引都会增加插入、更新或删除的时间。虽然我注意到用户通常会容忍更多的时间来做这些事情而不是从选择中返回结果,但必须牢记这一点。
【讨论】:
如果它“没有”损坏,请不要修复它。查找应用程序的慢速区域,找到有问题的查询并分析这些查询计划并解决索引问题(如果有)。不要因为刚刚学到一些东西就开始对系统进行更改!
进一步阅读:http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx
试试这个查询来查找缺失的索引:
--based on http://stackoverflow.com/questions/1540192/searching-for-table-index-scans
--this query will show cahced query plans that "SCAN", change comments for other things
;WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
, CachedPlans AS
(SELECT
RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID
,RelOp.op.value(N'@NodeId', N'int') AS OperationID
,RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator
,RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator
,RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost
,RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO
,RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU
,RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows
,cp.plan_handle AS PlanHandle
,qp.query_plan AS QueryPlan
,st.TEXT AS QueryText
,cp.cacheobjtype AS CacheObjectType
,cp.objtype AS ObjectType
,cp.usecounts AS UseCounts
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY qp.query_plan.nodes(N'//RelOp') RelOp (op)
)
SELECT
PlanHandle
,ParentOperationID
,OperationID
,PhysicalOperator
,LogicalOperator
,UseCounts
,CacheObjectType
,ObjectType
,EstimatedCost
,EstimatedIO
,EstimatedCPU
,EstimatedRows
,QueryText
FROM CachedPlans
WHERE CacheObjectType = N'Compiled Plan'
AND PhysicalOperator IN ('nothing will ever match this one!'
--,'Assert'
--,'Bitmap'
--,'Clustered Index Delete'
--,'Clustered Index Insert'
,'Clustered Index Scan'
--,'Clustered Index Seek'
--,'Clustered Index Update'
--,'Compute Scalar'
--,'Concatenation'
--,'Constant Scan'
,'Deleted Scan'
--,'Filter'
--,'Hash Match'
,'Index Scan'
--,'Index Seek'
--,'Index Spool'
,'Inserted Scan'
--,'Merge Join'
--,'Nested Loops'
--,'Parallelism'
,'Parameter Table Scan'
--,'RID Lookup'
--,'Segment'
--,'Sequence Project'
--,'Sort'
--,'Stream Aggregate'
--,'Table Delete'
--,'Table Insert'
,'Table Scan'
--,'Table Spool'
--,'Table Update'
--,'Table-valued function'
--,'Top'
)
或者这个:
SELECT TOP 50
total_worker_time/execution_count AS Avg_CPU_Time
,execution_count
,total_elapsed_time/execution_count as AVG_Run_Time
,(SELECT
SUBSTRING(text,statement_start_offset/2,(CASE
WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
END -statement_start_offset)/2
) FROM sys.dm_exec_sql_text(sql_handle)
) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY 3 DESC
【讨论】:
用于分析 SQL Server 性能的最大和最重要的工具之一是 SQL Profiler。它不是很容易理解和使用,所以这个Master SQL Server Profiler 系列视频可能会帮助您了解如何使用 SQL Profiler 来帮助您进行 SQL Server 性能调优。
【讨论】: