我有一个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.我显然拥有执行此类查询所需的计算机能力,但查询仍然需要很长时间.
您可能错过了phonenumber列的索引.
CREATE INDEX IX_PHONERECORDS_PHONENUMBER_FIRSTNAME
ON dbo.PhoneRecords (PhoneNumber) INCLUDE (FirstName)
Run Code Online (Sandbox Code Playgroud)
如果这没有帮助,请发布执行计划(CTRL+M).
首先,您需要列上的索引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.
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |