ляво присъединяване - безкраен цикъл (никога не се връща)

Имам таблица и един сложен изглед със следния брой редове

cpi на таблицата - брой редове = 74559 изглед most_recent - брой редове = 69832

тогава се опитах да направя следната заявка

SELECT DISTINCT TOP 201 cpi.cbuno,  cpi.casebook, v.status_uno
 FROM CPI cpi 
 inner JOIN most_recent v ON v.cbuno=cpi.cbuno
 where isnull(v.status_uno, -1) = 669

и бързо имам резултати. след това го опитах с ляво съединение, както следва

SELECT DISTINCT TOP 201 cpi.cbuno,  cpi.casebook, v.status_uno
 FROM CPI cpi 
 left JOIN most_recent v ON v.cbuno=cpi.cbuno
 where isnull(v.status_uno, -1) = 669

тогава преминава през безкраен цикъл...никога не връща стойност. и още нещо, което трябва да спомена, ако използвам v.status_uno = 669 вместо (v.status_uno, -1) = 669 в клауза where, това преминава през същия безкраен цикъл. Имате ли представа за това?

Оценявам помощта ти

благодаря, Кет


person keth    schedule 06.05.2013    source източник
comment
здравей Олаф, да, това е правописна грешка, съжалявам за това..току-що го поправих, благодаря   -  person keth    schedule 06.05.2013
comment
колко нули имате в most_recent.cbuno и most_recent.status_uno?   -  person Alex Turbin    schedule 06.05.2013
comment
няма null в most_recent.cbuno, но има 25 реда с null за most_recent.status_uno   -  person keth    schedule 06.05.2013
comment
Колко реда наскоро? Това е по-скоро проблем с производителността. Не вярвам, че можете да получите безкраен цикъл в SQL. Но можете да имате изключително неефективни заявки   -  person Justin Pihony    schedule 06.05.2013


Отговори (1)


Може би...

SELECT DISTINCT TOP 201 cpi.cbuno,  cpi.casebook, v.status_uno
 FROM CPI cpi 
 LEFT JOIN most_recent v 
   ON v.cbuno=cpi.cbuno 
     and v.status_uno=669
person xQbert    schedule 06.05.2013
comment
Здравейте xQbert, благодаря за отговора. Да, опитах това, но без успех - person keth; 06.05.2013
comment
и двете таблици имат колона с име cbuno и двете таблици имат тази колона индексирана или настроена като връзка първичен/чужд ключ, нали? в този момент ще трябва да видим резултати от анализ на заявка (какви индекси използва, дали прави сканиране на таблица и къде и т.н. - person xQbert; 06.05.2013
comment
most_recent е изглед, а не таблица, а CPI.cpi е първичният ключ за CPI таблица и има pk индекс - person keth; 06.05.2013
comment
Гледката вероятно е проблемът. Освен ако не е индексиран изглед, не можете да поставите индекс върху него и той няма да използва индекси. Така че лявото съединение трябва да направи пълно сканиране на таблица за всеки от записите в таблицата. Така че трябва да съедини всеки ред 69832 пъти. всички без ползата от индекс. Вместо това погледнете създаването на индексиран изглед само гледка и гледайте как изпълнението се издига. от това да не се налага да генерирате декартово над 5 милиарда записа. или msft връзка - person xQbert; 06.05.2013