mssql sql语句多条件查询优化问题。
我需要做一个前台程序查询新闻,显示的字段,查询条件全部需要权限设置。查询条件:查询用户:张某(客户)显示字段:aa,bb,cc,dd,ee条件一:张某能查询企业a,b,c...
我需要做一个前台程序查询新闻,显示的字段,查询条件全部需要权限设置。
查询条件:
查询用户:张某(客户)
显示字段:aa,bb,cc,dd,ee
条件一:张某能查询企业a,b,c.....(100),这100个企业中有10000条新闻
条件二:张某能查询品牌(1000)个,这1000个品牌中有100000条新闻
条件三:张某能查询媒体(10)个,这10个媒体中有10000条新闻
条件四:张某能查询上面三个条件下最近一周的新闻
注:可能条件一里边查询的新闻同时存在于条件二、条件三中
条件二里边查询的新闻同时存在于条件一、条件三中
条件三里边查询的新闻同时存在于条件一、条件二中
。。。
如何优化,让其按照上诉条件快速高效的显示 展开
查询条件:
查询用户:张某(客户)
显示字段:aa,bb,cc,dd,ee
条件一:张某能查询企业a,b,c.....(100),这100个企业中有10000条新闻
条件二:张某能查询品牌(1000)个,这1000个品牌中有100000条新闻
条件三:张某能查询媒体(10)个,这10个媒体中有10000条新闻
条件四:张某能查询上面三个条件下最近一周的新闻
注:可能条件一里边查询的新闻同时存在于条件二、条件三中
条件二里边查询的新闻同时存在于条件一、条件三中
条件三里边查询的新闻同时存在于条件一、条件二中
。。。
如何优化,让其按照上诉条件快速高效的显示 展开
6个回答
展开全部
很简单,最终查询的结果是新闻,所以新闻表是你的主要查询表
企业、品牌、媒体这三个都是条件
我认为,你的新闻表中应该有两种形式,
一是同时包括三种条件,包括企业、品牌、媒体代码、新闻标题、内容等关键字段
查询的时候sql语句非常简单,就是select 新闻 from 新闻表 where 企业 in (条件)or 品牌 in (条件)or 媒体 in (条件)
这样一个不好就是新闻库过大,但是因为没有做表关联查询,所以速度非常快
二是仅包括一种条件,新闻分别在3个表中保存
查询的时候需要union联合查询,这样的优势是每个表都相对较小,如果用户只查询一个条件,那查询工作量会非常低。
select 新闻 from 新闻表1 where 企业 in (条件)
union select 新闻 from 新闻表2 where 品牌 in (条件)
union select 新闻 from 新闻表3 where 媒体 in (条件)
好了,你会发现,通过这两种sql,实际上主要工作集中在前台界面的开发上,需要能根据用户的选择有效地拼写sql语句。
至于用户权限,这个是权限表的事情,与查询结果的速度无关,只涉及到能生成哪些条件
不明白再问我
企业、品牌、媒体这三个都是条件
我认为,你的新闻表中应该有两种形式,
一是同时包括三种条件,包括企业、品牌、媒体代码、新闻标题、内容等关键字段
查询的时候sql语句非常简单,就是select 新闻 from 新闻表 where 企业 in (条件)or 品牌 in (条件)or 媒体 in (条件)
这样一个不好就是新闻库过大,但是因为没有做表关联查询,所以速度非常快
二是仅包括一种条件,新闻分别在3个表中保存
查询的时候需要union联合查询,这样的优势是每个表都相对较小,如果用户只查询一个条件,那查询工作量会非常低。
select 新闻 from 新闻表1 where 企业 in (条件)
union select 新闻 from 新闻表2 where 品牌 in (条件)
union select 新闻 from 新闻表3 where 媒体 in (条件)
好了,你会发现,通过这两种sql,实际上主要工作集中在前台界面的开发上,需要能根据用户的选择有效地拼写sql语句。
至于用户权限,这个是权限表的事情,与查询结果的速度无关,只涉及到能生成哪些条件
不明白再问我
追问
很感谢你的回答!
我也知道你说的那种方式,但是因为数据量很大,查询出来很慢,怎么做让它快速查询出来,这是我想要的答案。
在数据库里边只插入了600W+的测试数据,就一个select count(0) from tablename 都需要30秒左右。更别说耗性能的in、untion了
追答
估计你也精通数据库这方面。其实影响速度有两个原因,一是条件和索引设置不合理,二是语句编写不合理。咱们不做学术讨论,常见查询慢是因为sql语句引用了过多的连接、聚合啥的。给你的sql已经是最简单的了,union作为一种联合查询的方式,相当于执行几条查询语句,他的快慢,完全是服务器性能的原因,这个已经不能再优化了。
如果你的服务器保存千万级数据过慢,而且不愿意升级服务器的话,还有一个方法能加快速度!
就是你把数据再拆分,分成更小的粒度,那么每次查询只检查一个表或者几个表,比从所有数据中找要快得多。我推荐union方式也是基于此。
举个例子,你的企业分行业、分地域、分规模,就能拆成3个表,还能拆的更细。最后每个表里面保存的数据不过10万条,速度提升上百倍,你仔细想想
为什么呢?因为每次查询,只会查询很少的信息,查的多,就要有多等的耐心。
这样拆分后,你的程序要稍微复杂点,对应不同的表操作。很多程序都是这样的,比如财务信息,每年会生成一个新表,不然过多的数据也会影响性能。更别说邮政和电信之类的企业了,服务器都分区域放置。
优化查询,首先要优化数据表,然后是优化索引,最后才是优化语句。没有好的结构,只能用比较费力的语句来处理了,你说呢?
展开全部
建立一个 聚合索引 索引包含的字段就是你查询条件里的字段,
条件用得最多的排在最前面,
通过不断的查询比较,调整索引里字段的排列位置,比较所需的时间,最终确定索引的顺序.
条件用得最多的排在最前面,
通过不断的查询比较,调整索引里字段的排列位置,比较所需的时间,最终确定索引的顺序.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
由于对目标数据库,表的不了解,只能写点一般思路
create login 张某 with password='123456'
--数据库
create database MyCompany
create user 张某_MyCompany for login 张某
--表:
--100个企业表
create table company
(
。。。
)
--通过 虚拟表 限定查询字段
create view view_company
as
select aa,bb,cc,dd,ee from company
go
select * from view_company
grant select on view_company to 张某_MyCompany
条件二,条件三同理
--1000个品牌
create table brand
(
。。。
)
create view view_brand
as
select aa,bb,cc,dd,ee from brand
go
select * from view_brand
grant select on view_brand for 张某_MyCompany
--10个媒体
create table media
(
。。。
)
create view view_media
as
select aa,bb,cc,dd from media
go
select * from view_media
grant select on view_media for 张某_MyCompany
--条件四
select DateAdd(day,-7,getdate()) from view_company a,view_brand b,view_media c where a.id=b.id and b.id=c.id
create login 张某 with password='123456'
--数据库
create database MyCompany
create user 张某_MyCompany for login 张某
--表:
--100个企业表
create table company
(
。。。
)
--通过 虚拟表 限定查询字段
create view view_company
as
select aa,bb,cc,dd,ee from company
go
select * from view_company
grant select on view_company to 张某_MyCompany
条件二,条件三同理
--1000个品牌
create table brand
(
。。。
)
create view view_brand
as
select aa,bb,cc,dd,ee from brand
go
select * from view_brand
grant select on view_brand for 张某_MyCompany
--10个媒体
create table media
(
。。。
)
create view view_media
as
select aa,bb,cc,dd from media
go
select * from view_media
grant select on view_media for 张某_MyCompany
--条件四
select DateAdd(day,-7,getdate()) from view_company a,view_brand b,view_media c where a.id=b.id and b.id=c.id
追问
非常感谢。
可是这并不是我想要的结果。可能是我的问题没有描述清楚吧。
比如说,企业字段:id,name;品牌字段:id,name;媒体:id,name;
新闻字段:企业id,品牌id,媒体id,新闻标题,新闻内容;
假设表有这些,而且,企业表里边的100个企业ID已经得到,品牌表里边的1000个品牌ID也得到,媒体表里边的10个媒体ID已得到。时间是最近一周,根据他们的ID做为条件查询新闻表里边的数据。查询数据量很大,怎么优化让查询变快
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
聚合索引 索引包含的字段就是你查询条件里的字段,
条件用得最多的排在最前面,
通过不断的查询比较,调整索引里字段的排列位置,
条件用得最多的排在最前面,
通过不断的查询比较,调整索引里字段的排列位置,
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询