Sql server SQL Server 2005 XML数据类型

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 设置@

更新:这个问题与XML有关,我使用nvarchar(MAX)复制了表,但仍然是同一个问题。我将重新发布一个新主题。

我有一个大约有一百万条记录的表,这个表有一个XML字段。即使只选择一个ID,查询运行速度也非常慢。我是否可以做些什么来提高查询速度,我已尝试将行中的文本设置为on,但SQL server不允许,我收到错误“无法切换到表中的行中文本”

我将感谢任何帮助修复或知识,我似乎失踪

谢谢

桌子

质疑

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
使用此表设计,您的查询将在今天运行缓慢,明天运行缓慢,下周随着大小的增加,运行速度将异常缓慢。您必须回顾您的需求,确定哪些字段对查询很重要,为它们编制索引,并为它们提供单独的查询。或者像这样把所有可能的过滤器组合在一起是行不通的

您试图检索的XML与性能问题完全无关。您只是简单地强制执行表扫描,并期望SQL神奇地找到您想要的记录

因此,如果要检索特定的ParoleeID、Page和ObjectID,请对搜索的字段编制索引,并对这些字段运行查询,并且仅对以下字段进行查询:

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
使用此表设计,您的查询将在今天运行缓慢,明天运行缓慢,下周随着大小的增加,运行速度将异常缓慢。您必须回顾您的需求,确定哪些字段对查询很重要,为它们编制索引,并为它们提供单独的查询。或者像这样把所有可能的过滤器组合在一起是行不通的

您试图检索的XML与性能问题完全无关。您只是简单地强制执行表扫描,并期望SQL神奇地找到您想要的记录

因此,如果要检索特定的ParoleeID、Page和ObjectID,请对搜索的字段编制索引,并对这些字段运行查询,并且仅对以下字段进行查询:

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%'