SQL查询 - 20mil记录 - 返回信息的最佳实践

eqi*_*qiz 3 sql-server

我有一个SQL数据库,其中包含下表:

Table: PhoneRecords
--------------
ID(identity Seed)
FirstName
LastName
PhoneNumber
ZipCode

非常简单的直接表.该表有超过2000万条记录.我正在寻找最好的方法来执行查询,根据表中的区域代码提取记录.例如,这是我已经完成的示例查询.

SELECT phonenumber, firstname
FROM [PhoneRecords]
WHERE (phone LIKE '2012042%') OR
      (phone LIKE '2012046%') OR
      (phone LIKE '2012047%') OR
      (phone LIKE '2012083%') OR
      (phone LIKE '2012088%') OR
      (phone LIKE '2012841%')
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这是一个丑陋的查询,但它可以完成工作(如果我没有遇到超时问题)

有谁能告诉我速度/优化的最佳方法来执行上述查询以显示结果?目前,上述查询大约需要2个小时才能完成9gb 1600mhz ram,i7 930 quadcore OC'd 4.01ghz.我显然拥有执行此类查询所需的计算机能力,但查询仍然需要很长时间.

Lie*_*ers 6

您可能错过了phonenumber列的索引.

CREATE INDEX IX_PHONERECORDS_PHONENUMBER_FIRSTNAME 
  ON dbo.PhoneRecords (PhoneNumber) INCLUDE (FirstName)
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,请发布执行计划(CTRL+M).

  • 感谢大家的快速回复.手机没有编入索引,但我现在设置它尝试运行查询(使用Union All而不是OR)来查看它是否更快.我将发布我的发现,并希望任何遇到此问题的人也能够解决这个问题. (2认同)

Mar*_*ers 5

首先,您需要列上的索引phone.如果您没有,请添加它.

如果它仍然运行缓慢,您可能会尝试使用UNION ALL而不是OR因为优化器可以更容易地使用它.这是有效的,因为您构建条件的方式可以保证结果不同.因此您的查询可以重写为:

SELECT phonenumber, firstname FROM [PhoneRecords] WHERE phone LIKE '2012042%'
UNION ALL
SELECT phonenumber, firstname FROM [PhoneRecords] WHERE phone LIKE '2012046%'
UNION ALL
SELECT phonenumber, firstname FROM [PhoneRecords] WHERE phone LIKE '2012047%'
UNION ALL
SELECT phonenumber, firstname FROM [PhoneRecords] WHERE phone LIKE '2012083%'
UNION ALL
SELECT phonenumber, firstname FROM [PhoneRecords] WHERE phone LIKE '2012088%'
UNION ALL
SELECT phonenumber, firstname FROM [PhoneRecords] WHERE phone LIKE '2012041%'
Run Code Online (Sandbox Code Playgroud)

此查询应该能够使用索引有效运行.

您应该在运行实际查询之前查看执行计划,并确保没有TABLE SCAN或INDEX SCAN.