Sql-Server-2005

SQL Server 2005 查詢具有多個條件,一些索引,一些不

  • April 13, 2015

我有一張有 5000 萬行的表。它在 zip 上被索引。一個問題

Select * 
from table 
where zip = '12345' 

在大約 2 秒內返回 20,000 行

當我添加一個附加條件時,它會跳轉到 15 分鐘……

Select * 
from table 
where zip = '12345' 
 and otherField = 'Y'

我的期望是 SQL 將使用索引,辨識 20,000 行,然後掃描所有非索引條件。也許最多幾秒鐘。相反,它似乎正在掃描整個數據庫表。

我無法添加另一個索引…我們可能會測試 150 多列,大多數都有 Y/N 值。

有沒有更好的方法來編寫這種類型的查詢?

我可以在伺服器配置中設置錯誤嗎?

謝謝!

有沒有更好的方法來編寫這種類型的查詢?

不,您編寫它的方式是“最佳”方式。當然,除非這種方式行不通。使用聲明式語言的快樂和沮喪是優化器。當它起作用時它是你最好的朋友,當它不起作用時它是你最大的敵人。

讓優化器做正確事情的一種方法是以語義相同的方式重新編寫查詢,例如:

select <whatever>
from table as t
inner join
   (
   Select <primary key columns>
   from table as b
   where b.zip='12345'
   ) as z
   on t.PrimaryKey = z.PrimaryKey  -- repeat if multi-column key
   and t.otherField = 'Y';

現在優化器從不同的地方開始,可能最終得到不同的、更好的答案。但是,對於簡單的單表查詢,我擔心它不太可能顯示出太大的變化。

我只建議您在完全確定您已完成所有索引後嘗試此操作。以非顯而易見的方式重寫查詢會增加應用程序的維護成本。當您修補或升級 SQL Server 時,它也可能會適得其反。

您可以嘗試僅使用 zip 條件選擇臨時表,然後從具有附加條件的臨時表中進行選擇。

SELECT * INTO #MyTemp FROM (SELECT * FROM MyTable where zip='1234') data SELECT * from #MyTemp where other = 'Y' DROP Table #MyTemp

不確定這是否會更快,但由於僅 zip 查詢執行速度很快,因此您只需對 20,000 條記錄執行第二個查詢。這是否OK可能取決於一行中有多少數據,伺服器有多少記憶體,tempdb所在的磁碟有多快等等。無論如何都容易嘗試。

引用自:https://dba.stackexchange.com/questions/97610