Sql server SQL Server 2005 XML数据类型
更新:这个问题与XML有关,我使用nvarchar(MAX)复制了表,但仍然是同一个问题。我将重新发布一个新主题。 我有一个大约有一百万条记录的表,这个表有一个XML字段。即使只选择一个ID,查询运行速度也非常慢。我是否可以做些什么来提高查询速度,我已尝试将行中的文本设置为on,但SQL server不允许,我收到错误“无法切换到表中的行中文本” 我将感谢任何帮助修复或知识,我似乎失踪 谢谢 桌子 质疑Sql server SQL Server 2005 XML数据类型,sql-server,xml,performance,Sql Server,Xml,Performance,更新:这个问题与XML有关,我使用nvarchar(MAX)复制了表,但仍然是同一个问题。我将重新发布一个新主题。 我有一个大约有一百万条记录的表,这个表有一个XML字段。即使只选择一个ID,查询运行速度也非常慢。我是否可以做些什么来提高查询速度,我已尝试将行中的文本设置为on,但SQL server不允许,我收到错误“无法切换到表中的行中文本” 我将感谢任何帮助修复或知识,我似乎失踪 谢谢 桌子 质疑 DECLARE@ID int 设置@ID=NULL 声明@ParoleeID int 设置@
DECLARE@ID int
设置@ID=NULL
声明@ParoleeID int
设置@ParoleeID=158
声明@Page int
设置@Page=2
声明@ObjectID int
设置@ObjectID=93
声明@Created datetime
SET@Created=NULL
不计数;
从[Audit]中选择前1名[Audit].*
哪里
(@ID为NULL或Audit.ID=@ID)和
(@ParoleeID为NULL或Audit.ParoleeID=@ParoleeID)和
(@Page为NULL或Audit.Page=@Page)和
(@ObjectID为NULL或Audit.ObjectID=@ObjectID)和
(@Created为null或(Audit.Created>@Created和Audit.Created
运行的查询、表结构、XML内容等信息肯定会有所帮助。很多
没有任何信息,我猜。仅选择ID时查询运行缓慢,因为您没有ID的索引
已更新
您的查询至少存在一些严重问题
- 除非提供ID,否则该表只能端到端扫描,因为没有索引
- 即使提供了ID,也不能保证条件(@ID为NULL或ID=@ID)是可搜索的,因此它仍然可能导致表扫描
- 最重要的是:查询将为它看到的第一组参数生成一个“优化”的计划。它将在参数的任何组合上重用此计划,无论这些参数是否为NULL。如果在访问路径上有一些可供选择的变体(即索引),这将产生不同的结果,但现在,如果存在@id,则查询只能在使用扫描或搜索之间进行选择。由于构建的方式不同,它几乎总是会选择扫描,因为OR
CREATE INDEX idx_Audit_ParoleeID ON Audit(ParoleeID);
CREATE INDEX idx_Audit_Page ON Audit(Page);
CREATE INDEX idx_Audit_ObjectID ON Audit(ObjectID);
GO
DECLARE @ParoleeID int
SET @ParoleeID = 158
DECLARE @Page int
SET @Page = 2
DECLARE @ObjectID int
SET @ObjectID = 93
SET NOCOUNT ON;
Select TOP 1 [Audit].* from [Audit]
where Audit.ParoleeID = @ParoleeID
AND Audit.Page = @Page
AND Audit.ObjectID = @ObjectID;
运行的查询、表结构、XML内容等信息肯定会有所帮助。很多 没有任何信息,我猜。仅选择ID时查询运行缓慢,因为您没有ID的索引 已更新 您的查询至少存在一些严重问题
- 除非提供ID,否则该表只能端到端扫描,因为没有索引
- 即使提供了ID,也不能保证条件(@ID为NULL或ID=@ID)是可搜索的,因此它仍然可能导致表扫描
- 最重要的是:查询将为它看到的第一组参数生成一个“优化”的计划。它将在参数的任何组合上重用此计划,无论这些参数是否为NULL。如果在访问路径上有一些可供选择的变体(即索引),这将产生不同的结果,但现在,如果存在@id,则查询只能在使用扫描或搜索之间进行选择。由于构建的方式不同,它几乎总是会选择扫描,因为OR
CREATE INDEX idx_Audit_ParoleeID ON Audit(ParoleeID);
CREATE INDEX idx_Audit_Page ON Audit(Page);
CREATE INDEX idx_Audit_ObjectID ON Audit(ObjectID);
GO
DECLARE @ParoleeID int
SET @ParoleeID = 158
DECLARE @Page int
SET @Page = 2
DECLARE @ObjectID int
SET @ObjectID = 93
SET NOCOUNT ON;
Select TOP 1 [Audit].* from [Audit]
where Audit.ParoleeID = @ParoleeID
AND Audit.Page = @Page
AND Audit.ObjectID = @ObjectID;
Sql Server 2005–优化查询性能的十二个技巧Tony Wright
Sql Server 2005–Tony Wright提供的优化查询性能的十二个技巧
您需要在c语言上创建一个主XML索引
CREATE INDEX idx_Audit_ParoleeID ON Audit(ParoleeID);
CREATE INDEX idx_Audit_Page ON Audit(Page);
CREATE INDEX idx_Audit_ObjectID ON Audit(ObjectID);
GO
DECLARE @ParoleeID int
SET @ParoleeID = 158
DECLARE @Page int
SET @Page = 2
DECLARE @ObjectID int
SET @ObjectID = 93
SET NOCOUNT ON;
Select TOP 1 [Audit].* from [Audit]
where Audit.ParoleeID = @ParoleeID
AND Audit.Page = @Page
AND Audit.ObjectID = @ObjectID;
CREATE FUNCTION dbo.GetShopOrderID(@ShopOrder XML)
RETURNS VARCHAR(100)
AS BEGIN
DECLARE @ShopOrderID VARCHAR(100)
SELECT
@ShopOrderID = @ShopOrder.value('(ActivateOrderRequest/ActivateOrder/OrderHead/OrderNumber)[1]', 'varchar(100)')
RETURN @ShopOrderID
END
ALTER TABLE dbo.YourTable
ADD ShopOrderID AS dbo.GetShipOrderID(ShopOrderXML) PERSISTED
SELECT (fields) FROM dbo.YourTable
WHERE ShopOrderID LIKE 'OSA%'