我有一个观点:
create view dbo.vMainTable
as
select MT.* from dbo.Table1 T1 with(index(dbo_Table1_UQ))
inner loop join dbo.MainTable MT with(index(dbo_MainTable_PK))
on T1.ID = MT.Table1_ID
go
在查询视图时,如果ANSI_NULLS
和QUOTED_IDENTIFIERS
设置为OFF
,则会收到以下错误。
Query processor could not produce a query plan because of the hints
defined in this query. Resubmit the query without specifying any hints and
without using SET FORCEPLAN.
将它们切换为ON
会使错误消失。在这个特定的观点中我有什么遗漏吗?
column_name = NULL
而不是column_name IS NULL
,如果我将这两者都切换到ON
,这将会中断。我一直在寻找能够处理这种情况的解决方案。
答案 0 :(得分:1)
with(index(dbo_Table1_UQ))
和with(index(dbo_MainTable_PK))
结构是提示(就像您在WITH(...)
中看到的任何内容一样)
SQL Server告诉您,如果ANSI_NULLS
和/或QUOTED_IDENTIFIERS
设置为OFF
,则必须删除with(index(dbo_Table1_UQ))
和{{1} }。
查询/视图通常不需要提示,并且会插入提示以优化查询的性能。您可以通过省略它们来找到改进的性能,但必须根据具体情况进行评估。如果您在SSMS中测试查询并显示执行计划和查询性能,则可以自行评估是否需要这些with(index(dbo_MainTable_PK))
语句。
答案 1 :(得分:1)
正如@Damien_The_Unbeliever所建议的,我对所有脚本进行了ANSI_NULL
和QUOTED_IDENTIFIERS
转换为ON
的重大更改,并确保它们不会被转换{{ 1}}任何地方。谢谢。