添加WHERE将为SQL Azure查询增加20秒以上的时间

添加WHERE将为SQL Azure查询增加20秒以上的时间,sql,sql-server,azure,azure-sql-database,Sql,Sql Server,Azure,Azure Sql Database,我正在寻找一些关于在SQLAzure中加速查询的建议。这是我们正在运行的两个查询的一个示例,当我们在其中添加WHERE子句时,查询将停止 时间和订单类型这两列都被索引。有人能建议如何让这些运行得更快,或者对查询做些什么来提高效率吗 5.2秒: 20.2秒: 以下是相关信息: CREATE TABLE [dbo].[Orders] ( [ID] int IDENTITY(1,1) NOT NULL, [orderType] nvarchar(90) COLLATE SQL_Latin1_Gener

我正在寻找一些关于在SQLAzure中加速查询的建议。这是我们正在运行的两个查询的一个示例,当我们在其中添加WHERE子句时,查询将停止

时间和订单类型这两列都被索引。有人能建议如何让这些运行得更快,或者对查询做些什么来提高效率吗

5.2秒:

20.2秒:

以下是相关信息:

CREATE TABLE [dbo].[Orders] (
[ID] int IDENTITY(1,1) NOT NULL,
[orderType] nvarchar(90) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[orderTime] nvarchar(90) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,

CONSTRAINT [PrimaryKey_fe2bdbea-c65a-0b85-1de9-87324cc29bff] PRIMARY KEY CLUSTERED ([ID]) 
WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE NONCLUSTERED INDEX [orderTime]
ON [dbo].[Orders] ([orderTime] ASC)
WITH (IGNORE_DUP_KEY = OFF,
STATISTICS_NORECOMPUTE = OFF,
ONLINE = OFF)
GO
CREATE NONCLUSTERED INDEX [actiontime_int]


CREATE NONCLUSTERED INDEX [orderType]
ON [dbo].[Orders] ([orderType] ASC)
WITH (IGNORE_DUP_KEY = OFF,
STATISTICS_NORECOMPUTE = OFF,
ONLINE = OFF)
GO

我怀疑你的询问没有按照你的想法进行。它采用的是前一百万行的计数,而不是前一百万行的计数。我想你想要:

select sum(cast(theTime AS INT))
from (select top (1000000) Orders
      from Orders
     ) t
与:

select sum(cast(theTime AS INT))
from (select top  (1000000) Orders
      from Orders
      WHERE orderType='something_in_here'
     ) t
我怀疑使用索引实际上会减慢速度,这取决于where子句的选择性

在原始查询中,您正在按顺序读取所有数据。这很快,因为页面只是在处理器中循环


浏览索引会减慢速度,因为页面没有按顺序读取。如果每个页面都有一个匹配的行,那么您可能仍在读取所有页面,但它们不再以物理或逻辑顺序读取。它们是按照索引的顺序读取的,这可能是随机的。

我怀疑您的查询没有按照您的想法进行。它采用的是前一百万行的计数,而不是前一百万行的计数。我想你想要:

select sum(cast(theTime AS INT))
from (select top (1000000) Orders
      from Orders
     ) t
与:

select sum(cast(theTime AS INT))
from (select top  (1000000) Orders
      from Orders
      WHERE orderType='something_in_here'
     ) t
我怀疑使用索引实际上会减慢速度,这取决于where子句的选择性

在原始查询中,您正在按顺序读取所有数据。这很快,因为页面只是在处理器中循环


浏览索引会减慢速度,因为页面没有按顺序读取。如果每个页面都有一个匹配的行,那么您可能仍在读取所有页面,但它们不再以物理或逻辑顺序读取。它们是按照索引的顺序读取的,这可能是随机的。

正如你所知,20.2s-5.2s是15秒,而不是20秒以上-写下问题,然后重新运行查询以获得复制/粘贴的准确时间:我丢失了-你想要计数还是想要前1000000行?我不知道为什么你们两个都在这里。计数只返回一行。同时,时间是否可以为空?如果是这样,您可能会得到聚集索引扫描或索引扫描+键查找。在这种情况下,可以考虑将时间作为一个包含列添加到OrdeType索引中。这假设您的查询有任何意义-您是想在时间为空时放弃计数中的行吗?如果没有,只需使用SELECT COUNT*。单列索引在大多数情况下几乎毫无用处。您可以删除它们,然后按照Aaron的建议创建一个-在订单类型中包括时间。。。。或者在ordertype上,时间正如你所知,20.2s-5.2s是15秒,而不是20秒以上。请写下问题,然后重新运行查询以获得复制/粘贴的准确时间:我丢失了-你要计数还是要最上面的1000000行?我不知道为什么你们两个都在这里。计数只返回一行。同时,时间是否可以为空?如果是这样,您可能会得到聚集索引扫描或索引扫描+键查找。在这种情况下,可以考虑将时间作为一个包含列添加到OrdeType索引中。这假设您的查询有任何意义-您是想在时间为空时放弃计数中的行吗?如果没有,只需使用SELECT COUNT*。单列索引在大多数情况下几乎毫无用处。您可以删除它们,然后按照Aaron的建议创建一个-在订单类型中包括时间。。。。或者在ordertype上,使用多列索引和此处列出的子查询组合来解决时间问题。现在用2.8秒的时间在所有15米的行上运行整个程序!谢谢大家。使用多列索引和此处列出的子查询组合解决了此问题。现在用2.8秒的时间在所有15米的行上运行整个程序!谢谢大家。