SQL语句优化(续)

chenxw_mail 2007-09-25 10:08:17
select * from (select mobileNo,...,rownumber() over(order by id) as m from tbizdetail where cast(optTime as varchar(10)) between '2007-07-13' and '2007-07-13' and (branchName ='' or branchName = '广州' or branchName = '深圳') and (bizName ='套餐办理情况查询' or bizName = '开通国际长途情况查询') and (brandName ='动感地带' or brandName = '神州行' or brandName = '全球通')) as a where a.m between 1 and 30

上面是后台打印的SQL语句,tbizdetail表已经有1亿条记录。
or条件中,branchName最多有21个,brandName最多有5个,bizName有三、四百个
用的是db2,分页是这样子吧?都是Varchar类型

请问上面的语句会导致索引失效吗?各位有没有什么好的解决方案啊?投入运行的时候,效率实在太慢了,难以忍受
...全文
214 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
晓风残月0110 2007-09-25
  • 打赏
  • 举报
回复
union跟or应该差不多
chenxw_mail 2007-09-25
  • 打赏
  • 举报
回复
索引是有的,不过union跟or应该差不多,也不太可能把每个or都换成union all,倘若是那样,光是一条sql语句就能刷满屏了
plsandslp 2007-09-25
  • 打赏
  • 举报
回复
你把optTime加上索引然后把or都换成union试试
chenxw_mail 2007-09-25
  • 打赏
  • 举报
回复
救命啊
plsandslp 2007-09-25
  • 打赏
  • 举报
回复
不要用select * 感觉好像没有用到索引的问题
chenxw_mail 2007-09-25
  • 打赏
  • 举报
回复
已经试过用in了,反而慢几秒
db2的分页语句就是这个,应该没问题的,分页是后话,问题是查询出来都很慢啊
dawugui 2007-09-25
  • 打赏
  • 举报
回复
TOP n 实现的通用分页存储过程

CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT --总页数
AS
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
dawugui 2007-09-25
  • 打赏
  • 举报
回复
上面是后台打印的SQL语句,tbizdetail表已经有1亿条记录。
or条件中,branchName最多有21个,brandName最多有5个,bizName有三、四百个
用的是db2,分页是这样子吧?都是Varchar类型

把这三个内容放到三个表里,然后用IN试试
branchName
brandName
bizName

playwarcraft 2007-09-25
  • 打赏
  • 举报
回复
喔,是db2的,不懂....頂下
playwarcraft 2007-09-25
  • 打赏
  • 举报
回复
分頁,還是用top比較好吧
chenxw_mail 2007-09-25
  • 打赏
  • 举报
回复
第一个子句用不到索引的话,会导致后面的索引失效吗?
playwarcraft 2007-09-25
  • 打赏
  • 举报
回复
MS第1句就用不到索引了
cast(optTime as varchar(10)) between '2007-07-13' and '2007-07-13'

bizName有三、四百个
这個強悍.....
sugartang2007 2007-09-25
  • 打赏
  • 举报
回复
问题没有解决,分数回收
chenxw_mail 2007-09-25
  • 打赏
  • 举报
回复
我顶~
Database Tour是一款专业的通用数据库查看、编辑和打印数据工具软件。软件功能强大,内建查询工具,方便书写SQL语句。增强数据网格,方便查看和维护数据。可以创建删除修改BDE别名。支持命令行参数。支持搜索替换文本。支持包括Paradox, dBase, FoxPro, ASCII, InterBase, Oracle, SQLServer, MS Access 95-97等主流数据库软件。是用户实现数据管理功能的好帮手。需要的朋友快来下载吧! Database Tour特点 1. 全新高效的网络内核,快速稳定,高速下载时依然保持很少的CPU占用。 2. 自动为不同的连接优化,默认配置即可获得良好性能。 3. 支持多任务同时下载,并支持对一个Torrent中的文件有选择的下载,允许设定文件下载优先级。 4. 可以限制上传速度、下载速度,避免影响其他网络程序。(ADSL和上传受ISP限制用户建议设定最大上传以提高性能) 5. 智能连接优化(IntelligentConnectionOptimize)技术,自动为不同的网络连接进行优化,默认配置即可获得良好性能。 6. 智能速度控制(IntelligentRateControl)技术,自动优化上传分配以获得最佳下载速度。 7. 智能磁盘缓存(IntelligentDiskCache)技术,牺牲内存占用为代价有效减小高速下载上传对硬盘的损伤。 8. 智能磁盘分配(IntelligentDiskAllocating)技术,有效减少磁盘碎片产生。 9. 智能文件扫描(IntelligentHashScan)技术,传作种均无需再次扫描文件。 10. 聊天系统允许用户与其他下载者聊天,支持群聊、私聊。(v0.53的新功能,默认关闭) 11. 支持临时和永久封IP,永久IP规则的配置文件兼容eMule的ipfilter.dat。 12. 只需一个TCP监听端口即可满足所有下载上传需要。 13. 自动防火墙配置,自动配置XP网络连接防火墙(ICF)和网络连接共享(ICS)。 14. 自动端口映射,采用UPnP技术实现内网免配置(要求路由器支持UPnP,操作系统至少XP)。 15. 支持多Tracker协议,UTF-8扩展,UDP Tracker协议。 16. 多语言界面。 17. 无需安装,但也提供安装包。 18. 自动检查版本更新。 Database Tour截图
Powerbuilder 9.0实用教程》源代码 1.本源代码包括以下章节源代码: 第01章 认识PowerBuilder 9.0、第05章 创建应用程序、第06章 创建窗体、第07章 创建菜单和工具栏、第10章 应用程序的调试和发布、第11章 典型小型实例赏析、第12章 图书管理系统实例和第13章 学生选课系统实例。 2.源代码使用方法参见《附录A 源代码的使用方法》文件。 __________________________________________________________________ 注意: 1.建议读者下载源文件后,将该源文件进行备份,读者使用副本源文件进行学习,这样一但出问题就不用再从网上下载了。 2.将源文件中“数据库文件”文件夹一定要复制到C盘根目录下,这样才能保证您连接数据库文件成功,具体方法参见《附录A 源代码的使用方法》。 对于书中源代码除了数据库外其他都能正常使用,而示例中数据库需要用户在自己的计算机上注册后才能使用,如果不注册数据源就运行应用程序是检索不到任何数据的,下面以连接学生选课系统数据库为例具体介绍如何连接数据库文件。 第1章 认识PowerBuilder 9.0 1 1.1 PowerBuilder 9.0简介 1 1.1.1 中国软件业现状 1 1.1.2 为什么要学习PowerBuilder 9.0 2 1.1.3 PowerBuilder的概述 2 1.1.4 PowerBuilder的特点 3 1.1.5 PowerBuilder 9.0的新特性 6 1.2 安装PowerBuilder 9.0软硬件需求 9 1.2.1 软件环境需求 9 1.2.2 硬件环境需求 9 1.3 PowerBuilder 9.0功能界面介绍 10 1.3.1 PowerBuilder 9.0界面简介 10 1.3.2 常用功能菜单 10 1.4 工作环境设置 16 1.4.1 工具栏的设置 16 1.4.2 窗口排列 19 1.4.3 快捷键设置 20 1.4.4 系统选项设置 21 1.5 用5分钟制作一个简单实例 22 1.5.1 实例运行界面 22 1.5.2 新建一个工作空间对象 22 1.5.3 新建一个应用程序对象 23 1.5.4 创建窗体 23 1.5.5 为应用程序添加open事件代码 25 1.6 小结 27 1.7 习题 27 第2章 编程基础知识 28 2.1 PowerScript脚本语言书写规则 28 2.1.1 忽略大小写 28 2.1.2 语句的断行、行和分割 28 2.1.3 注释 29 2.2 数据类型 29 2.3 变量和作用域 30 2.3.1 定义变量 30 2.3.2 引用变量 30 2.3.3 变量的作用域 30 2.4 操作符 31 2.5 标识符 32 2.5.1 标识符的构成 32 2.5.2 匈牙利命名法 32 2.6 常用代词 33 2.7 控制语句 34 2.7.1 判断语句 34 2.7.2 循环语句 36 2.8 结构 38 2.8.1 创建结构 38 2.8.2 使用结构 40 2.9 函数 40 2.9.1 Open()和Close()函数 41 2.9.2 MessageBox()函数 41 2.9.3 类型转换函数 41 2.9.4 类型判断函数 42 2.9.5 其他函数 42 2.10 ODBC数据源与专用数据库接口 43 2.10.1 什么是ODBC数据源 43 2.10.2 专用数据库接口 43 2.10.3 连接数据库 44 2.10.4 配置ODBC 48 2.11 SQL语言 49 2.11.1 SQL语言的格式 49 2.11.2 在PowerBuilder 9中使用SQL语句 51 2.12 类和对象的概念 56 2.12.1 继承 57 2.12.2 重载和多态性 57 2.12.3 封装 57 2.12.4 属性、事件和函数 57 2.13 在PowerBuilder 9.0中实现面向对象编程 58 2.13.1 创建对象 58 2.13.2 设置对象属性 59 2.13.3 编写事件代码 59 2.13.4 实现继承对象 60 2.14 用户对象和用户事件 61 2.14.1 用户对象分类 61 2.14.2 定义用户对象 62 2.14.3 使用用户对象 64 2.14.4 用户事件 66 2.15 小结 67 2.16 习题 68 第3章 创建数据库 69 3.1 数

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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