本文转载自微信公众号《SQL数据库开发》,作者,平凡的世界。转载本文请联系SQL数据库开发公众号。为什么别人的查询只需几秒钟,而你的查询语句短则十几秒,长则十几分钟甚至几小时?与你的查询语句是否高效有很大关系。今天我们就来看看如何编写更高效的查询语句。1、尽量不要使用NULL作为默认值。如果索引列上存在NULL值,则索引将失败并降低查询速度。如何优化呢?例如:SELECT*FROM[Sales].[Temp_SalesOrder]WHEREUnitPriceISNULL我们可以将NULL的值设置为0或者其他固定值,这样索引就可以持续有效。SELECT*FROM[Sales].[Temp_SalesOrder]WHEREUnitPrice=0这是重写的查询语句,效率会比上面快很多。2、尽量不要在WHERE条件语句中使用!=或<>。在WHERE语句中使用!=或<>也会使索引失效,然后进行全表扫描,耗时较长。3.尽量避免在WHERE子句中使用OR。在OR的情况下,我们可以用UNIONALL改写OR。例如:SELECT*FROMT1WHERENUM=10ORNUM=20可以改写为SELECT*FROMT1WHERENUM=10UNIONALLSELECT*FROMT1WHERENUM=204.IN和NOTIN也要慎用。当遇到连续的精确值时,我们可以使用BETWEENAND进行优化。例如:SELECT*FROMT1WHERENUMIN(5,6,7,8)可以改写为:SELECT*FROMT1WHERENUMBETWEEN5AND8.5。查询中的IN可以使用EXISTS代替子查询中经常使用的IN。如果关联查询换成EXISTS会更快。例如:SELECT*FROMT1WHEREORDER_IDIN(SELECTORDER_IDFROMORDERWHEREPRICE>20);可以改写为:SELECT*FROMT1ASAWHEREEXISTS(SELECT1FROMORDERASBWHEREA.ORDER_ID=B.ORDER_IDANDB.PRICE>20)虽然代码量可能比上面多一点,但是从使用效果上来说会比上面的查询要好。6、模糊匹配模糊查询尽量使用后匹配,使用LIKE时尽量使用后匹配,会使用索引,减少查询时间。比如:SELECT*FROMT1WHERENAMELIKE'%李四%'或者SELECT*FROMT1WHERENAMELIKE'%李四'都不会去索引,只有SELECT*FROMT1WHERENAMELIKE'李四%'才会去索引。以上都是大家经常遇到的,直接告诉大家如何操作。大家可以下去做个实验试试看。今天就到此为止。如果您有任何问题,请在下方留言。
