SELECT [FName],[FCity]
,[FAge]
,[FSalary]
FROM T_Person
WHERE FSalary > 50000
AND FPosition= ‘MANAGER’
AND 25 < (SELECT COUNT(FName) FROM T_Manager
WHERE FManagerId=2);
我们将子查询的条件放到最前面,下面的SQL语句性能比较好:
SELECT [FName],[FCity]
,[FAge]
,[FSalary]
FROM T_Person
WHERE
25 < (SELECT COUNT(FName) FROM T_Manager
WHERE FManagerId=2)
AND FSalary > 50000
AND FPosition= ‘MANAGER’ ;
SELECT语句中避免使用'*'
对于SELECT * FROM TABLE这种方式,我想很多人都会这么去查询。WHY?一方面是因为系统的数据量级别还比较低,二来也图方便。但是随着项目的数据量疯长,系统的性能急速下降之后,优化的每一种方式都需要引起我们的重视。像查询这种方式来讲,如果不用检索出所有列的情况,尽量指定查询的列。这能有效减轻网络的负载和服务器资源的消耗。即使确实需要检索所有列,也不要使用SELECT *,因为这是一个非常低效的方法,DBMS在解析的过程中,会将*依次转换成所有的列名,这意味着将耗费更多的时间。在SQL Server Management Studio工具里面查询图省事,数据量不大我觉得还是可以的:),但至少在代码里面是不建议这么处理。
SELECT [FName],[FSalary],[FNumber] FROM T_Employee
WHERE FNumber> 0
AND FDEPTNO IN (SELECT FNumber
FROM T_Department
WHERE FMangerName = 'Tome')
语句 2:
SELECT [FName],[FSalary],[FNumber] FROM T_Employee
WHERE FNumber > 0
AND EXISTS (SELECT 1
FROM T_Department
WHERE T_Department. FDEPTNO = T_Employee.FNumber
AND FMangerName = ‘MELB’)
SELECTACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS1
WHERE TRAN_DATE = '20010101'
UNION
SELECTACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS2
WHERE TRAN_DATE ='20010102'
语句2:
SELECTACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS1
WHERE TRAN_DATE ='20010101'
UNION ALL
SELECTACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS2
WHERE TRAN_DATE = '20010102'
SELECT FId,FAge,FName
FROM T_Person
WHERE FAge=10
在这个SQL 语句中,将字符串类型字段FLevel 与数值10 进行比较,由于在大部分数据库中隐式转换类型中数值类型的优先级高于字符串类型,因此DBMS会对FAge字段进行隐式类型转换,相当于执行了下面的SQL语句:
SELECT FId,FAge,FName
FROM T_Person
WHERE TO_INT(FAge)=10
由于在索引字段上进行了计算,所以造成了索引失效而使用全表扫描。因此应将SQL语句做如下修改:
SELECT FId,FAge,FName
FROM T_Person
WHERE FAge='10'
防止检索范围过宽
如果DBMS 优化器认为检索范围过宽,那么它将放弃索引查找而使用全表扫描。下面是几种可能造成检索范围过宽的情况:
使用IS NOT NULL或者不等于判断,可能造成优化器假设匹配的记录数太多。
使用LIKE 运算符的时候,"a%"将会使用索引,而"a%c"和"%c"则会使用全表扫描,因为"a%c"和"%c"不能被有效的评估匹配的数量。