我们有一个遗留数据库,它是一个sql server db(2005和2008).
表中的所有主键都是UniqueIdentifiers.
这些表当前没有在它们上创建聚集索引,我们在仅有750k记录的表上遇到性能问题.这是我使用唯一标识符作为唯一主键的第一个数据库,我从未见过sql server返回数据这么慢.
我不想在uniqueidentifier上创建聚簇索引,因为它们不是顺序的,因此在插入数据时会降低应用程序的速度.
我们无法删除uniqueidentifier,因为它用于远程站点记录身份管理目的.
我曾考虑过向表中添加一个大整数标识列,并在此列上创建聚簇索引并包含唯一标识符列.
即
int identity - 保持插入速度唯一标识符的第一列 - 确保应用程序按预期保持工作.
目标是改进身份查询并加入表查询性能.
问题1:这会改善数据库的查询性能还是会降低它的速度?
Q2:有没有我没有列出的替代方案?
谢谢皮特
编辑: 性能问题是通过select语句快速检索数据,特别是如果一些更"交易/更改"的表连接在一起.
编辑2:表之间的连接通常都在主键和外键之间,对于具有外键的表,它们包含在非聚集索引中以提供更多覆盖索引.
这些表都没有其他值可以提供良好的聚簇索引.
我更倾向于在每个高负载表上添加一个额外的标识列,然后在聚簇索引中包含当前的Guid PK列以提供最佳的查询性能.
编辑3:我估计只有80%的查询是通过数据访问机制单独在主键和外键上执行的.通常,我们的数据模型具有延迟加载的对象,这些对象在访问时执行查询,这些查询使用对象id和PK列.我们有大量用户驱动的数据排除/包含查询,它们使用外键列作为基于类型X的条件的过滤器,不包括以下id.剩下的20%是Enum(int)或日期范围列的子句,在系统中执行的文本查询非常少.
在可能的情况下,我已经添加了覆盖索引来覆盖最重的查询,但到目前为止,我仍然感到失望.蓝脚表示数据存储为堆.
使用Sql Server Xml列以确保快速性能和易于报告的最佳实践是什么?
您如何设置该列?您是否将其保留为未键入状态?或将其与架构相关联?
将xml列与架构相关联是否可以提高查询性能?
我们对xml列的使用如下:
答:>在PER客户的基础上,我们可以定义其数据的灵活存储,而无需检查数据库。
B.>我们需要为每个返回客户数据的客户建立报表视图,就好像它是一个简单的表一样(对于Crystal报表或Sql Server Reporting Services)。
我们当前用于查询的语法如下:
SELECT
Id,
doc.value('@associatedId','nvarchar(40)') as AssocId,
doc.value('@name1', 'nvarchar(255)') as Name1,
doc.value('@name2', 'nvarchar(255)') as Name2,
doc.value('@name3', 'nvarchar(255)') as Name3,
doc.value('@number', 'nvarchar(255)') as Number
From OrderDetails
CROSS APPLY OrderDetails.XmlData.nodes('//root/reviewers/reviewer') as XmlTable(doc)
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?该查询在具有100万条记录的表中为我们运行的很慢,但是当前只有800条具有xml数据!
谢谢
皮特