我有一个带有数字字段的表格,如下所示:
table invoices (
inv_number varchar(20),
amount numeric(13,2),
amount_remaining numeric(13,2) )
我经常要查询此表以提取零值或非零值的记录。
select invnumber from invoices
where amount_remaining=0
... or ...
where amount_remaining!=0
我知道最好的方法是添加一个预先计算的布尔字段,
但我无法触及表格结构(无法添加字段)。
我只能处理索引或视图。
在这个数字字段上添加索引只是为了过滤零/非零值是不是一个好主意?
有什么建议吗?
答案 0 :(得分:1)
我知道最好的方法是添加一个预先计算的布尔字段
完全没有。这对任何事都没有帮助。
select invnumber from invoices
where amount_remaining=0
... or ...
where amount_remaining!=0
此查询不可搜索。任何可能的优化都将完全取决于WHERE子句中的其他内容。除非存在sargable表达式,否则查询需要完整扫描,因此无法进行任何有关优化它的讨论。
在这个数字字段上添加一个索引只是为了过滤零非零值是个好主意吗?
没有。您还具有条件where amount_remaining=0 ...
,因此索引无效。
最终你有非感性的状况。您需要满足谓词或否定谓词的记录。根据定义,这将始终是一切(不考虑三值NULL逻辑)。您询问过滤后的索引是否有帮助。过滤后的索引可以帮助WHERE子句的两个部分之一,但不能同时帮助它们。
select invnumber from invoices
where amount_remaining=0 and ...;
如果amount_remaining=0
的记录百分比
ammount_remaning=0
的过滤索引会对此有所帮助。
或强>
select invnumber from invoices
where amount_remaining!=0 and ...;
如果amount_remaining!=0
ammount_remaning!=0
的过滤索引会对此有所帮助。
显然,你不能同时将两个标准都设为“小百分比”。
如果你寻找一个好的索引,你将不得不在WHERE子句的其他部分中搜索,一些不表达,同时,谓词及其否定的部分。
答案 1 :(得分:0)
index不用于过滤器,是的视图将用于此目的。您可以使用筛选数据的条件创建视图。
索引用于快速搜索,就像我们在书中使用索引一样。
<强>更新强> 是的,您可以在上面的列上给出非聚集索引,从而获得更快的结果。
CREATE NONCLUSTERED INDEX IX_Tablename_ColumnName
ON Databasename.Tablename (columnname);