我正在寻找一些关于加速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
我怀疑你的查询不是你想的那样。它取前100万次计数,而不是前100万行的计数。我想你需要:
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
子句的选择性。
在原始查询中,您按顺序读取所有数据。这很快,因为页面只是在处理器中循环。
遍历索引会减慢速度,因为页面不是按顺序读取的。您可能仍然在读取所有的页面(如果每个页面都有一个匹配的行),但是它们不再以"物理"或"逻辑"顺序读取。它们按照索引的顺序被读取——这很可能是随机的。