优化一个查询语句

老杨_sz 2009-11-20 10:54:38

select b.ddate 日期,b.contermno 终端号,a.termdept 商户部门,b.cishu 交易笔数,b.sumconmoney 交易金额 from madmterm a,
(select convert(varchar(10),condate,120) as ddate,contermno,count(*) as cishu,sum(conmoney) as sumconmoney
from conrecledroll where condate>='2009-11-01'and condate<='2009-11-21' and contype='消费'and
contermno in (select termno from madmterm where termdept='商户A')
group by contermno,convert(varchar(10),condate,120))b where a.termno=b.contermno order by b.ddate,b.contermno


如何优化上面的SQL语句,达到最佳查询效率。
...全文
105 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
老杨_sz 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ihq2008 的回复:]
引用 5 楼 dawugui 的回复:
SQL code最好给出表结构,测试数据,计算方法和正确结果.


SQL codeCREATETABLE[dbo].[conrecled] ([ID][int]IDENTITY (1,1)NOTNULL ,[conCardNo][varchar] (8) COLLATE Chinese_PRC_CI_ASNOTNULL ,[PeoNo][varchar] (8) COLLATE Chinese_PRC_CI_ASNULL ,[PeoName][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[PeoComPany][varchar] (50) COLLATE Chinese_PRC_CI_ASNULL ,[PeoShiYeBu][varchar] (50) COLLATE Chinese_PRC_CI_ASNULL ,[condate][datetime]NOTNULL ,[conmoney][money]NULL ,[fundMoney][money]NULL ,[consurplus][money]NOTNULL ,[CardConCount][int]NULL ,[contype][varchar] (10) COLLATE Chinese_PRC_CI_ASNULL ,[conTermNo][varchar] (10) COLLATE Chinese_PRC_CI_ASNULL ,[conTermName][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[ConBuilding][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[Condept][varchar] (40) COLLATE Chinese_PRC_CI_ASNULL ,[conOperNo][varchar] (4) COLLATE Chinese_PRC_CI_ASNULL ,[conOperName][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[OperNo][varchar] (10) COLLATE Chinese_PRC_CI_ASNULL ,[OperName][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[LoginUserName][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[ComputerName][varchar] (20) COLLATE Chinese_PRC_CI_ASNULL ,[conFlag][int]NULL
)ON[PRIMARY]GOALTERTABLE[dbo].[conrecled]ADDCONSTRAINT[DF_conrecled_conmoney]DEFAULT (0)FOR[conmoney],CONSTRAINT[DF_conrecled_fundMoney]DEFAULT (0)FOR[fundMoney],CONSTRAINT[DF_conrecled_consurplus]DEFAULT (0)FOR[consurplus],CONSTRAINT[DF_conrecled_conFlag]DEFAULT (0)FOR[conFlag]GOCREATEINDEX[IX_conrecled_1]ON[dbo].[conrecled]([condate])ON[PRIMARY]GOCREATEINDEX[IX_conrecled_2]ON[dbo].[conrecled]([conCardNo])ON[PRIMARY]GOCREATEINDEX[IX_conrecled]ON[dbo].[conrecled]([PeoNo])ON[PRIMARY]GO
[/Quote]

conrecled改为conrecledroll
老杨_sz 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dawugui 的回复:]
SQL code最好给出表结构,测试数据,计算方法和正确结果.
[/Quote]


CREATE TABLE [dbo].[conrecled] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[conCardNo] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PeoNo] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
[PeoName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[PeoComPany] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[PeoShiYeBu] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[condate] [datetime] NOT NULL ,
[conmoney] [money] NULL ,
[fundMoney] [money] NULL ,
[consurplus] [money] NOT NULL ,
[CardConCount] [int] NULL ,
[contype] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[conTermNo] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[conTermName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[ConBuilding] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[Condept] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
[conOperNo] [varchar] (4) COLLATE Chinese_PRC_CI_AS NULL ,
[conOperName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[OperNo] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[OperName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[LoginUserName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[ComputerName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[conFlag] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[conrecled] ADD
CONSTRAINT [DF_conrecled_conmoney] DEFAULT (0) FOR [conmoney],
CONSTRAINT [DF_conrecled_fundMoney] DEFAULT (0) FOR [fundMoney],
CONSTRAINT [DF_conrecled_consurplus] DEFAULT (0) FOR [consurplus],
CONSTRAINT [DF_conrecled_conFlag] DEFAULT (0) FOR [conFlag]
GO

CREATE INDEX [IX_conrecled_1] ON [dbo].[conrecled]([condate]) ON [PRIMARY]
GO

CREATE INDEX [IX_conrecled_2] ON [dbo].[conrecled]([conCardNo]) ON [PRIMARY]
GO

CREATE INDEX [IX_conrecled] ON [dbo].[conrecled]([PeoNo]) ON [PRIMARY]
GO
--小F-- 2009-11-20
  • 打赏
  • 举报
回复
比如condate
--小F-- 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ihq2008 的回复:]
引用 1 楼 fredrickhu 的回复:
没什么办法 优化 唯一的就是把in改成exists

如果要提高查询速度,如上语句在那个字段上建立索引为好?建立聚集还是非聚集?
[/Quote]

连接字段
icelovey 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ihq2008 的回复:]
引用 1 楼 fredrickhu 的回复:
没什么办法 优化 唯一的就是把in改成exists

如果要提高查询速度,如上语句在那个字段上建立索引为好?建立聚集还是非聚集?
[/Quote]

其实好像IN和EXISTS效率差别不大,


condate>='2009-11-01'and condate<='2009-11-21'
改成condate between '2009-11-01' and '2009-11-21'
dawugui 2009-11-20
  • 打赏
  • 举报
回复
最好给出表结构,测试数据,计算方法和正确结果.
老杨_sz 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
没什么办法 优化 唯一的就是把in改成exists
[/Quote]
如果要提高查询速度,如上语句在那个字段上建立索引为好?建立聚集还是非聚集?
--小F-- 2009-11-20
  • 打赏
  • 举报
回复
select
b.ddate 日期,b.contermno 终端号,a.termdept 商户部门,b.cishu 交易笔数,b.sumconmoney 交易金额
from
madmterm a,
(select convert(varchar(10),condate,120) as ddate,contermno,count(*) as cishu,sum(conmoney) as sumconmoney
from
conrecledroll where condate>='2009-11-01'and condate<='2009-11-21' and contype='消费'and
exists (select termno from madmterm where termdept='商户A' and b.contermno=termno)
group by
contermno,convert(varchar(10),condate,120))b where a.termno=b.contermno
order by
b.ddate,b.contermno
--小F-- 2009-11-20
  • 打赏
  • 举报
回复
没什么办法 优化 唯一的就是把in改成exists
envykok 2009-11-20
  • 打赏
  • 举报
回复
建立临时表和非聚集索引
gaojia2004 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 icelovey 的回复:]
引用 3 楼 ihq2008 的回复:
引用 1 楼 fredrickhu 的回复:
没什么办法 优化 唯一的就是把in改成exists

如果要提高查询速度,如上语句在那个字段上建立索引为好?建立聚集还是非聚集?


其实好像IN和EXISTS效率差别不大,

SQL code
condate>='2009-11-01'and condate<='2009-11-21'
改成condatebetween'2009-11-01'and'2009-11-21'
[/Quote]


在sql server 2005中 查询优化器会将IN转化成exist 所以不用考虑这点

尝试修改下查询语句,将madmterm 和 conrecledroll直接连接后再进行条件筛选


27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧