我有一个奇怪的问题。
我正在运行一个查询:
SELECT IMIE, NAZWISKO, PESEL2, ADD_DATE, CONVERT(varchar, ADD_DATE, 121) AS XDATA, ID_ZLECENIA_XXX, * FROM XXX_KONWERSJE_HISTORIA AS EKH1
INNER JOIN XXX_DANE_PACJENTA EDP1 ON EKH1.ID_ZLECENIA_XXX=EDP1.ORDER_ID_XXX
WHERE EKH1.ID_KONWERSJE = (
SELECT MIN(ID_KONWERSJE)
FROM XXX_KONWERSJE_HISTORIA AS EKH2
WHERE EKH1.ID_ZLECENIA_XXX = EKH2.ID_ZLECENIA_XXX
)
AND EDP1.RECNO = (
SELECT MAX(RECNO)
FROM XXX_DANE_PACJENTA EDP2
WHERE EDP2.ORDER_ID_XXX = EDP1.ORDER_ID_XXX
)
AND EKH1.ID_ZLECENIA_XXX LIKE '%140000393%'
AND ADD_DATE>'20140419' AND ADD_DATE<='20140621 23:59:59.999'
ORDER BY EKH1.ID_KONWERSJE, EKH1.ID_ZLECENIA_XXX DESC
如果我使用2个月左右的日期限制(63天-它给我1015个结果),则查询正常。如果我延长日期限制,查询只会失败(查询失败等等)。
这是在Windows 64位php(Apache,Xamp)下发生的。
当我直接从MS SQL SERWER Management Studio运行此查询时,无论我选择什么日期限制,一切都可以正常工作。
到底是怎么回事?在apache / php下有某种限制吗?(没有“查询时间超出”之类的信息,只有“查询失败”之类的信息)
如果我使用2个月左右的日期限制(63天-它给我1015个结果),则查询正常。如果我延长日期限制,查询只会失败(查询失败等等)。... 到底是怎么回事?在apache / php下有某种限制吗?(没有“查询时间超出”之类的信息,只有“查询失败”之类的信息)
之所以会发生这种情况,ADD_DATE>'20140419' AND ADD_DATE<='20140621 23:59:59.999'
是因为的选择性中等/低(满足该谓词的行太多)并且SQL Server必须扫描(是,扫描)XXX_KONWERSJE_HISTORIA
很多次才能检查以下谓词:
WHERE EKH1.ID_KONWERSJE = (
SELECT ...
FROM XXX_KONWERSJE_HISTORIA AS EKH2
WHERE EKH1.ID_ZLECENIA_XXX = EKH2.ID_ZLECENIA_XXX
)
必须扫描SQL ServerXXX_KONWERSJE_HISTORIA
表多少次才能验证此谓词?您可以查看Table Scan [XXX_KONWERSJE_HISTORIA]
数据访问运算符的属性:3917次
您一开始可以做什么?您应该创建丢失的索引(请参阅执行计划上方带有绿色的警告):
USE [OptimedMain]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[ERLAB_KONWERSJE_HISTORIA] ([ID_ZLECENIA_ERLAB])
INCLUDE ([ID_KONWERSJE])
GO
当我直接从MS SQL SERWER Management Studio运行此查询时,无论我选择什么日期限制,一切都可以正常工作。
默认情况下,SQL Server Management Studio的执行超时设置为0(无执行超时)。
注意:如果此索引可以解决问题,则应尝试(1)在ADD_DATE
所有必需的(CREATE INDEX ... INCLUDE(...)
)列上创建索引,以及(2)在这些表上创建唯一的聚集索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句