情况:两个视图与一张临时表进行连接查询,使用inner join查询时奇慢无比,1万条记录,大概要10分钟查出
SET STATISTICS IO ON,忍了10分钟
(10562 行受影响)
表 'FLAG'。扫描计数 2,逻辑读取 330816 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_FLAG'。扫描计数 43648,逻辑读取 48361984 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY'。扫描计数 1,逻辑读取 74264 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 9829,逻辑读取 86518 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'temptable_2425be7ac4f1403f9b72fa238b6a6127'。扫描计数 1,逻辑读取 34 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,
lob 预读 0 次。
表 'COMPANY_BUILDING'。扫描计数 1,逻辑读取 72 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'BUILDING'。扫描计数 1,逻辑读取 27 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_PERSON'。扫描计数 1,逻辑读取 492 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON'。扫描计数 1,逻辑读取 1169 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON_FLAG'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'DEPARTMENT'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'USER'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'R_USER_DEPARTMENT'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_INVE_VISIT'。扫描计数 1,逻辑读取 385 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
使用inner merge join时间1分钟
inner merge join
警告: 由于使用了本地联接提示,联接次序得以强制实施。
(10562 行受影响)
表 'Worktable'。扫描计数 114950,逻辑读取 1299051 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'FLAG'。扫描计数 186690,逻辑读取 1058927 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_FLAG'。扫描计数 4,逻辑读取 4432 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY'。扫描计数 2,逻辑读取 2650 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_BUILDING'。扫描计数 1,逻辑读取 72 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'BUILDING'。扫描计数 1,逻辑读取 27 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'DEPARTMENT'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'USER'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'R_USER_DEPARTMENT'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_INVE_VISIT'。扫描计数 1,逻辑读取 385 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON_FLAG'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_PERSON'。扫描计数 1,逻辑读取 492 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON'。扫描计数 1,逻辑读取 1169 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'temptable_2425be7ac4f1403f9b72fa238b6a6127'。扫描计数 1,逻辑读取 34 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,
lob 预读 0 次。
inner loop join同样1分钟左右
警告: 由于使用了本地联接提示,联接次序得以强制实施。
(10562 行受影响)
表 'Worktable'。扫描计数 104389,逻辑读取 5579144 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'FLAG'。扫描计数 186690,逻辑读取 1058927 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_FLAG'。扫描计数 4,逻辑读取 4432 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY'。扫描计数 2,逻辑读取 2650 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_BUILDING'。扫描计数 1,逻辑读取 72 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'BUILDING'。扫描计数 1,逻辑读取 27 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'DEPARTMENT'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'USER'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'R_USER_DEPARTMENT'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_INVE_VISIT'。扫描计数 1,逻辑读取 385 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON_FLAG'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_PERSON'。扫描计数 1,逻辑读取 492 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON'。扫描计数 1,逻辑读取 1169 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'temptable_2425be7ac4f1403f9b72fa238b6a6127'。扫描计数 1,逻辑读取 34 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,
lob 预读 0 次。
inner hash join也是1分钟左右,看来不是inner join 能解决的问题
警告: 由于使用了本地联接提示,联接次序得以强制实施。
(10562 行受影响)
表 'Worktable'。扫描计数 104388,逻辑读取 1235680 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'FLAG'。扫描计数 186690,逻辑读取 1058927 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_FLAG'。扫描计数 4,逻辑读取 4432 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY'。扫描计数 2,逻辑读取 2650 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_BUILDING'。扫描计数 1,逻辑读取 72 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'BUILDING'。扫描计数 1,逻辑读取 27 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'DEPARTMENT'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'USER'。扫描计数 0,逻辑读取 98 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'R_USER_DEPARTMENT'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_INVE_VISIT'。扫描计数 1,逻辑读取 385 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON_FLAG'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_PERSON'。扫描计数 1,逻辑读取 492 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON'。扫描计数 1,逻辑读取 1169 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'temptable_2425be7ac4f1403f9b72fa238b6a6127'。扫描计数 1,逻辑读取 34 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,
lob 预读 0 次。
很奇怪,inner join难道不光这3种模式,还有一种默认的与以上两种不一样?
改用left join,查询结果相同,查询时间两秒钟
(10562 行受影响)
表 'Worktable'。扫描计数 31708,逻辑读取 1033264 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'FLAG'。扫描计数 2,逻辑读取 152308 次,物理读取 2 次,预读 1 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_FLAG'。扫描计数 4,逻辑读取 4432 次,物理读取 3 次,预读 1104 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'temptable_2425be7ac4f1403f9b72fa238b6a6127'。扫描计数 1,逻辑读取 34 次,物理读取 0 次,预读 34 次,lob 逻辑读取 0 次,lob 物理读取 0 次,
lob 预读 0 次。
表 'COMPANY'。扫描计数 2,逻辑读取 2650 次,物理读取 3 次,预读 1321 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_BUILDING'。扫描计数 1,逻辑读取 72 次,物理读取 1 次,预读 70 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'BUILDING'。扫描计数 1,逻辑读取 27 次,物理读取 1 次,预读 25 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_PERSON'。扫描计数 1,逻辑读取 492 次,物理读取 3 次,预读 488 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON'。扫描计数 1,逻辑读取 1169 次,物理读取 3 次,预读 1165 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'PERSON_FLAG'。扫描计数 1,逻辑读取 2 次,物理读取 2 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'DEPARTMENT'。扫描计数 0,逻辑读取 98 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'USER'。扫描计数 0,逻辑读取 98 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'R_USER_DEPARTMENT'。扫描计数 1,逻辑读取 2 次,物理读取 2 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'COMPANY_INVE_VISIT'。扫描计数 1,逻辑读取 385 次,物理读取 3 次,预读 381 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
明显可见,在使用left join 时间快了以后,COMPANY_FLAG表的逻辑读取次数由4000万次降到了4000次 XD
于是打开COMPANY_FLAG表,表列如下:ID,COMPANYID,FLAGID,均为GUID
在COMPANYID上建立非聚集索引,再次使用inner join查询,2秒钟
总结- -无论你查询语句怎么优化,还是不如建索引省事啊 M(_ _)M