现在就要对标本的表下手了。
对查询所需要的两个字段speciesID和subspeciesID做了索引,但是发现执行计划中并没有利用到索引。查了半天,是因为语句中的“IN”造成的,于是将IN改为 EXISTS,于是语句变为
SELECT ID AS ResultCount
FROM Specimen_admin_specimen_T
WHERE (EXISTS (SELECT DISTINCT (Species_ID)
FROM View_All_Tree
WHERE genus_ID = '{F689E231-0DF5
(SpeciesID=Specimen_admin_specimen_T.SpeciesID or subSpeciesID=Specimen_admin_specimen_T.subSpeciesID))
,但是执行之后发现,仍然没有利用到索引,效率和IN所差无几。毛病出在什么地方呢?
在求助了很多人后,将SQL 语句改为
SELECT ID
FROM Specimen_admin_specimen_T
WHERE EXISTS
(SELECT Species_ID
FROM view_All_Tree
WHERE genus_ID = '{FDA6F11C-AC83-44FF-B6E9-345024907C73}' AND
Species_ID = specimen_admin_specimen_T.Species_ID)
UNION
SELECT ID
FROM Specimen_admin_specimen_T
WHERE EXISTS
(SELECT Species_ID
FROM view_All_Tree
WHERE genus_ID = '{FDA6F11C-AC83-44FF-B6E9-345024907C73}' AND
subSpecies_ID = specimen_admin_specimen_T.subSpecies_ID)
,问题解决,运行时间降到了1'以下。
----------------------
草草的写了一些,做为我学习SQL Server的一点小小的经验。
忽然发现,数据库真的是博大精深,我这种半路出家的还是任重而道远啊。
还有就是一些小小的心得:
1、IN、OUTER JOIN、LIKE的语句一定要慎重
2、合理利用索引
3、索引视图的应用
希望大家能提出更加好的修改意见,企盼大家的回复