日期:2014-05-18  浏览次数:20691 次

如何分析查询语句的效率好不好?不知道我写的怎么样。
是这样的,客户要提取数据,查看用户的清单。4个主要数据表,都是>10万的表,还有近10多张代码表,
要显示70个字段,查询条件为两个时间范围。
他们总说超时,提不到数据,
我在数据库测试了下过程,
22326条记录,耗时2分59秒
请问怎么看这个执行的效率是不是高,还是本来就需要这么长的时间呢?

我在大的数据表上也建立了索引。为了显示按时间搜索的用户的完整记录用了LEFT JOIN ,
按时间范围得到一个表,然后跟所有的代码表用LEFT JOIN ,
不知道怎么优化。


------解决方案--------------------
--重复了一个.
2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。 
3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。 特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。 
4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。 
47、分析select emp_name form employee where salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。

------解决方案--------------------
SQL code
USE [education]
GO
/****** 对象:  Table [dbo].[课程信息]    脚本日期: 10/26/2007 08:59:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[课程信息](
    [课程编号] [varchar](14) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [课程名称] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [拼音码] [char](6) COLLATE Chinese_PRC_CI_AS NULL,
    [本学期课程] [char](2) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [开课系别] [varchar](14) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [理论学分] [smallint] NOT NULL,
    [实践学分] [smallint] NULL CONSTRAINT [DF_课程信息_实践学分]  DEFAULT ((0)),
    [适用教室类型] [nchar](2) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [备选教室类型] [nchar](2) COLLATE Chinese_PRC_CI_AS NULL,
    [教授人数] [smallint] NULL,
    [课程类别] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_课程信息] PRIMARY KEY CLUSTERED 
(
    [课程编号] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[课程信息]  WITH CHECK ADD  CONSTRAINT [FK_课程信息_课程类别代码表] FOREIGN KEY([课程类别])
REFERENCES [dbo].[课程类别代码表] ([编号])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[课程信息] CHECK CONSTRAINT [FK_课程信息_课程类别代码表]

------解决方案--------------------
mark
------解决方案--------------------
LZ 把你最耗时的语句贴出来看看
------解决方案--------------------
mark
------解决方案--------------------
细细看看LS贴的那些大段 还是会有不少收获的