添加WHERE会为SQL Azure查询添加20多秒

时间:2013-05-17 14:04:55

标签: sql sql-server azure azure-sql-database

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

两个列,theTime和orderType都被编入索引。任何人都可以建议如何使这些运行更快,或者对查询做些什么来提高效率?

5.2秒:

sum(cast(theTime AS INT)) as totalTime from Orders

20.2秒:

 sum(cast(theTime AS INT)) as totalTime from Orders WHERE orderType='something_in_here'

以下是相关信息:

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

1 个答案:

答案 0 :(得分:1)

我怀疑你的查询没有按你的想法行事。这是第一百万计数,而不是第一百万行的计数。我想你想要:

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子句的选择性。

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

浏览索引会降低速度,因为页面不会按顺序读取。您可能仍在阅读所有页面(如果每个页面都有匹配的行),但它们不再被读入" physical"或者"逻辑"订购。它们按索引的顺序读取 - 这很可能是随机的。