我有一个包含每天都在增长的表格的数据库。我无法预测哪些表会增长,哪些不是因为我不是将数据放入其中的那些。
有没有办法在特定时间点找到需要索引的表?在SQL Server中,有没有办法在数据库需要调优某些表时通知我?
这是我们在不同客户位置部署的产品,我们每次都无法访问其服务器以检查是否存在性能问题。我想到的是,如果某些表存在性能问题,可以通知我,因此当新的补丁发送到客户端时,我们可以添加这些索引或调优查询。
在引用Insertion of data after creating index on empty table or creating unique index after inserting data on oracle?之后,我不愿意在安装数据库时创建索引,或者当表有很少行或为空时。
答案 0 :(得分:0)
根据我的理解,我们不能在较小的表上创建索引,因为它会影响写入性能。
如果您每天批量加载或以其他方式生成一亿条记录,这只是一个真正的问题,写入性能是一个问题。索引会增加写入时间,因为它们必须在写入数据时更新,但除非您在马铃薯上运行或运行非常高的负载,否则它不太可能成为问题。在遇到它之前,你知道这是一个问题。
如果我们讨论的是小表(少于100页),那么索引更有可能因为数据集太小而无用,但你不应该担心影响写性能。 / p>
总的来说,您的应用程序应该具有支持您希望在单元测试和分段中运行的查询的索引。您需要来自客户或客户的反馈,但在您真正了解人们如何使用他们的数据之前,您将不得不做出最佳猜测。
一般问题“当我不知道将运行什么查询时,我怎么知道我需要哪些索引?”更适合DBA Stack Exchange。简而言之,您需要使用动态管理视图。这三个missing index dynamic views可用于此。给出的示例查询并不可怕:
SELECT mig.*, statement AS table_name,
column_id, column_name, column_usage
FROM sys.dm_db_missing_index_details AS mid
CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle)
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON mig.index_handle = mid.index_handle
ORDER BY mig.index_group_handle, mig.index_handle, column_id;
然而,你不应该盲目地遵循这种观点所说的。它是看待什么的好领导,但你必须查看实际用于告诉的列顺序和查询。
您还应该监视index usage statistics并检查索引的使用量和方式与它们必须更新的程度相比。每天更新一百万次但使用一次或两次的索引应考虑删除。
您还需要监控query stats以查找长时间运行的查询。这可能是您客户的糟糕发展,但也可能是设计问题的一个标志。
然而,这甚至不是一个全面的概述。数据库维护和操作有很多。这就是为什么DBA能够过上好日子的原因。这只是冰山一角。只是索引的提示,甚至。
如果您想维护这一点,我会考虑让您的客户允许您发送反馈以进行性能分析。设置一个监视管理视图的代理,并将编译和清理的信息发送给您自己。当然,您需要非常小心发送的内容,因为您不想发送实际的客户数据。
请记住,动态管理视图通常会在实例执行时重置,因此结果通常不会代表数据库的整个生命周期。