sql - 为什么我的简单 SQL 语句需要这么长时间才能执行?我该如何查找问题?

标签 sql sql-server

我有一个非常简单的 SQL 查询:

select o.Visit_ID
from Datamart.dbo.ww_Orders o
inner join Datamart.dbo.ww_Order_Details on o.Visit_ID = ww_Order_Details.Visit_ID
where o.runstamp = '20160422'

此查询需要 <0 秒返回 11173 行

当我添加 GROUP BY 语句时:

select o.Visit_ID
from Datamart.dbo.ww_Orders o
inner join Datamart.dbo.ww_Order_Details on o.Visit_ID = ww_Order_Details.Visit_ID
where o.runstamp = '20160422'
group by o.Visit_ID

服务器需要 6 分 30 秒来检索 3047 行。

我希望 GROUP BY 查询花费的时间不会比原始查询长很多。我该如何找出问题所在?谢谢


以下是表定义:

订单:

CREATE TABLE [dbo].[ww_Orders](
    [Visit_ID] [int] NOT NULL,
    [Member_ID] [int] NOT NULL,
    [Membership_no] [varchar](20) NULL,
    [Member_Card_Num_Orig] [varchar](16) NULL,
    [SCV_ID] [int] NULL,
    [Meeting_No] [int] NULL,
    [Location_Name] [varchar](128) NULL,
    [Leader_No] [int] NULL,
    [CashAmt] [decimal](18, 2) NULL,
    [EFTAmt] [decimal](18, 2) NULL,
    [VouchAmt] [decimal](18, 2) NULL,
    [Meet_Date] [datetime] NULL,
    [runstamp] [varchar](50) NULL,
 CONSTRAINT [PK_dbo.ww_Orders] PRIMARY KEY CLUSTERED 
(
    [Visit_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

订单详情:

CREATE TABLE [dbo].[ww_Order_Details](
    [ord_det_pk] [int] IDENTITY(1,1) NOT NULL,
    [Visit_ID] [int] NOT NULL,
    [Item_Code] [nvarchar](50) NULL,
    [Item_Name] [nvarchar](50) NULL,
    [Qty] [int] NULL,
    [Amt] [decimal](18, 2) NULL,
    [Category_Code] [nvarchar](20) NULL,
 CONSTRAINT [PK_ww_Order_Details] PRIMARY KEY CLUSTERED 
(
    [ord_det_pk] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[ww_Order_Details]  WITH CHECK ADD  CONSTRAINT [FK_ww_Order_Details_ww_Orders] FOREIGN KEY([Visit_ID])
REFERENCES [dbo].[ww_Orders] ([Visit_ID])
GO

ALTER TABLE [dbo].[ww_Order_Details] CHECK CONSTRAINT [FK_ww_Order_Details_ww_Orders]
GO

最佳答案

我将在 ww_Order_Details Visit_ID 上添加一个索引,可能将其设为聚集索引,然后将索引删除到 ord_det_pk 上。而且它作为存在可能更有意义?

select o.Visit_ID
from Datamart.dbo.ww_Orders o
where exists (select 0 from Datamart.dbo.ww_Order_Details where o.Visit_ID = ww_Order_Details.Visit_ID)
and o.runstamp = '20160422'

关于sql - 为什么我的简单 SQL 语句需要这么长时间才能执行?我该如何查找问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787710/

相关文章:

sql - Sql 查询中的新行

java - 尝试为 SQLite 数据库创建表时出现无法识别的语句

sql-server - SQL 过程和 CLR 过程之间的区别?

sql-server - 在 SQL Server 中更改数据库排序规则的风险和影响

sql - 连接 3 个表的查询

sql - 你如何记录你的数据库结构?

mysql - 如何通过下拉列表从数据库中删除值?

SQL SELECT 连接列别名

sql-server - 无法计算出关键字 'LEFT' 附近的错误语法

sql-server - 本地化 SQL Server (2005/2008) 数据库的最佳实践