Tengo tres tablas:Método abreviado de ejecución SQL Query O lógica?
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
tiene, a lo sumo, una docena de pocos registros. BigTable
tiene algunos millones, y en realidad es una vista que SINDICA una tabla en esta base de datos con una tabla en otra base de datos en el mismo servidor.
Aquí es unirse a la lógica:
SELECT * FROM
SmallTable s
INNER JOIN JoinTable j ON j.SmallTableID = s.ID
INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
(s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
AND (s.flag2=1 OR b.text1 <> 'value1')
media unió tamaño es unos pocos miles de resultados. Todo lo que se muestra está indexado.
Para la mayoría de los registros SmallTable
, flag1
y flag2
se ponen a 1
, por lo que no hay realmente ninguna necesidad incluso de acceder al índice de BigTable.text1, pero SQL Server de todos modos, lo que lleva a una exploración indexado costoso y bucle anidado.
¿Hay una mejor manera de hacer alusión a SQL Server que, si flag1
y flag2
se establecen en 1
, debería ni siquiera se molestó en mirar a text1
?
En realidad, si puedo evitar la unión a BigTable por completo en estos casos (joinTable se gestiona, así que esto no crearía un problema), que haría esta consulta clave aún más rápido.
+1 para la pregunta interesante. ¡Espero aprender más de esto yo mismo! – AdaTheDev
Mencionó un análisis de índice en 'BigTable', que es una vista. ¿Es una vista indexada, o la exploración de índice se realiza en las tablas subyacentes? ¿Podría publicar el plan de consulta aquí? – Quassnoi