我有一个 qeuery 检查两列在哪里不是''(空白) - [在这种情况下空白和 NULL 不一样]
有没有办法提高查询的性能
SELECT *
FROM myTable
WHERE Currency <> ''
AND Country <> ''
据我了解,<>
是否导致了完整的表扫描?
我有一个 qeuery 检查两列在哪里不是''(空白) - [在这种情况下空白和 NULL 不一样]
有没有办法提高查询的性能
SELECT *
FROM myTable
WHERE Currency <> ''
AND Country <> ''
据我了解,<>
是否导致了完整的表扫描?
这些列上有索引吗?对于这样的问题,这是相当重要的信息。如果根本没有索引覆盖这些列中的任何一个,那么除了表扫描以匹配这些过滤器外,它什么也做不了。
如果至少有一个索引涵盖它可以使用的一个(或两个),则由于
SELECT *
. 如果索引的选择性表明许多行将匹配,那么表扫描实际上可能比索引查找/扫描加上行查找更有效,以获取索引中未包含的其余数据。例如,如果我跑
在我们的一个系统上,它只执行索引查找。跑步
而是执行表扫描。如果我强制选择索引
它执行索引查找以定位记录的开头,然后执行 RID 查找以查找所有其他列数据。根据查询计划输出,它判断这比只进行表扫描的成本高出约 6 倍,上面三个查询的估计成本分别为 0.22926、1.81429 和 11.1612。在这种情况下,与子句匹配的行数
WHERE
约为 50,000 的 55%。我假设您使用的是 SQL Server(那里有 T-SQL 参考)。
当您执行 T-SQL 时,您可以选择包括实际的执行计划,这将允许查看SQL 是如何执行的,包括是否进行了扫描。在此执行计划中,SQL 甚至可能会提示您如何提高您可能会或可能不会决定采用的性能。
http://technet.microsoft.com/en-us/library/ms189562.aspx http://sqlserverplanet.com/optimization/execution-plans
希望这可以帮助!
您可以使用“大于”而不是“不等于”。
如果没有谓词,则返回四行;与,三个。这是期望的结果。
这假设是西方风格的整理。否则进行测试以查看返回的内容。
当然,优化器可能仍会根据许多标准选择不使用索引。