各位大神好,想请教一个数据库优化的问题:
表结构如下,
目前遇到的问题是这样的,根据巡店表来统计口味信息,本来很简单的一个sql如下:
SELECT DISTINCT f.NAME,v.ID FROM dbo.VISITS AS v
INNER JOIN dbo.CPR_FORM_DATAS AS cfd ON cfd.VISITID=v.ID
INNER JOIN dbo.FORMS f ON cfd.FORM_ID=f.ID
WHERE v.ID=2014052209530840802272
巡店表ID有聚集索引,巡店详情表VISITID也有非聚集索引,但是就是非常慢(一条数据也需要4s),(问题1,想问下,这是否跟VISITID字段的数据类型有关呢?),后来我就修改成如下:
SELECT DISTINCT f.NAME,v.ID FROM dbo.VISITS AS v INNER JOIN
dbo.CPR_Visit_PromotionTable AS cvp ON cvp.VisitId=v.ID
INNER JOIN dbo.CPR_FORM_DATA_VISIT_P_T_ID AS cfdvpt ON cfdvpt.CPR_Visit_PromotionTable_ID=cvp.ID
INNER JOIN dbo.CPR_FORM_DATAS AS cfd ON cfd.ID=cfdvpt.CPR_FORM_DATA_ID
INNER JOIN dbo.FORMS f ON cfd.FORM_ID=f.ID
WHERE v.ID IN(SELECT ID FROM dbo.VISITS WHERE USER_ID='2538')
增加了两个表查找,是通过巡店表ID查找的,速度大幅度提升,数据少一秒内就能查出来,但是如果据
量大量,时间仍然会呈现指数型增长,
问题2,想问下,巡店详情表的ID(目前是唯一非聚集索引),是否有必要修改成聚集索引呢,虽然是唯一的,但是不是有序的。
麻烦各路大神给看下,万分感谢!
你s试试在FORMS表中 新建一个 ID并包含Name的非聚集索引
问题一:
是,建议你转下数据格式,一般来说数字比较的速度较快
或者你试下:
SELECT DISTINCT NAME FROM dbo.FORMS WHERE ID=2014052209530840802272
CPR_FORM_DATAS 里面的数据你根本就没用到,如果用到且每次只取一条数据的话建议用子查询
问题一:
没必要,建立非聚集索引已经对该列进行了排序,只不过数据并没有按该列排序
试试视图来连接